diff options
| author | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2020-07-25 01:57:46 +0100 |
|---|---|---|
| committer | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2020-07-25 01:57:46 +0100 |
| commit | 87106c1e85af6f8badcfa08c41442f01fa9f5b8e (patch) | |
| tree | 14c9a162dcafd47a1c64ff6ecdca0410f442a7a7 /challenge-070 | |
| parent | 62f1563a6c3108747a9b950e784f1419aebdf253 (diff) | |
| download | perlweeklychallenge-club-87106c1e85af6f8badcfa08c41442f01fa9f5b8e.tar.gz perlweeklychallenge-club-87106c1e85af6f8badcfa08c41442f01fa9f5b8e.tar.bz2 perlweeklychallenge-club-87106c1e85af6f8badcfa08c41442f01fa9f5b8e.zip | |
- Added solutions by Arne Sommer.
Diffstat (limited to 'challenge-070')
| -rw-r--r-- | challenge-070/arne-sommer/blog.txt | 1 | ||||
| -rwxr-xr-x | challenge-070/arne-sommer/node/ch-2.js | 62 | ||||
| -rwxr-xr-x | challenge-070/arne-sommer/node/gray-code-seq-node | 62 | ||||
| -rwxr-xr-x | challenge-070/arne-sommer/perl/ch-1.pl | 32 | ||||
| -rwxr-xr-x | challenge-070/arne-sommer/perl/ch-2.pl | 48 | ||||
| -rwxr-xr-x | challenge-070/arne-sommer/perl/charswap-perl | 32 | ||||
| -rwxr-xr-x | challenge-070/arne-sommer/perl/gray-code-seq-perl | 48 | ||||
| -rwxr-xr-x | challenge-070/arne-sommer/raku/ch-1.raku | 18 | ||||
| -rwxr-xr-x | challenge-070/arne-sommer/raku/ch-2.raku | 34 | ||||
| -rwxr-xr-x | challenge-070/arne-sommer/raku/charswap | 18 | ||||
| -rwxr-xr-x | challenge-070/arne-sommer/raku/charswap-mod | 25 | ||||
| -rwxr-xr-x | challenge-070/arne-sommer/raku/charswap-node | 38 | ||||
| -rwxr-xr-x | challenge-070/arne-sommer/raku/charswap-sans-mod | 24 | ||||
| -rwxr-xr-x | challenge-070/arne-sommer/raku/gray-code-seq | 34 |
14 files changed, 476 insertions, 0 deletions
diff --git a/challenge-070/arne-sommer/blog.txt b/challenge-070/arne-sommer/blog.txt new file mode 100644 index 0000000000..2058e9e780 --- /dev/null +++ b/challenge-070/arne-sommer/blog.txt @@ -0,0 +1 @@ +https://raku-musings.com/gray-swapping.html diff --git a/challenge-070/arne-sommer/node/ch-2.js b/challenge-070/arne-sommer/node/ch-2.js new file mode 100755 index 0000000000..c3e831c06f --- /dev/null +++ b/challenge-070/arne-sommer/node/ch-2.js @@ -0,0 +1,62 @@ +#! /usr/bin/env node + +var N = process.argv[2] || 3; + +var verbose = false; + +if (N == '--verbose') +{ + verbose = true; + N = process.argv[3] || 3; +} + +let die = (message) => { + console.log(message); + process.kill(process.pid); +}; + +var NN = parseInt(N); + +if (NN != N || NN < 2 || NN > 5) + die('N: Integer 2,3,4,5 only'); + +var sequence = [0,1,3,2]; + +let asBinary = (value, length) => { + var binary = value.toString(2); + + while (binary.length < length) + binary = "0" + binary; + + return binary; +} + +let generate2bgcs = (array, level) => { + var S1a = array.map(x => asBinary(x,level-1) ); + var S2a = S1a.slice(); S2a.reverse(); + var S1 = S1a.map(x => '0' + x); + var S2 = S2a.map(x => '1' + x); + var S3 = S1; for (x of S2) { S3.push(x); } + var out = S3.map( x => parseInt(x, 2) ); + + if (verbose) + { + console.log(': in: ' + array); + console.log(': a) S1 = ' + S1a); + console.log(': b) S2 = ' + S2a); + console.log(': c) S1 = ' + S1); + console.log(': d) S2 = ' + S2); + console.log(': e) S3 = ' + S3); + console.log(': out: ' + out); + } + + return out; +} + +for (level = 3; level <= NN; level++) +{ + sequence = generate2bgcs(sequence, level); +} + +console.log(sequence); + diff --git a/challenge-070/arne-sommer/node/gray-code-seq-node b/challenge-070/arne-sommer/node/gray-code-seq-node new file mode 100755 index 0000000000..c3e831c06f --- /dev/null +++ b/challenge-070/arne-sommer/node/gray-code-seq-node @@ -0,0 +1,62 @@ +#! /usr/bin/env node + +var N = process.argv[2] || 3; + +var verbose = false; + +if (N == '--verbose') +{ + verbose = true; + N = process.argv[3] || 3; +} + +let die = (message) => { + console.log(message); + process.kill(process.pid); +}; + +var NN = parseInt(N); + +if (NN != N || NN < 2 || NN > 5) + die('N: Integer 2,3,4,5 only'); + +var sequence = [0,1,3,2]; + +let asBinary = (value, length) => { + var binary = value.toString(2); + + while (binary.length < length) + binary = "0" + binary; + + return binary; +} + +let generate2bgcs = (array, level) => { + var S1a = array.map(x => asBinary(x,level-1) ); + var S2a = S1a.slice(); S2a.reverse(); + var S1 = S1a.map(x => '0' + x); + var S2 = S2a.map(x => '1' + x); + var S3 = S1; for (x of S2) { S3.push(x); } + var out = S3.map( x => parseInt(x, 2) ); + + if (verbose) + { + console.log(': in: ' + array); + console.log(': a) S1 = ' + S1a); + console.log(': b) S2 = ' + S2a); + console.log(': c) S1 = ' + S1); + console.log(': d) S2 = ' + S2); + console.log(': e) S3 = ' + S3); + console.log(': out: ' + out); + } + + return out; +} + +for (level = 3; level <= NN; level++) +{ + sequence = generate2bgcs(sequence, level); +} + +console.log(sequence); + diff --git a/challenge-070/arne-sommer/perl/ch-1.pl b/challenge-070/arne-sommer/perl/ch-1.pl new file mode 100755 index 0000000000..b28433a0d9 --- /dev/null +++ b/challenge-070/arne-sommer/perl/ch-1.pl @@ -0,0 +1,32 @@ +#! /usr/bin/env perl + +use strict; +use feature 'say'; + +my $verbose = 0; + +if (@ARGV && $ARGV[0] eq "--verbose") +{ + $verbose = 1; + shift(@ARGV); +} + +my $S = shift(@ARGV) // 'perlandraku'; +my $N = length $S; +my $O = shift(@ARGV) // 4; +my $C = shift(@ARGV) // 3; + +die '$O: Integer >= 1 only' unless int $O == $O; +die '$C: Integer >= 1 only' unless int $C == $C; +die '$C: Must be < $O' unless $C < $O; +die '$C + $O: Must be <= $N' unless $C + $O <= $N; + +for my $index (1 .. $C) +{ + say "swap $index: " . substr($S, $index, 1) . " <-> " . substr($S, $index + $O, 1) . " == $S" if $verbose; + + (substr($S, $index,1), substr($S, $index + $O,1) ) = + (substr($S, $index + $O, 1), substr($S, $index, 1)); +} + +say $S; diff --git a/challenge-070/arne-sommer/perl/ch-2.pl b/challenge-070/arne-sommer/perl/ch-2.pl new file mode 100755 index 0000000000..62ed872faa --- /dev/null +++ b/challenge-070/arne-sommer/perl/ch-2.pl @@ -0,0 +1,48 @@ +#! /usr/bin/env perl + +use strict; +use feature 'say'; +use feature 'signatures'; +no warnings 'experimental::signatures'; + +my $verbose = 0; + +if (@ARGV && $ARGV[0] eq "--verbose") +{ + $verbose = 1; + shift(@ARGV); +} + +my $N = shift(@ARGV) // 3; + +die '$N out of range (2..5)' unless 2 <= $N && $N <=5; + +my @sequence = (0,1,3,2); + +for my $level (3 .. $N) +{ + @sequence = generate2bgcs($level, $verbose, @sequence); +} + +say "[" . join(", ", @sequence) . "]"; + +sub generate2bgcs ($level, $verbose, @in) +{ + my @S1a = map { sprintf('%0' . ($level-1) . 'b', $_) } @in; + my @S2a = reverse @S1a; + my @S1 = map { "0$_" } @S1a; + my @S2 = map { "1$_" } @S2a; + my @S3 = (@S1, @S2); + my @out = map { oct("0b$_") } @S3; + + if ($verbose) + { + say ": a) S1 = [" . join(", ", @S1a) ."]"; + say ": b) S2 = [" . join(", ", @S2a) ."]"; + say ": c) S1 = [" . join(", ", @S1) ."]"; + say ": b) S2 = [" . join(", ", @S2) ."]"; + say ": e) S3 = [" . join(", ", @S3) ."]"; + say ": \$N=$level = [" . join(", ", @out) . "]"; + } + return @out; +} diff --git a/challenge-070/arne-sommer/perl/charswap-perl b/challenge-070/arne-sommer/perl/charswap-perl new file mode 100755 index 0000000000..b28433a0d9 --- /dev/null +++ b/challenge-070/arne-sommer/perl/charswap-perl @@ -0,0 +1,32 @@ +#! /usr/bin/env perl + +use strict; +use feature 'say'; + +my $verbose = 0; + +if (@ARGV && $ARGV[0] eq "--verbose") +{ + $verbose = 1; + shift(@ARGV); +} + +my $S = shift(@ARGV) // 'perlandraku'; +my $N = length $S; +my $O = shift(@ARGV) // 4; +my $C = shift(@ARGV) // 3; + +die '$O: Integer >= 1 only' unless int $O == $O; +die '$C: Integer >= 1 only' unless int $C == $C; +die '$C: Must be < $O' unless $C < $O; +die '$C + $O: Must be <= $N' unless $C + $O <= $N; + +for my $index (1 .. $C) +{ + say "swap $index: " . substr($S, $index, 1) . " <-> " . substr($S, $index + $O, 1) . " == $S" if $verbose; + + (substr($S, $index,1), substr($S, $index + $O,1) ) = + (substr($S, $index + $O, 1), substr($S, $index, 1)); +} + +say $S; diff --git a/challenge-070/arne-sommer/perl/gray-code-seq-perl b/challenge-070/arne-sommer/perl/gray-code-seq-perl new file mode 100755 index 0000000000..62ed872faa --- /dev/null +++ b/challenge-070/arne-sommer/perl/gray-code-seq-perl @@ -0,0 +1,48 @@ +#! /usr/bin/env perl + +use strict; +use feature 'say'; +use feature 'signatures'; +no warnings 'experimental::signatures'; + +my $verbose = 0; + +if (@ARGV && $ARGV[0] eq "--verbose") +{ + $verbose = 1; + shift(@ARGV); +} + +my $N = shift(@ARGV) // 3; + +die '$N out of range (2..5)' unless 2 <= $N && $N <=5; + +my @sequence = (0,1,3,2); + +for my $level (3 .. $N) +{ + @sequence = generate2bgcs($level, $verbose, @sequence); +} + +say "[" . join(", ", @sequence) . "]"; + +sub generate2bgcs ($level, $verbose, @in) +{ + my @S1a = map { sprintf('%0' . ($level-1) . 'b', $_) } @in; + my @S2a = reverse @S1a; + my @S1 = map { "0$_" } @S1a; + my @S2 = map { "1$_" } @S2a; + my @S3 = (@S1, @S2); + my @out = map { oct("0b$_") } @S3; + + if ($verbose) + { + say ": a) S1 = [" . join(", ", @S1a) ."]"; + say ": b) S2 = [" . join(", ", @S2a) ."]"; + say ": c) S1 = [" . join(", ", @S1) ."]"; + say ": b) S2 = [" . join(", ", @S2) ."]"; + say ": e) S3 = [" . join(", ", @S3) ."]"; + say ": \$N=$level = [" . join(", ", @out) . "]"; + } + return @out; +} diff --git a/challenge-070/arne-sommer/raku/ch-1.raku b/challenge-070/arne-sommer/raku/ch-1.raku new file mode 100755 index 0000000000..459d0da9af --- /dev/null +++ b/challenge-070/arne-sommer/raku/ch-1.raku @@ -0,0 +1,18 @@ +#! /usr/bin/env raku + +subset PosInt of Int where * >= 1; + +unit sub MAIN (:$S is copy = 'perlandraku', + PosInt :$O = 4, + PosInt :$C where $C < $O && $C + $O <= $S.chars = 3, + :$v, :$verbose = $v); + +for 1 .. $C -> $index +{ + say "swap $index: { $S.substr($index, 1) } <-> { $S.substr($index + $O, 1) } == $S" if $verbose; + + ($S.substr-rw($index,1), $S.substr-rw($index + $O,1) ) = + ($S.substr($index + $O, 1), $S.substr($index, 1)); +} + +say $S; diff --git a/challenge-070/arne-sommer/raku/ch-2.raku b/challenge-070/arne-sommer/raku/ch-2.raku new file mode 100755 index 0000000000..24b72afae0 --- /dev/null +++ b/challenge-070/arne-sommer/raku/ch-2.raku @@ -0,0 +1,34 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $N where 2 <= $N <=5 = 3, + :$v, :$verbose = $v); + +my @sequence = (0,1,3,2); + +for 3 .. $N -> $level +{ + @sequence = generate2bgcs(@sequence, $level, $verbose); +} + +say "[{ @sequence.join(", ") }]"; + +sub generate2bgcs (@in, $level, $verbose) +{ + my @S1a = @in.map({ .fmt('%0' ~ ($level-1) ~ 'b') }); + my @S2a = @S1a.reverse; + my @S1 = @S1a.map({ "0$_" }); + my @S2 = @S2a.map({ "1$_" }); + my @S3 = (@S1, @S2).flat; + my @out = @S3.map( *.parse-base(2) ); + + if $verbose + { + say ": a) S1 = [{ @S1a.join(", ") }]"; + say ": b) S2 = [{ @S2a.join(", ") }]"; + say ": c) S1 = [{ @S1.join(", ") }]"; + say ": b) S2 = [{ @S2.join(", ") }]"; + say ": e) S3 = [{ @S3.join(", ") }]"; + say ": \$N=$level = [{ @out.join(", ") }]"; + } + return @out; +} diff --git a/challenge-070/arne-sommer/raku/charswap b/challenge-070/arne-sommer/raku/charswap new file mode 100755 index 0000000000..459d0da9af --- /dev/null +++ b/challenge-070/arne-sommer/raku/charswap @@ -0,0 +1,18 @@ +#! /usr/bin/env raku + +subset PosInt of Int where * >= 1; + +unit sub MAIN (:$S is copy = 'perlandraku', + PosInt :$O = 4, + PosInt :$C where $C < $O && $C + $O <= $S.chars = 3, + :$v, :$verbose = $v); + +for 1 .. $C -> $index +{ + say "swap $index: { $S.substr($index, 1) } <-> { $S.substr($index + $O, 1) } == $S" if $verbose; + + ($S.substr-rw($index,1), $S.substr-rw($index + $O,1) ) = + ($S.substr($index + $O, 1), $S.substr($index, 1)); +} + +say $S; diff --git a/challenge-070/arne-sommer/raku/charswap-mod b/challenge-070/arne-sommer/raku/charswap-mod new file mode 100755 index 0000000000..05f090bcae --- /dev/null +++ b/challenge-070/arne-sommer/raku/charswap-mod @@ -0,0 +1,25 @@ +#! /usr/bin/env raku + +subset PosInt of Int where * >= 1; + +unit sub MAIN (:$S = 'perlandraku', + PosInt :$O = 4, + PosInt :$C where $C < $O && $C + $O <= $S.chars = 3, + :$v, :$verbose = $v); + +my @S = $S.comb; +my $N = $S.chars; + +for 1 .. $C -> $index +{ + say "swap $index: { @S[$index % $N] } <-> { @S[ ($index + $O) % $N ] } == { @S.join }" if $verbose; + + swap(@S[$index % $N], @S[ ($index + $O) % $N ]); +} + +say @S.join; + +sub swap ($a is rw, $b is rw) +{ + ($a, $b) = ($b, $a); +} diff --git a/challenge-070/arne-sommer/raku/charswap-node b/challenge-070/arne-sommer/raku/charswap-node new file mode 100755 index 0000000000..f7768133fc --- /dev/null +++ b/challenge-070/arne-sommer/raku/charswap-node @@ -0,0 +1,38 @@ +#! /usr/bin/env node + +var S = process.argv[2] || 'perlandraku'; +var N = S.length; +var O = process.argv[3] || 4; +var C = process.argv[4] || 3; + +let die = (message) => { + console.log(message); + process.kill(process.pid); +}; + +var OO = parseInt(O); + +if (OO != O || O < 1) + die('O: Integer >= 1 only'); + +var CC = parseInt(C); + +if (CC != C || C < 1) + die('C: Integer >= 1 only'); + +if (C >= O) + die('C: Must be < O'); + +if (CC + OO > N) + die('C + O: Must be <= N'); + +for (index = 1; index <= CC; index++) +{ + S = S.slice(0, index) + + S.charAt(index + OO) + + S.slice(index +1, index + OO) + + S.charAt(index) + + S.slice(index + OO +1); +} + +console.log(S); diff --git a/challenge-070/arne-sommer/raku/charswap-sans-mod b/challenge-070/arne-sommer/raku/charswap-sans-mod new file mode 100755 index 0000000000..899fe610bc --- /dev/null +++ b/challenge-070/arne-sommer/raku/charswap-sans-mod @@ -0,0 +1,24 @@ +#! /usr/bin/env raku + +subset PosInt of Int where * >= 1; + +unit sub MAIN (:$S = 'perlandraku', + PosInt :$O = 4, + PosInt :$C where $C < $O && $C + $O <= $S.chars = 3, + :$v, :$verbose = $v); + +my @S = $S.comb; + +for 1 .. $C -> $index +{ + say "swap $index: { @S[$index] } <-> { @S[$index + $O] } == { @S.join }" if $verbose; + + swap(@S[$index], @S[$index + $O]); +} + +say @S.join; + +sub swap ($a is rw, $b is rw) +{ + ($a, $b) = ($b, $a); +} diff --git a/challenge-070/arne-sommer/raku/gray-code-seq b/challenge-070/arne-sommer/raku/gray-code-seq new file mode 100755 index 0000000000..24b72afae0 --- /dev/null +++ b/challenge-070/arne-sommer/raku/gray-code-seq @@ -0,0 +1,34 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $N where 2 <= $N <=5 = 3, + :$v, :$verbose = $v); + +my @sequence = (0,1,3,2); + +for 3 .. $N -> $level +{ + @sequence = generate2bgcs(@sequence, $level, $verbose); +} + +say "[{ @sequence.join(", ") }]"; + +sub generate2bgcs (@in, $level, $verbose) +{ + my @S1a = @in.map({ .fmt('%0' ~ ($level-1) ~ 'b') }); + my @S2a = @S1a.reverse; + my @S1 = @S1a.map({ "0$_" }); + my @S2 = @S2a.map({ "1$_" }); + my @S3 = (@S1, @S2).flat; + my @out = @S3.map( *.parse-base(2) ); + + if $verbose + { + say ": a) S1 = [{ @S1a.join(", ") }]"; + say ": b) S2 = [{ @S2a.join(", ") }]"; + say ": c) S1 = [{ @S1.join(", ") }]"; + say ": b) S2 = [{ @S2.join(", ") }]"; + say ": e) S3 = [{ @S3.join(", ") }]"; + say ": \$N=$level = [{ @out.join(", ") }]"; + } + return @out; +} |
