aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-069/simon-proctor/raku/ch-1.raku31
1 files changed, 31 insertions, 0 deletions
diff --git a/challenge-069/simon-proctor/raku/ch-1.raku b/challenge-069/simon-proctor/raku/ch-1.raku
new file mode 100644
index 0000000000..634bca1135
--- /dev/null
+++ b/challenge-069/simon-proctor/raku/ch-1.raku
@@ -0,0 +1,31 @@
+#!/usr/bin/env raku
+
+#| Calculate the Strobogrammatic Numbers between $A and $B
+sub MAIN (
+ UInt $A, #= Start point
+ UInt $B where { $A <= $B <= 10**15 } , #= End point
+) {
+ for (1..15) -> $length {
+ for strobogrammatic($length) -> $s {
+ next if $s < $A;
+ exit if $s > $B;
+ say $s;
+ }
+ }
+}
+
+multi sub rev( 6 ) { 9 }
+multi sub rev( 8 ) { 8 }
+multi sub rev( 9 ) { 6 }
+
+multi sub strobogrammatic( 1 ) { ("8",) }
+
+multi sub strobogrammatic( $length where { 1 < $length <= 3 } ) {
+ my @base = [(6,),(8,),(9,)];
+ @base.map( -> @start { |@start, |( $length %% 2 ?? () !! (8,) ), |@start.reverse.map( { rev($_) } ) } ).map( *.join("") );
+}
+
+multi sub strobogrammatic( $length ) {
+ my @base = [X] ((6,8,9) xx ($length div 2));
+ @base.map( -> @start { |@start, |( $length %% 2 ?? () !! (8,) ), |@start.reverse.map( { rev($_) } ) } ).map( *.join("") );
+}