aboutsummaryrefslogtreecommitdiff
path: root/challenge-055/mohammad-anwar
diff options
context:
space:
mode:
Diffstat (limited to 'challenge-055/mohammad-anwar')
-rw-r--r--challenge-055/mohammad-anwar/blog.txt1
-rw-r--r--challenge-055/mohammad-anwar/perl/ch-1.pl2
-rw-r--r--challenge-055/mohammad-anwar/perl/ch-2.pl44
-rw-r--r--challenge-055/mohammad-anwar/perl/ch-2a.pl54
-rw-r--r--challenge-055/mohammad-anwar/raku/ch-2.p644
-rw-r--r--challenge-055/mohammad-anwar/raku/ch-2a.p647
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;
+}