diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2020-04-13 00:15:16 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-04-13 00:15:16 +0100 |
| commit | fe1dacc3538bbe49b22bb4d95800633e1dae83fa (patch) | |
| tree | 0767a1392a734f29517dc05e3f78c3f2ede11669 | |
| parent | b78b30835c0096940cd7dcdc0b3c71929e55d412 (diff) | |
| parent | d2dbde65fb8af8744c78ceeb39e523b7b7fe1468 (diff) | |
| download | perlweeklychallenge-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/README | 1 | ||||
| -rwxr-xr-x | challenge-055/jaredor/perl/ch-1.pl | 46 | ||||
| -rwxr-xr-x | challenge-055/jaredor/perl/ch-2.pl | 73 |
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" ); +} + |
