aboutsummaryrefslogtreecommitdiff
path: root/challenge-070
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2020-07-25 01:57:46 +0100
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2020-07-25 01:57:46 +0100
commit87106c1e85af6f8badcfa08c41442f01fa9f5b8e (patch)
tree14c9a162dcafd47a1c64ff6ecdca0410f442a7a7 /challenge-070
parent62f1563a6c3108747a9b950e784f1419aebdf253 (diff)
downloadperlweeklychallenge-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.txt1
-rwxr-xr-xchallenge-070/arne-sommer/node/ch-2.js62
-rwxr-xr-xchallenge-070/arne-sommer/node/gray-code-seq-node62
-rwxr-xr-xchallenge-070/arne-sommer/perl/ch-1.pl32
-rwxr-xr-xchallenge-070/arne-sommer/perl/ch-2.pl48
-rwxr-xr-xchallenge-070/arne-sommer/perl/charswap-perl32
-rwxr-xr-xchallenge-070/arne-sommer/perl/gray-code-seq-perl48
-rwxr-xr-xchallenge-070/arne-sommer/raku/ch-1.raku18
-rwxr-xr-xchallenge-070/arne-sommer/raku/ch-2.raku34
-rwxr-xr-xchallenge-070/arne-sommer/raku/charswap18
-rwxr-xr-xchallenge-070/arne-sommer/raku/charswap-mod25
-rwxr-xr-xchallenge-070/arne-sommer/raku/charswap-node38
-rwxr-xr-xchallenge-070/arne-sommer/raku/charswap-sans-mod24
-rwxr-xr-xchallenge-070/arne-sommer/raku/gray-code-seq34
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;
+}