diff options
| author | Myoungjin JEON <jeongoon@gmail.com> | 2020-07-27 16:10:03 +1000 |
|---|---|---|
| committer | Myoungjin JEON <jeongoon@gmail.com> | 2020-07-27 16:10:03 +1000 |
| commit | 9f5aee78a5569f7e0c8f742dd907663bd1e04642 (patch) | |
| tree | 8f864d8438c06983ab9438e1e9839628cfe18520 /challenge-070 | |
| parent | fde6b9fbc1e5fa1378acd6b1b5c6aed854f4f156 (diff) | |
| parent | 450eab302dee5452d66be1f388cea4fafb0b5a31 (diff) | |
| download | perlweeklychallenge-club-9f5aee78a5569f7e0c8f742dd907663bd1e04642.tar.gz perlweeklychallenge-club-9f5aee78a5569f7e0c8f742dd907663bd1e04642.tar.bz2 perlweeklychallenge-club-9f5aee78a5569f7e0c8f742dd907663bd1e04642.zip | |
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'challenge-070')
71 files changed, 2487 insertions, 2 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 |
