aboutsummaryrefslogtreecommitdiff
path: root/challenge-070
diff options
context:
space:
mode:
Diffstat (limited to 'challenge-070')
-rwxr-xr-xchallenge-070/mohammad-anwar/perl/ch-1.pl32
-rwxr-xr-xchallenge-070/mohammad-anwar/perl/ch-1a.pl29
-rwxr-xr-xchallenge-070/mohammad-anwar/perl/ch-2.pl45
-rwxr-xr-xchallenge-070/mohammad-anwar/perl/ch-2a.pl52
4 files changed, 158 insertions, 0 deletions
diff --git a/challenge-070/mohammad-anwar/perl/ch-1.pl b/challenge-070/mohammad-anwar/perl/ch-1.pl
new file mode 100755
index 0000000000..c425cf29ae
--- /dev/null
+++ b/challenge-070/mohammad-anwar/perl/ch-1.pl
@@ -0,0 +1,32 @@
+#!/usr/bin/perl
+
+#
+# Perl Weekly Challenge - 070
+#
+# Task #1: Character Swapping
+#
+# https://perlweeklychallenge.org/blog/perl-weekly-challenge-070
+#
+
+use strict;
+use warnings;
+
+my $S = $ARGV[0] || 'perlandraku';
+my $C = $ARGV[1] || 3;
+my $O = $ARGV[2] || 4;
+
+print sprintf("%s => %s\n", $S, swap($S, $C, $O));
+
+sub swap {
+ my ($string, $count, $offset) = @_;
+
+ my $length = length($string);
+ my @array = split //, $string;
+ foreach my $i (1..$count) {
+ my $a = $i % $length;
+ my $b = ($i + $offset) % $length;
+ ($array[$a], $array[$b]) = ($array[$b], $array[$a]);
+ }
+
+ return join '', @array;
+}
diff --git a/challenge-070/mohammad-anwar/perl/ch-1a.pl b/challenge-070/mohammad-anwar/perl/ch-1a.pl
new file mode 100755
index 0000000000..a84a6d8078
--- /dev/null
+++ b/challenge-070/mohammad-anwar/perl/ch-1a.pl
@@ -0,0 +1,29 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More;
+
+is(swap('perlandraku', 3, 4),
+ 'pndraerlaku',
+ 'testing perlandraku.');
+is(swap('weeklychallenge', 5, 2),
+ 'wklycheeallenge',
+ 'testing weeklychallenge.');
+
+done_testing;
+
+sub swap {
+ my ($string, $count, $offset) = @_;
+
+ my $length = length($string);
+ my @array = split //, $string;
+ foreach my $i (1..$count) {
+ my $a = $i % $length;
+ my $b = ($i + $offset) % $length;
+ ($array[$a], $array[$b]) = ($array[$b], $array[$a]);
+ }
+
+ return join '', @array;
+}
diff --git a/challenge-070/mohammad-anwar/perl/ch-2.pl b/challenge-070/mohammad-anwar/perl/ch-2.pl
new file mode 100755
index 0000000000..e18b5a9de6
--- /dev/null
+++ b/challenge-070/mohammad-anwar/perl/ch-2.pl
@@ -0,0 +1,45 @@
+#!/usr/bin/perl
+
+#
+# Perl Weekly Challenge - 070
+#
+# Task #2: Gray Code Sequence
+#
+# https://perlweeklychallenge.org/blog/perl-weekly-challenge-070
+#
+
+use strict;
+use warnings;
+
+my $N = $ARGV[0] || 3;
+
+print sprintf("%d-bit Gray Code Sequence:\n[%s]\n",
+ $N, join ', ', generate_gray_code_sequence($N));
+
+sub generate_gray_code_sequence {
+ my ($n) = @_;
+
+ my %S = (
+ 2 => ['00', '01', '11', '10'],
+ );
+
+ foreach my $i (3 .. $n) {
+ my $S1 = $S{$i - 1};
+ my $S2 = [ reverse @$S1 ];
+ $_ = '0' . $_ foreach @$S1;
+ $_ = '1' . $_ foreach @$S2;
+ $S{$i} = [ @$S1, @$S2 ];
+ }
+
+ my @gray_codes = ();
+ push @gray_codes, bin2dec($_) foreach (@{$S{$n}});
+
+ return @gray_codes;
+}
+
+# Borrowed from Perl Cookbook
+# https://www.oreilly.com/library/view/perl-cookbook/1565922433/ch02s05.html
+
+sub bin2dec {
+ return unpack("N", pack("B32", substr("0" x 32 . shift, -32)));
+}
diff --git a/challenge-070/mohammad-anwar/perl/ch-2a.pl b/challenge-070/mohammad-anwar/perl/ch-2a.pl
new file mode 100755
index 0000000000..dcbb7654f8
--- /dev/null
+++ b/challenge-070/mohammad-anwar/perl/ch-2a.pl
@@ -0,0 +1,52 @@
+#!/usr/bin/perl
+
+#
+# Perl Weekly Challenge - 070
+#
+# Task #2: Gray Code Sequence
+#
+# https://perlweeklychallenge.org/blog/perl-weekly-challenge-070
+#
+
+use strict;
+use warnings;
+
+use Test::More;
+use Test::Deep;
+
+is_deeply( [ generate_gray_code_sequence(3) ],
+ [ 0, 1, 3, 2, 6, 7, 5, 4 ],
+ 'testing 3-bit gray code sequence' );
+is_deeply( [ generate_gray_code_sequence(4) ],
+ [ 0, 1, 3, 2, 6, 7, 5, 4, 12, 13, 15, 14, 10, 11, 9, 8 ],
+ 'testing 4-bit gray code sequence' );
+
+done_testing;
+
+sub generate_gray_code_sequence {
+ my ($n) = @_;
+
+ my %S = (
+ 2 => ['00', '01', '11', '10'],
+ );
+
+ foreach my $i (3 .. $n) {
+ my $S1 = $S{$i - 1};
+ my $S2 = [ reverse @$S1 ];
+ $_ = '0' . $_ foreach @$S1;
+ $_ = '1' . $_ foreach @$S2;
+ $S{$i} = [ @$S1, @$S2 ];
+ }
+
+ my @gray_codes = ();
+ push @gray_codes, bin2dec($_) foreach (@{$S{$n}});
+
+ return @gray_codes;
+}
+
+# Borrowed from Perl Cookbook
+# https://www.oreilly.com/library/view/perl-cookbook/1565922433/ch02s05.html
+
+sub bin2dec {
+ return unpack("N", pack("B32", substr("0" x 32 . shift, -32)));
+}