aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-094/aaronreidsmith/blog.txt1
-rw-r--r--challenge-094/aaronreidsmith/raku/ch-1.raku30
-rw-r--r--challenge-094/aaronreidsmith/raku/ch-2.raku58
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);
+ }
+}