diff options
Diffstat (limited to 'challenge-113')
| -rw-r--r-- | challenge-113/polettix/raku/ch-1.raku | 16 | ||||
| -rw-r--r-- | challenge-113/polettix/raku/ch-2.raku | 45 |
2 files changed, 61 insertions, 0 deletions
diff --git a/challenge-113/polettix/raku/ch-1.raku b/challenge-113/polettix/raku/ch-1.raku new file mode 100644 index 0000000000..7f0591c401 --- /dev/null +++ b/challenge-113/polettix/raku/ch-1.raku @@ -0,0 +1,16 @@ +#!/usr/bin/env raku +use v6; + +sub represent-integer (Int $n is copy, Int $d) { + return 0 if $n < $d; + return 1 if $n >= 10 * $d; + return 1 if $n ~~ m{$d}; + $n -= $d; + while $n > 0 { + return 1 if represent-integer($n, $d); + $n -= 10; + } + return 0; +} + +sub MAIN ($N = 25, $D = 7) { represent-integer($N, $D).say } diff --git a/challenge-113/polettix/raku/ch-2.raku b/challenge-113/polettix/raku/ch-2.raku new file mode 100644 index 0000000000..7b51166551 --- /dev/null +++ b/challenge-113/polettix/raku/ch-2.raku @@ -0,0 +1,45 @@ +#!/usr/bin/env raku +use v6; + +sub recreate-binary-tree ($tree is rw) { + my $sum = 0; + sub accumulate ($n) { $sum += $n<value> }; + sub update ($n) { $n<value> = $sum - $n<value> }; + for &accumulate, &update -> $cb { + my @queue = $tree,; + while (@queue) { + my $node = @queue.shift // next; + $cb($node); + next unless $node<children>:exists; + @queue.push($node<children>.Slip); + } + } + return $tree; +} + +sub node ($value is copy, $left = Nil, $right = Nil) { + my $pleft = $left.gist; + my $pright = $right.gist; + my $retval = { value => $value }; + $retval<children> = $left.defined || $right.defined + ?? ($left, $right) !! (); + return $retval; +} + +sub printout ($root, $indent = 0) { + my $value = $root.defined ?? $root<value> !! ''; + say ' ' x $indent, "<$value>"; + return unless $root; + printout($_, $indent + 1) for $root<children>.all; +} + +# 1 +# / \ +# 2 3 +# / / \ +# 4 5 6 +# \ +# 7 +my $T = + node(1, node(2, node(4, Nil, node(7))), node(3, node(5), node(6))); +printout(recreate-binary-tree($T)); |
