aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2020-04-13 00:15:16 +0100
committerGitHub <noreply@github.com>2020-04-13 00:15:16 +0100
commitfe1dacc3538bbe49b22bb4d95800633e1dae83fa (patch)
tree0767a1392a734f29517dc05e3f78c3f2ede11669
parentb78b30835c0096940cd7dcdc0b3c71929e55d412 (diff)
parentd2dbde65fb8af8744c78ceeb39e523b7b7fe1468 (diff)
downloadperlweeklychallenge-club-fe1dacc3538bbe49b22bb4d95800633e1dae83fa.tar.gz
perlweeklychallenge-club-fe1dacc3538bbe49b22bb4d95800633e1dae83fa.tar.bz2
perlweeklychallenge-club-fe1dacc3538bbe49b22bb4d95800633e1dae83fa.zip
Merge pull request #1562 from jaredor/new-branch
update to ch-2.pl
-rw-r--r--challenge-055/jaredor/README1
-rwxr-xr-xchallenge-055/jaredor/perl/ch-1.pl46
-rwxr-xr-xchallenge-055/jaredor/perl/ch-2.pl73
3 files changed, 120 insertions, 0 deletions
diff --git a/challenge-055/jaredor/README b/challenge-055/jaredor/README
new file mode 100644
index 0000000000..398fcc9bae
--- /dev/null
+++ b/challenge-055/jaredor/README
@@ -0,0 +1 @@
+Solution by Jared Martin
diff --git a/challenge-055/jaredor/perl/ch-1.pl b/challenge-055/jaredor/perl/ch-1.pl
new file mode 100755
index 0000000000..c548450d8c
--- /dev/null
+++ b/challenge-055/jaredor/perl/ch-1.pl
@@ -0,0 +1,46 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use List::Util qw(sum max);
+use List::MoreUtils qw(indexes);
+
+my $binstr = $ARGV[0];
+
+die "Need a string of 0s and 1s, not this: -->$binstr<--\n"
+ if $binstr !~ /\A [01]+ \Z/xms;
+
+my ( $begstr, $midstr, $endstr ) = ( $binstr, '', '' );
+( $begstr, $midstr, $endstr ) = ( $binstr =~ /\A(1*)(.*0)(1*)\Z/xms )
+ if $binstr =~ /0/;
+
+my $i = 0;
+my @groups =
+ map { ( /0/ ? 1 : -1 ) * length($_) }
+ grep { $i = !$i } ( $midstr =~ /((.)\g{-1}*)/g );
+
+my ( $L, $max ) = ( length($begstr), 0 );
+my @answers;
+while (@groups) {
+ my $total = 0;
+ my @tot = map { $total += $_ } @groups; # List::Util reductions
+ $max = max( $max, max @tot );
+ for my $idx (indexes { $_ == $max } @tot) {
+ my $R = -1 + sum map { abs $_ } $L, @groups[ 0 .. $idx ];
+ push @answers, [ $L, $R, $max];
+ }
+ $L += sum map { abs $_ } splice(@groups, 0, 2);
+}
+@answers = grep { pop @$_ == $max } @answers;
+
+my $header1 = "INPUT STRING : $binstr";
+print "\n$header1\n\n";
+
+my $header2 = 'Maximal Flip Pairs';
+print "$header2\n", '.' x length $header2, "\n";
+print "NONE\n" unless @answers;
+
+while (@answers) {
+ my ( $L, $R, $flipped, ) = (@{ shift @answers }, $binstr);
+ substr( $flipped, $L, $R - $L + 1 ) =~ tr/01/10/;
+ print "(L=$L, R=$R) : $flipped\n";
+}
diff --git a/challenge-055/jaredor/perl/ch-2.pl b/challenge-055/jaredor/perl/ch-2.pl
new file mode 100755
index 0000000000..bd2b44c382
--- /dev/null
+++ b/challenge-055/jaredor/perl/ch-2.pl
@@ -0,0 +1,73 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use List::Util qw(sum max);
+use List::MoreUtils qw(indexes);
+
+# Command line input:
+#
+# EITHER:
+# * One string of the form, '[ ###, ###, ..., ### ]'
+# Where brackets are optional and the numbers just
+# need to be space or comma delimited.
+#
+# * A list of numeric arguments.
+#
+my @narray;
+if ( @ARGV == 1 ) {
+ my $str = $ARGV[0];
+ $str =~ tr/][,/ /;
+ @narray = sort { $b <=> $a } grep { /\A -? \d* \.? \d+ \Z/xms } split /\s+/,
+ $str;
+}
+else {
+ @narray = sort { $b <=> $a } @ARGV;
+}
+
+sub foo {
+ my ( $so_far, $pick_from, $the_rest ) = @_;
+ my @so_far = @$so_far;
+ my @pick_from = @$pick_from;
+ my @the_rest = @$the_rest;
+ if ( @pick_from == 0 ) {
+ print( '[', join( ', ', @so_far ), "]\n" ) unless @the_rest;
+ return;
+ }
+ else {
+ for my $i ( 0 .. $#pick_from ) {
+ my @tmp_so_far = @so_far;
+ my @tmp_pick_from = @pick_from;
+ my @tmp_the_rest = @the_rest;
+ push @tmp_so_far, $pick_from[$i];
+ my @pick_from_prev = @pick_from[ 0 .. $i ];
+ pop @pick_from_prev;
+ my @pick_from_post = @pick_from[ $i .. $#pick_from ];
+ shift @pick_from_post;
+ foo(
+ [@tmp_so_far],
+ [ reverse( @pick_from_post, @tmp_the_rest ) ],
+ [ reverse @pick_from_prev ],
+ );
+ }
+ }
+}
+
+if ( @narray > 1 ) {
+ for my $i ( 0 .. ( $#narray - 1 ) ) {
+ next if $i > 0 and $narray[$i] == $narray[ $i - 1 ];
+ my @so_far = ( $narray[$i], );
+ my @pick_from_prev = @narray[ 0 .. $i ];
+ pop @pick_from_prev;
+ my @pick_from_post = @narray[ $i .. $#narray ];
+ shift @pick_from_post;
+ foo(
+ [@so_far],
+ [ reverse @pick_from_post ],
+ [ reverse @pick_from_prev ],
+ );
+ }
+}
+else {
+ print( '[', join( ', ', @narray ), "]\n" );
+}
+