diff options
| -rw-r--r-- | challenge-094/aaronreidsmith/blog.txt | 1 | ||||
| -rw-r--r-- | challenge-094/aaronreidsmith/raku/ch-1.raku | 30 | ||||
| -rw-r--r-- | challenge-094/aaronreidsmith/raku/ch-2.raku | 58 |
3 files changed, 89 insertions, 0 deletions
diff --git a/challenge-094/aaronreidsmith/blog.txt b/challenge-094/aaronreidsmith/blog.txt new file mode 100644 index 0000000000..2ad7df0cb8 --- /dev/null +++ b/challenge-094/aaronreidsmith/blog.txt @@ -0,0 +1 @@ +https://aaronreidsmith.github.io/blog/perl-weekly-challenge-094/ diff --git a/challenge-094/aaronreidsmith/raku/ch-1.raku b/challenge-094/aaronreidsmith/raku/ch-1.raku new file mode 100644 index 0000000000..3b4b53815e --- /dev/null +++ b/challenge-094/aaronreidsmith/raku/ch-1.raku @@ -0,0 +1,30 @@ +#!/usr/bin/env raku + +sub challenge(@S) { + my $output = Set.new; + for @S -> $word { + my @permutations = $word.comb.permutations.map(*.join); + $output ∪= (@S ∩ @permutations).keys.sort.join(','); + } + $output.keys.map(*.split(',')).sort +} + +multi sub MAIN(*@S where all(@S) ~~ /^<alpha>+$/) { + say challenge(@S); +} + +multi sub MAIN(Bool :$test) { + use Test; + + my @tests = ( + (('opt', 'bat', 'saw', 'tab', 'pot', 'top', 'was'), (('bat', 'tab'), ('opt', 'pot', 'top'), ('saw', 'was'))), + (('x',), (('x',),)), + (('abc', 'cba', 'ba', 'ab', 'a'), (('a',), ('ab', 'ba'), ('abc', 'cba'))) + ); + + for @tests -> (@input, @expected) { + is(challenge(@input), @expected); + } + + done-testing; +} diff --git a/challenge-094/aaronreidsmith/raku/ch-2.raku b/challenge-094/aaronreidsmith/raku/ch-2.raku new file mode 100644 index 0000000000..4a9a502b65 --- /dev/null +++ b/challenge-094/aaronreidsmith/raku/ch-2.raku @@ -0,0 +1,58 @@ +#!/usr/bin/env raku + +subset NodeValue of Str where { $_ ~~ /^<digit>$/ || $_ eq 'Nil' } + +class Node { + has Node $.left is rw = Nil; + has Node $.right is rw = Nil; + has Int $.value = 0; +} + +enum Traversal <Preorder Inorder Postorder>; + +sub build-tree(@array, $root is copy = Nil, Int $i = 0) { + if $i < @array.elems && @array[$i] ne 'Nil' { + $root = Node.new(value => @array[$i].Int); + $root.left = build-tree(@array, $root.left, 2 * $i + 1); + $root.right = build-tree(@array, $root.right, 2 * $i + 2); + } + $root; +} + +sub challenge(Node $root, Traversal $traversal) { + with $root { + given $traversal { + when Preorder { ($root.value, |challenge($root.left, $traversal), |challenge($root.right, $traversal)) } + when Inorder { (|challenge($root.left, $traversal), $root.value, |challenge($root.right, $traversal)) } + when Postorder { (|challenge($root.left, $traversal), |challenge($root.right, $traversal), $root.value) } + } + } +} + +sub challenge-wrapper(Node $root, Traversal $traversal = Preorder) { + challenge($root, $traversal).join(' -> '); +} + +multi sub MAIN(Str :$traversal = 'preorder', *@N where all(@N) ~~ NodeValue) { + my $root = build-tree(@N); + given $traversal.lc { + when 'preorder' { say challenge-wrapper($root, Preorder) } + when 'inorder' { say challenge-wrapper($root, Inorder) } + when 'postorder' { say challenge-wrapper($root, Postorder) } + default { die "Traversal must be one of: (preorder, inorder, postorder), not $traversal" } + } +} + +multi sub MAIN(Bool :$test) { + use Test; + + my @tests = ( + (('1', '2', '3', '4', '5', 'Nil', 'Nil', 'Nil', 'Nil', '6', '7'), Preorder, '1 -> 2 -> 4 -> 5 -> 6 -> 7 -> 3'), + (('1', '2', '3', '4', '5', 'Nil', 'Nil', 'Nil', 'Nil', '6', '7'), Inorder, '4 -> 2 -> 6 -> 5 -> 7 -> 1 -> 3'), + (('1', '2', '3', '4', '5', 'Nil', 'Nil', 'Nil', 'Nil', '6', '7'), Postorder, '4 -> 6 -> 7 -> 5 -> 2 -> 3 -> 1') + ); + + for @tests -> (@input, $traversal, $expected) { + is(challenge-wrapper(build-tree(@input), $traversal), $expected); + } +} |
