aboutsummaryrefslogtreecommitdiff
path: root/challenge-069/simon-proctor/raku/ch-1.raku
blob: 643ea2c26207a9a9e42f831f087080d245d53a5d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/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,)];
    make-strob( @base, $length );
}

multi sub strobogrammatic( $length ) {
    my @base = [X] ((6,8,9) xx ($length div 2));
    make-strob(@base,$length);
}

sub make-strob(@base,$length) {   
    @base.map( -> @start { |@start, |( $length %% 2 ?? () !! (8,) ), |@start.reverse.map( { rev($_) } ) } ).map( *.join("") );
}