diff options
| -rw-r--r-- | challenge-060/markus-holzer/raku/ch-1.raku | 42 | ||||
| -rw-r--r-- | challenge-060/markus-holzer/raku/ch-2.raku | 4 |
2 files changed, 32 insertions, 14 deletions
diff --git a/challenge-060/markus-holzer/raku/ch-1.raku b/challenge-060/markus-holzer/raku/ch-1.raku index 9211ab9b99..8019730554 100644 --- a/challenge-060/markus-holzer/raku/ch-1.raku +++ b/challenge-060/markus-holzer/raku/ch-1.raku @@ -1,21 +1,39 @@ use Test; -sub excel-column( Int $n ) -{ - state @digits = |('A'..'Z'); +subset ExcelColumn of Str where * ~~ / ^ <[ A .. Z ]>+ $ /; +subset PositiveInt of Int where * > 0; + +multi sub MAIN( ExcelColumn $c ) { say from-excel( $c ) } +multi sub MAIN( PositiveInt $n ) { say to-excel( $n ) } +multi sub MAIN( Bool:D :$t ) { run-tests; } - multi ec( Int $i where * < 26 ) { - @digits[ $i ] } +sub to-excel( PositiveInt $n ) +{ + multi ec( Int $i where * < 26 ) { + ( $i + 65 ).chr } multi ec( Int $i ) { ec( $i div 26 - 1 ) ~ ec( $i % 26 ) } - ec( $n - 1 ); + ec $n - 1; } -ok excel-column( 1 ) eq 'A', 'A'; -ok excel-column( 26 ) eq 'Z', 'Z'; -ok excel-column( 27 ) eq 'AA', 'AA'; -ok excel-column( 28 ) eq 'AB', 'AB'; -ok excel-column( 26**3 + 26**2 + 26) eq 'ZZZ', 'ZZZ'; -ok excel-column( 26**3 + 26**2 + 1) eq 'ZZA', 'ZZA';
\ No newline at end of file +sub from-excel( ExcelColumn $column ) +{ + [+] $column.comb.map( *.ord - 64 ).reverse.kv.map: -> $i, $v { + 26 ** $i * $v + } +} + +sub run-tests( $n = 26**3 + 26**2 + 26 ) +{ + for ( 'A', 'B' ... * ).kv -> $i, $v + { + last if $i == $n; + ok to-excel( $i + 1 ) eq $v, "to-excel({ $i + 1 })"; + ok from-excel( $v ) eq $i + 1, "from-excel({ $v })"; + } + + dies-ok { from-excel( "AÜA" ) }, "bad input: Ü"; + dies-ok { to-excel( 0 ) }, "bad input: 0"; +} diff --git a/challenge-060/markus-holzer/raku/ch-2.raku b/challenge-060/markus-holzer/raku/ch-2.raku index b5a5ece78f..d71a554a95 100644 --- a/challenge-060/markus-holzer/raku/ch-2.raku +++ b/challenge-060/markus-holzer/raku/ch-2.raku @@ -2,11 +2,11 @@ my @L = (0, 1, 2, 5); my $X = 2; my $Y = 21; -.say for ( |@L xx 2 ) +.say for ( |@L xx $X ) .combinations( $X ) .map( *.join.Int ) - .unique .grep( * < $Y ) .grep( *.chars == $X ) + .unique .sort ;
\ No newline at end of file |
