diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2021-01-01 22:13:08 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-01-01 22:13:08 +0000 |
| commit | b203b64e7b5affeef6a8730da3588cd05810c851 (patch) | |
| tree | 2c771ea130cd11b5dc4d91db91fb76b33a1f1260 | |
| parent | 71ed698e3e16803d97f10d3456f6c21bc51988e3 (diff) | |
| parent | 5e5c38b7366c86a1da53dbf29059b12ab679cdbf (diff) | |
| download | perlweeklychallenge-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.txt | 1 | ||||
| -rwxr-xr-x | challenge-093/arne-sommer/raku/ch-1.raku | 36 | ||||
| -rwxr-xr-x | challenge-093/arne-sommer/raku/ch-2.raku | 66 | ||||
| -rwxr-xr-x | challenge-093/arne-sommer/raku/max-points | 45 | ||||
| -rwxr-xr-x | challenge-093/arne-sommer/raku/max-points-hash | 36 | ||||
| -rwxr-xr-x | challenge-093/arne-sommer/raku/max-points2 | 49 | ||||
| -rwxr-xr-x | challenge-093/arne-sommer/raku/max-test | 16 | ||||
| -rwxr-xr-x | challenge-093/arne-sommer/raku/sum-path | 66 |
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; + } +} |
