aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2021-01-01 22:13:08 +0000
committerGitHub <noreply@github.com>2021-01-01 22:13:08 +0000
commitb203b64e7b5affeef6a8730da3588cd05810c851 (patch)
tree2c771ea130cd11b5dc4d91db91fb76b33a1f1260
parent71ed698e3e16803d97f10d3456f6c21bc51988e3 (diff)
parent5e5c38b7366c86a1da53dbf29059b12ab679cdbf (diff)
downloadperlweeklychallenge-club-b203b64e7b5affeef6a8730da3588cd05810c851.tar.gz
perlweeklychallenge-club-b203b64e7b5affeef6a8730da3588cd05810c851.tar.bz2
perlweeklychallenge-club-b203b64e7b5affeef6a8730da3588cd05810c851.zip
Merge pull request #3127 from arnesom/branch-for-challenge-093
Arne Sommer
-rw-r--r--challenge-093/arne-sommer/blog.txt1
-rwxr-xr-xchallenge-093/arne-sommer/raku/ch-1.raku36
-rwxr-xr-xchallenge-093/arne-sommer/raku/ch-2.raku66
-rwxr-xr-xchallenge-093/arne-sommer/raku/max-points45
-rwxr-xr-xchallenge-093/arne-sommer/raku/max-points-hash36
-rwxr-xr-xchallenge-093/arne-sommer/raku/max-points249
-rwxr-xr-xchallenge-093/arne-sommer/raku/max-test16
-rwxr-xr-xchallenge-093/arne-sommer/raku/sum-path66
8 files changed, 315 insertions, 0 deletions
diff --git a/challenge-093/arne-sommer/blog.txt b/challenge-093/arne-sommer/blog.txt
new file mode 100644
index 0000000000..da2b80cf0d
--- /dev/null
+++ b/challenge-093/arne-sommer/blog.txt
@@ -0,0 +1 @@
+https://raku-musings.com/pointy-path.html
diff --git a/challenge-093/arne-sommer/raku/ch-1.raku b/challenge-093/arne-sommer/raku/ch-1.raku
new file mode 100755
index 0000000000..3f03728388
--- /dev/null
+++ b/challenge-093/arne-sommer/raku/ch-1.raku
@@ -0,0 +1,36 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Str $string = "(1,1), (2,2), (3,3)", :v(:$verbose));
+
+my @array = $string.EVAL;
+
+say ": { @array.raku }" if $verbose;
+
+my %matrix; @array.map({ %matrix{ $_[0] }{ $_[1] } = True });
+
+say ": { %matrix.raku }" if $verbose;
+
+my $answer;
+
+for @array -> @current
+{
+ my ($row, $col) = @current;
+
+ say ": [$row][$col]" if $verbose;;
+
+ for (0,1),(1,-1),(1,0),(1,1) -> @add
+ {
+ my $maximum = traverse(1, $row, $col, @add[0], @add[1]);
+ say "::: @add[] -> $maximum" if $verbose;
+ $answer = max($answer, $maximum);
+ }
+}
+
+say $answer;
+
+sub traverse ($count, $row, $col, $add-row, $add-col)
+{
+ return $count unless %matrix{ $row + $add-row }{ $col + $add-col};
+
+ return traverse($count +1, $row + $add-row, $col + $add-col, $add-row, $add-col);
+}
diff --git a/challenge-093/arne-sommer/raku/ch-2.raku b/challenge-093/arne-sommer/raku/ch-2.raku
new file mode 100755
index 0000000000..4df224ef8d
--- /dev/null
+++ b/challenge-093/arne-sommer/raku/ch-2.raku
@@ -0,0 +1,66 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Str $tree = "1 | 2 3 | 4 * 5 6", :v(:$verbose));
+
+class BinaryNode
+{
+ has Int $.value;
+ has BinaryNode $.left;
+ has BinaryNode $.right;
+}
+
+my @btree = $tree.split("|")>>.words;
+
+my @old-nodes;
+my @new-nodes;
+
+for @btree.reverse -> $row
+{
+ my @current = @$row;
+ @old-nodes = @new-nodes;
+ @new-nodes = ();
+
+ for @current -> $value
+ {
+ if $value eq "*"
+ {
+ @new-nodes.push("*");
+ next;
+ }
+
+ my $left = @old-nodes.shift // "*"; $left = Nil if $left eq "*";
+ my $right = @old-nodes.shift // "*"; $right = Nil if $right eq "*";
+
+ @new-nodes.push(BinaryNode.new(value => $value.Int,
+ left => $left // Nil,
+ right => $right // Nil));
+ }
+}
+
+my $btree = @new-nodes[0];
+
+say ": { $btree.raku }" if $verbose;
+
+my $sum = 0;
+
+traverse($btree, ());
+
+say $sum;
+
+sub traverse ($current, @path is copy)
+{
+ @path.push: $current.value;
+
+ if ($current.left or $current.right)
+ {
+ traverse($current.left, @path) if $current.left;
+ traverse($current.right, @path) if $current.right;
+ }
+ else
+ {
+ my $this-sum = @path.sum;
+ say ": Path: { @path.join(" -> ") } (sum: $this-sum)" if $verbose;
+ $sum += $this-sum;
+ return;
+ }
+}
diff --git a/challenge-093/arne-sommer/raku/max-points b/challenge-093/arne-sommer/raku/max-points
new file mode 100755
index 0000000000..313d1bce2f
--- /dev/null
+++ b/challenge-093/arne-sommer/raku/max-points
@@ -0,0 +1,45 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Str $string = "(1,1), (2,2), (3,3)", :v(:$verbose));
+
+my @array = $string.EVAL;
+
+say ": { @array.raku }" if $verbose;
+
+my $max = @array>>.max.max;
+my $min = @array>>.min.min;
+
+say ": [$min <-> $max]" if $verbose;
+
+my @matrix; @array.map({ @matrix[$_[0]][$_[1]] = True });
+
+say ": { @matrix.raku }" if $verbose;
+
+my $answer;
+
+for $min .. $max -> $row
+{
+ for $min .. $max -> $col
+ {
+ say ": [$row][$col]" if $verbose;;
+ next unless @matrix[$row][$col].defined;
+
+ say "@ [$row][$col]" if $verbose;;
+
+ for (0,1),(1,-1),(1,0),(1,1) -> @add
+ {
+ my $maximum = traverse(1, $row, $col, @add[0], @add[1]);
+ say "::: @add[] -> $maximum" if $verbose;
+ $answer = max($answer, $maximum);
+ }
+ }
+}
+
+say $answer;
+
+sub traverse ($count, $row, $col, $add-row, $add-col)
+{
+ return $count unless @matrix[$row + $add-row][$col + $add-col];
+
+ return traverse($count +1, $row + $add-row, $col + $add-col, $add-row, $add-col);
+}
diff --git a/challenge-093/arne-sommer/raku/max-points-hash b/challenge-093/arne-sommer/raku/max-points-hash
new file mode 100755
index 0000000000..3f03728388
--- /dev/null
+++ b/challenge-093/arne-sommer/raku/max-points-hash
@@ -0,0 +1,36 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Str $string = "(1,1), (2,2), (3,3)", :v(:$verbose));
+
+my @array = $string.EVAL;
+
+say ": { @array.raku }" if $verbose;
+
+my %matrix; @array.map({ %matrix{ $_[0] }{ $_[1] } = True });
+
+say ": { %matrix.raku }" if $verbose;
+
+my $answer;
+
+for @array -> @current
+{
+ my ($row, $col) = @current;
+
+ say ": [$row][$col]" if $verbose;;
+
+ for (0,1),(1,-1),(1,0),(1,1) -> @add
+ {
+ my $maximum = traverse(1, $row, $col, @add[0], @add[1]);
+ say "::: @add[] -> $maximum" if $verbose;
+ $answer = max($answer, $maximum);
+ }
+}
+
+say $answer;
+
+sub traverse ($count, $row, $col, $add-row, $add-col)
+{
+ return $count unless %matrix{ $row + $add-row }{ $col + $add-col};
+
+ return traverse($count +1, $row + $add-row, $col + $add-col, $add-row, $add-col);
+}
diff --git a/challenge-093/arne-sommer/raku/max-points2 b/challenge-093/arne-sommer/raku/max-points2
new file mode 100755
index 0000000000..495fe418ac
--- /dev/null
+++ b/challenge-093/arne-sommer/raku/max-points2
@@ -0,0 +1,49 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Str $string = "(1,1), (2,2), (3,3)", :v(:$verbose));
+
+my @array = $string.EVAL;
+
+say ": { @array.raku }" if $verbose;
+
+my $max-row = @array>>.first.max;
+my $min-row = @array>>.first.min;
+
+my $max-col = @array>>.[1].max;
+my $min-col = @array>>.[1].min; ## first(:end); ## second -> Datetime (seconds)
+
+say ": [Row: $min-row <-> $max-row]" if $verbose;
+say ": [Col: $min-col <-> $max-col]" if $verbose;
+
+my @matrix; @array.map({ @matrix[$_[0] - $min-row +1][$_[1] - $min-col+1] = True });
+
+say ": { @matrix.raku }" if $verbose;
+
+my $answer;
+
+for 1 .. $max-row - $min-row +1 -> $row
+{
+ for 1 .. $max-col - $min-col +1 -> $col
+ {
+ say ": [$row][$col]" if $verbose;;
+ next unless @matrix[$row][$col].defined;
+
+ say "@ [$row][$col]" if $verbose;;
+
+ for (0,1),(1,-1),(1,0),(1,1) -> @add
+ {
+ my $maximum = traverse(1, $row, $col, @add[0], @add[1]);
+ say "::: @add[] -> $maximum" if $verbose;
+ $answer = max($answer, $maximum);
+ }
+ }
+}
+
+say $answer;
+
+sub traverse ($count, $row, $col, $add-row, $add-col)
+{
+ return $count unless @matrix[$row + $add-row][$col + $add-col];
+
+ return traverse($count +1, $row + $add-row, $col + $add-col, $add-row, $add-col);
+}
diff --git a/challenge-093/arne-sommer/raku/max-test b/challenge-093/arne-sommer/raku/max-test
new file mode 100755
index 0000000000..a452920c93
--- /dev/null
+++ b/challenge-093/arne-sommer/raku/max-test
@@ -0,0 +1,16 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Str $string = "(1,1), (2,2), (3,3)", :v(:$verbose));
+
+my @array = $string.EVAL;
+
+say ": Array: { @array.raku }" if $verbose;
+
+my $max = @array>>.max.max;
+my $min = @array>>.min.min;
+
+say ": Min: $min\n: Max: $max" if $verbose;
+
+my @matrix; @array.map({ @matrix[$_[0]][$_[1]] = True });
+
+say ": { @matrix.raku } " if $verbose;
diff --git a/challenge-093/arne-sommer/raku/sum-path b/challenge-093/arne-sommer/raku/sum-path
new file mode 100755
index 0000000000..4df224ef8d
--- /dev/null
+++ b/challenge-093/arne-sommer/raku/sum-path
@@ -0,0 +1,66 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Str $tree = "1 | 2 3 | 4 * 5 6", :v(:$verbose));
+
+class BinaryNode
+{
+ has Int $.value;
+ has BinaryNode $.left;
+ has BinaryNode $.right;
+}
+
+my @btree = $tree.split("|")>>.words;
+
+my @old-nodes;
+my @new-nodes;
+
+for @btree.reverse -> $row
+{
+ my @current = @$row;
+ @old-nodes = @new-nodes;
+ @new-nodes = ();
+
+ for @current -> $value
+ {
+ if $value eq "*"
+ {
+ @new-nodes.push("*");
+ next;
+ }
+
+ my $left = @old-nodes.shift // "*"; $left = Nil if $left eq "*";
+ my $right = @old-nodes.shift // "*"; $right = Nil if $right eq "*";
+
+ @new-nodes.push(BinaryNode.new(value => $value.Int,
+ left => $left // Nil,
+ right => $right // Nil));
+ }
+}
+
+my $btree = @new-nodes[0];
+
+say ": { $btree.raku }" if $verbose;
+
+my $sum = 0;
+
+traverse($btree, ());
+
+say $sum;
+
+sub traverse ($current, @path is copy)
+{
+ @path.push: $current.value;
+
+ if ($current.left or $current.right)
+ {
+ traverse($current.left, @path) if $current.left;
+ traverse($current.right, @path) if $current.right;
+ }
+ else
+ {
+ my $this-sum = @path.sum;
+ say ": Path: { @path.join(" -> ") } (sum: $this-sum)" if $verbose;
+ $sum += $this-sum;
+ return;
+ }
+}