aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2020-11-22 04:51:10 +0000
committerGitHub <noreply@github.com>2020-11-22 04:51:10 +0000
commitf5167bace8769b7e63318dc27cbf3d95dee0d293 (patch)
tree219a3c2a147fce8bfe31d5efce617ce5486fdea1
parent586bfd8469caf7bd6f744e3f0ccce81b3dcdfef7 (diff)
parentf8b559aed7f7d1f161eee1267ee662f27e67ac83 (diff)
downloadperlweeklychallenge-club-f5167bace8769b7e63318dc27cbf3d95dee0d293.tar.gz
perlweeklychallenge-club-f5167bace8769b7e63318dc27cbf3d95dee0d293.tar.bz2
perlweeklychallenge-club-f5167bace8769b7e63318dc27cbf3d95dee0d293.zip
Merge pull request #2811 from stuart-little/stuart-little_056--059
initial commit on 056--059
-rw-r--r--challenge-056/stuart-little/README1
-rwxr-xr-xchallenge-056/stuart-little/raku/ch-1.p610
-rwxr-xr-xchallenge-056/stuart-little/raku/ch-2.p631
-rw-r--r--challenge-057/stuart-little/README1
-rwxr-xr-xchallenge-057/stuart-little/raku/ch-1.p622
-rwxr-xr-xchallenge-057/stuart-little/raku/ch-2.p610
-rw-r--r--challenge-058/stuart-little/README1
-rwxr-xr-xchallenge-058/stuart-little/raku/ch-1.p610
-rwxr-xr-xchallenge-058/stuart-little/raku/ch-2.p612
-rw-r--r--challenge-059/stuart-little/README1
-rwxr-xr-xchallenge-059/stuart-little/raku/ch-1.p6112
-rwxr-xr-xchallenge-059/stuart-little/raku/ch-2.p66
12 files changed, 217 insertions, 0 deletions
diff --git a/challenge-056/stuart-little/README b/challenge-056/stuart-little/README
new file mode 100644
index 0000000000..78439907de
--- /dev/null
+++ b/challenge-056/stuart-little/README
@@ -0,0 +1 @@
+Solutions by Stuart Little
diff --git a/challenge-056/stuart-little/raku/ch-1.p6 b/challenge-056/stuart-little/raku/ch-1.p6
new file mode 100755
index 0000000000..050e6f6750
--- /dev/null
+++ b/challenge-056/stuart-little/raku/ch-1.p6
@@ -0,0 +1,10 @@
+#!/usr/bin/env perl6
+use v6;
+
+sub diffk($k,@a) {
+ (&{$_}, &{$_.map(*.reverse)}).map({|@a.keys.combinations(2).$_}).grep({ @a[$_[0]]-@a[$_[1]] == $k }) || "nothing"
+}
+
+say diffk(@*ARGS[0].Int, @*ARGS[1..*].map(*.Int))
+
+# run as <script> <target difference $k> <space-separated array entries>
diff --git a/challenge-056/stuart-little/raku/ch-2.p6 b/challenge-056/stuart-little/raku/ch-2.p6
new file mode 100755
index 0000000000..6a1fc64eeb
--- /dev/null
+++ b/challenge-056/stuart-little/raku/ch-2.p6
@@ -0,0 +1,31 @@
+#!/usr/bin/env perl6
+use v6;
+
+sub leaf_paths(@t) {
+ (@t[1..*].all ~~ Str) && return ((@t[0],),);
+ my @left=@t[1..(my $idx = (1..^@t).first({ @t[1..$_].grep(*.Int).elems - @t[1..$_].grep(* ~~ Str).elems == -1 }))];
+ my @right=@t[$idx^..*];
+ (((@left[0].Int) ?? leaf_paths(@left) !! ()),((@right[0].Int) ?? leaf_paths(@right) !! ())).map(*.map({@t[0], |@$_ })).map(|*)
+}
+
+say @*ARGS[1..*].map({ $_.Int || $_ }).&leaf_paths.grep({ $_.sum == @*ARGS[0] });
+
+=finish
+
+run as <script> <target sum> <tree in preorder form with '.' for empty nodes, entered as space-separated values>
+
+ref: https://stackoverflow.com/a/2676849/11064961
+
+e.g. 5 4 11 7 . . 2 . . . 8 13 . . 9 . 1 . . represents the tree
+
+ 5
+ / \
+ 4 8
+ / / \
+ 11 13 9
+ / \ \
+ 7 2 1
+
+given as an example in the problem formulation at https://perlweeklychallenge.org/blog/perl-weekly-challenge-056/
+
+That example would be run as <script> 22 5 4 11 7 . . 2 . . . 8 13 . . 9 . 1 . ., returning ((5 4 11 2))
diff --git a/challenge-057/stuart-little/README b/challenge-057/stuart-little/README
new file mode 100644
index 0000000000..78439907de
--- /dev/null
+++ b/challenge-057/stuart-little/README
@@ -0,0 +1 @@
+Solutions by Stuart Little
diff --git a/challenge-057/stuart-little/raku/ch-1.p6 b/challenge-057/stuart-little/raku/ch-1.p6
new file mode 100755
index 0000000000..a17b1bc417
--- /dev/null
+++ b/challenge-057/stuart-little/raku/ch-1.p6
@@ -0,0 +1,22 @@
+#!/usr/bin/env perl6
+use v6;
+
+sub inv_tree(@t where { log2($_.elems + 1) %% 1 }) {
+ (0..(log2(@t.elems + 1)-1)).map(2 ** * - 1).map({ @t[$_ .. 2*$_].reverse }).flat
+}
+
+sub ancest($n) { $n == 0 && return ($n,); return ($n % 2) ?? (|ancest(($n-1) div 2), $n) !! (|ancest(($n-2) div 2), $n); }
+
+sub draw_brnch(@a) {
+ |@a[0..^*-1].map(*.trans(['-', 0..9] => ' ')), @a[*-1]
+}
+
+sub preord(@a) { @a == 1 && return @a; return (@a[0], |preord(@a[@a.keys.grep({($_+1).base(2) ~~ /^10/})]), |preord(@a[@a.keys.grep({($_+1).base(2) ~~ /^11/})]))}
+
+my @fragments=@*ARGS.pairs.map({ (($_.key %% 2) ?? ('') !! ('|')) ~ "--" ~ $_.value });
+
+my @lines=@fragments.keys.map(*.&ancest).map({ @fragments[@($_)] }).map(*.&draw_brnch).map(*.join);
+
+for @lines.&preord {.say}
+
+# run as <script> <space-separated tree entries, ordered as you would read them in English: left-to-right then top-to-bottom>
diff --git a/challenge-057/stuart-little/raku/ch-2.p6 b/challenge-057/stuart-little/raku/ch-2.p6
new file mode 100755
index 0000000000..eb75cd55e0
--- /dev/null
+++ b/challenge-057/stuart-little/raku/ch-2.p6
@@ -0,0 +1,10 @@
+#!/usr/bin/env perl6
+use v6;
+
+sub uprefix($w,@a) {
+ ([\~] $w.comb).first(-> $p { @a.grep({ $_.starts-with($p) }).elems == 1 })
+}
+
+say @*ARGS.map({ uprefix($_,@*ARGS) })
+
+# run as <script> <space-separated words>
diff --git a/challenge-058/stuart-little/README b/challenge-058/stuart-little/README
new file mode 100644
index 0000000000..78439907de
--- /dev/null
+++ b/challenge-058/stuart-little/README
@@ -0,0 +1 @@
+Solutions by Stuart Little
diff --git a/challenge-058/stuart-little/raku/ch-1.p6 b/challenge-058/stuart-little/raku/ch-1.p6
new file mode 100755
index 0000000000..6e008f388a
--- /dev/null
+++ b/challenge-058/stuart-little/raku/ch-1.p6
@@ -0,0 +1,10 @@
+#!/usr/bin/env perl6
+use v6;
+
+sub versprcs($v) {
+ $v.comb.map({ $_.Int || $_ }).map({ $_ ~~ Str && $_.trans(['.','_']=>['_','.']) || $_ })
+}
+
+say (@*ARGS[0].&versprcs cmp @*ARGS[1].&versprcs).Int
+
+# run as <script> <1st version number> <2nd version number>
diff --git a/challenge-058/stuart-little/raku/ch-2.p6 b/challenge-058/stuart-little/raku/ch-2.p6
new file mode 100755
index 0000000000..6f6fa024ba
--- /dev/null
+++ b/challenge-058/stuart-little/raku/ch-2.p6
@@ -0,0 +1,12 @@
+#!/usr/bin/env perl6
+use v6;
+
+sub inspair(@a,$p) { |@a[0..^$p.value], $p.key, |@a[$p.value..*] }
+
+my @H=(27, 21, 37, 4, 19, 52, 23, 64, 1, 7, 51, 17, 24, 50, 3, 2, 34, 40, 47, 20, 8, 56, 14, 16, 42, 38, 62, 53, 31, 41, 55, 59, 48, 12, 32, 61, 9, 60, 46, 26, 58, 25, 15, 36, 11, 44, 63, 28, 5, 54, 10, 49, 57, 30, 29, 22, 35, 39, 45, 43, 18, 6, 13, 33);
+my @T=( 6, 41, 1, 49, 38, 12, 1, 0, 58, 47, 4, 17, 26, 1, 61, 12, 29, 3, 4, 11, 45, 1, 32, 5, 9, 19, 1, 4, 28, 12, 2, 2, 13, 18, 19, 3, 4, 1, 10, 16, 4, 3, 29, 5, 49, 1, 1, 24, 2, 1, 38, 7, 7, 14, 35, 25, 0, 5, 4, 19, 10, 13, 4, 12);
+
+my @A=reduce(&inspair, (), |(@H Z=> @T).sort({ -$_.key.Int }));
+say (@A.any ~~ Nil) ?? ("Error: no solution possible") !! (@A)
+
+# run as <script>
diff --git a/challenge-059/stuart-little/README b/challenge-059/stuart-little/README
new file mode 100644
index 0000000000..78439907de
--- /dev/null
+++ b/challenge-059/stuart-little/README
@@ -0,0 +1 @@
+Solutions by Stuart Little
diff --git a/challenge-059/stuart-little/raku/ch-1.p6 b/challenge-059/stuart-little/raku/ch-1.p6
new file mode 100755
index 0000000000..133dda05ee
--- /dev/null
+++ b/challenge-059/stuart-little/raku/ch-1.p6
@@ -0,0 +1,112 @@
+#!/usr/bin/env perl6
+use v6;
+
+class Node {
+ has Real $.val;
+ has Node $.next is rw;
+}
+
+class Sll {
+ has Node $.head is rw;
+
+ method show() {
+ my $node = self.head;
+ (! $node) && return;
+ while ($node.next) {
+ print $node.val, " -> ";
+ $node=$node.next;
+ }
+ say $node.val;
+ }
+
+ method len() {
+ my $node = self.head;
+ my $len=0;
+ while ($node) {
+ $len++;
+ $node=$node.next;
+ }
+ return $len;
+ }
+
+ multi method insert(Real $val) {
+ my $node=self.head;
+ (! $node) && do {
+ self.head=Node.new(val => $val);
+ return;
+ }
+ while ($node.next) {
+ $node=$node.next;
+ }
+ $node.next=Node.new(val => $val);
+ }
+
+ multi method insert(0, Real $val) {
+ my $node=Node.new(val => $val, next => self.head);
+ self.head=$node;
+ }
+
+ multi method insert(Int $idx where * > 0, Real $val) {
+ given self.len {
+ when 0 { self.insert(0,$val) }
+ when 1..$idx { self.insert($val) }
+ default {
+ my $cur=self.head;
+ my $node=Node.new(val => $val);
+ for (0..^($idx-1)) {
+ $cur=$cur.next;
+ }
+ $node.next=$cur.next;
+ $cur.next=$node;
+ }
+ }
+ }
+
+ method del(Int $idx where * >= 0) {
+ given $idx {
+ when self.len..* { warn "Index out of range" }
+ when 0 { self.head=self.head.next }
+ default {
+ my $cur=self.head;
+ for (^($idx-1)) {
+ $cur=$cur.next;
+ }
+ $cur.next=$cur.next.next;
+ }
+ }
+ }
+}
+
+my $ll=Sll.new();
+for (@*ARGS[1..*].map(*.Real)) {
+ $ll.insert($_);
+}
+
+print "Initial list: ";
+$ll.show();
+
+my $k=@*ARGS[0].Real;
+my $cur=Node.new(next => $ll.head);
+my ($ins_idx,$cur_idx)=(0,0);
+
+while ($cur.next && $cur.next.val < $k) {
+ $ins_idx++;
+ $cur_idx++;
+ $cur.next=$cur.next.next;
+}
+
+while ($cur.next && $cur.next.next) {
+ my $val=$cur.next.next.val;
+ ($val < $k) && do {
+ $ll.del(++$cur_idx);
+ $ll.insert($ins_idx,$val);
+ $ins_idx++;
+ }
+ $cur_idx++;
+ $cur.next=$cur.next.next;
+}
+
+print "Final list: ";
+$ll.show();
+
+# run as <script> <number $k> <space-separated numbers making up the list>
diff --git a/challenge-059/stuart-little/raku/ch-2.p6 b/challenge-059/stuart-little/raku/ch-2.p6
new file mode 100755
index 0000000000..b775075932
--- /dev/null
+++ b/challenge-059/stuart-little/raku/ch-2.p6
@@ -0,0 +1,6 @@
+#!/usr/bin/env perl6
+use v6;
+
+say @*ARGS.map(*.Int).combinations(2).map({ ($_[0] +^ $_[1]).base(2).comb.grep(1).elems }).sum
+
+# run as <script> <space-separated numbers>