diff options
Diffstat (limited to 'challenge-070')
| -rwxr-xr-x | challenge-070/mohammad-anwar/perl/ch-1.pl | 32 | ||||
| -rwxr-xr-x | challenge-070/mohammad-anwar/perl/ch-1a.pl | 29 | ||||
| -rwxr-xr-x | challenge-070/mohammad-anwar/perl/ch-2.pl | 45 | ||||
| -rwxr-xr-x | challenge-070/mohammad-anwar/perl/ch-2a.pl | 52 |
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))); +} |
