diff options
Diffstat (limited to 'challenge-055/mohammad-anwar')
| -rw-r--r-- | challenge-055/mohammad-anwar/blog.txt | 1 | ||||
| -rw-r--r-- | challenge-055/mohammad-anwar/perl/ch-1.pl | 2 | ||||
| -rw-r--r-- | challenge-055/mohammad-anwar/perl/ch-2.pl | 44 | ||||
| -rw-r--r-- | challenge-055/mohammad-anwar/perl/ch-2a.pl | 54 | ||||
| -rw-r--r-- | challenge-055/mohammad-anwar/raku/ch-2.p6 | 44 | ||||
| -rw-r--r-- | challenge-055/mohammad-anwar/raku/ch-2a.p6 | 47 |
6 files changed, 191 insertions, 1 deletions
diff --git a/challenge-055/mohammad-anwar/blog.txt b/challenge-055/mohammad-anwar/blog.txt new file mode 100644 index 0000000000..cec66e9fda --- /dev/null +++ b/challenge-055/mohammad-anwar/blog.txt @@ -0,0 +1 @@ +https://perlweeklychallenge.org/blog/weekly-challenge-055 diff --git a/challenge-055/mohammad-anwar/perl/ch-1.pl b/challenge-055/mohammad-anwar/perl/ch-1.pl index 698f8ec222..62cd6d2986 100644 --- a/challenge-055/mohammad-anwar/perl/ch-1.pl +++ b/challenge-055/mohammad-anwar/perl/ch-1.pl @@ -3,7 +3,7 @@ use strict; use warnings; -my $binary_str = $ARGV[0]; +my $binary_str = $ARGV[0] // "101"; print "$binary_str => ", flip_binary($binary_str), "\n"; diff --git a/challenge-055/mohammad-anwar/perl/ch-2.pl b/challenge-055/mohammad-anwar/perl/ch-2.pl new file mode 100644 index 0000000000..698d68671d --- /dev/null +++ b/challenge-055/mohammad-anwar/perl/ch-2.pl @@ -0,0 +1,44 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +use Algorithm::Combinatorics qw(permutations); + +my $N = $ARGV[0] // 4; + +my $wave = fetch_wave_array($N); +map { print sprintf("[%s]\n", join(",", @$_)) } @$wave; + +sub fetch_wave_array { + my ($N) = @_; + + die "ERROR: Invalid array size [$N]\n" unless ($N =~ /^\d+$/ && $N > 0); + + my $iter = permutations([ 1..$N ]); + my $wave = []; + while (my $array = $iter->next) { + push @$wave, $array if is_wave($array); + } + + return $wave; +} + +sub is_wave { + my ($array) = @_; + + my $is_wave = 1; + foreach my $i (1..$#$array) { + ($i % 2) + ? + ($array->[$i] <= $array->[$i-1]) + : + ($array->[$i] >= $array->[$i-1]) + and next; + + $is_wave = 0; + last; + } + + return $is_wave; +} diff --git a/challenge-055/mohammad-anwar/perl/ch-2a.pl b/challenge-055/mohammad-anwar/perl/ch-2a.pl new file mode 100644 index 0000000000..109bcc116a --- /dev/null +++ b/challenge-055/mohammad-anwar/perl/ch-2a.pl @@ -0,0 +1,54 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +use Test::More; +use Test::Deep; +use Algorithm::Combinatorics qw(permutations); + +my $unit_tests = { + 1 => [ [1] ], + 2 => [ [2,1] ], + 3 => [ [2,1,3], [3,1,2] ], + 4 => [ [2,1,4,3], [3,1,4,2], [3,2,4,1], [4,1,3,2], [4,2,3,1] ], +}; + +foreach my $size (sort { $a <=> $b } keys %$unit_tests) { + cmp_deeply(fetch_wave_array($size), $unit_tests->{$size}, "array size $size."); +} + +done_testing; + +sub fetch_wave_array { + my ($N) = @_; + + die "ERROR: Invalid array size [$N]\n" unless ($N =~ /^\d+$/ && $N > 0); + + my $iter = permutations([ 1..$N ]); + my $wave = []; + while (my $array = $iter->next) { + push @$wave, $array if is_wave($array); + } + + return $wave; +} + +sub is_wave { + my ($array) = @_; + + my $is_wave = 1; + foreach my $i (1..$#$array) { + ($i % 2) + ? + ($array->[$i] <= $array->[$i-1]) + : + ($array->[$i] >= $array->[$i-1]) + and next; + + $is_wave = 0; + last; + } + + return $is_wave; +} diff --git a/challenge-055/mohammad-anwar/raku/ch-2.p6 b/challenge-055/mohammad-anwar/raku/ch-2.p6 new file mode 100644 index 0000000000..d15c8cbf96 --- /dev/null +++ b/challenge-055/mohammad-anwar/raku/ch-2.p6 @@ -0,0 +1,44 @@ +#!/usr/bin/env perl6 + +use v6.c; + +multi sub MAIN(*@) is hidden-from-USAGE { + say $*USAGE; + say "\nERROR: Invalid array size !!!"; +} + +multi sub MAIN(Int :$N = 4) { + my @wave = fetch-wave-array($N); + @wave.map({ print sprintf("[%s]\n", join(",", @$_)) }); +} + +sub fetch-wave-array($size) { + die "ERROR: Invalid array size [$size]\n" + unless ($size ~~ /^\d+$/ && $size > 0); + + my @N = (1 .. $size).permutations(); + my @wave = (); + for @N -> @array { + push @wave, @array if is-wave(@array); + } + + return @wave; +} + +sub is-wave(@array) { + + my $is-wave = 1; + for 1 .. @array.elems-1 -> $i { + ($i mod 2 == 1) + ?? + (@array[$i] <= @array[$i-1]) + !! + (@array[$i] >= @array[$i-1]) + and next; + + $is-wave = 0; + last; + } + + return $is-wave; +} diff --git a/challenge-055/mohammad-anwar/raku/ch-2a.p6 b/challenge-055/mohammad-anwar/raku/ch-2a.p6 new file mode 100644 index 0000000000..d49567bc31 --- /dev/null +++ b/challenge-055/mohammad-anwar/raku/ch-2a.p6 @@ -0,0 +1,47 @@ +#!/usr/bin/env perl6 + +use Test; + +my $unit-tests = :{ + 1 => [ (1,), ], + 2 => [ (2,1), ], + 3 => [ (2,1,3), (3,1,2) ], + 4 => [ (2,1,4,3), (3,1,4,2), (3,2,4,1), (4,1,3,2), (4,2,3,1) ] +}; + +for $unit-tests.keys.sort -> $size { + is-deeply(fetch-wave-array($size), $unit-tests{$size}, "array size $size"); +} + +done-testing; + +sub fetch-wave-array($size) { + die "ERROR: Invalid array size [$size]\n" + unless ($size ~~ /^\d+$/ && $size > 0); + + my @N = (1 .. $size).permutations(); + my $wave = []; + for @N -> @array { + push @$wave, @array if is-wave(@array); + } + + return $wave; +} + +sub is-wave(@array) { + + my $is-wave = 1; + for 1 .. @array.elems-1 -> $i { + ($i mod 2 == 1) + ?? + (@array[$i] <= @array[$i-1]) + !! + (@array[$i] >= @array[$i-1]) + and next; + + $is-wave = 0; + last; + } + + return $is-wave; +} |
