From cd96514d9cbe26940d2cd3904c0c737c4fc11069 Mon Sep 17 00:00:00 2001 From: "Markus \"Holli\" Holzer" Date: Tue, 12 May 2020 23:33:05 +0200 Subject: improved, final --- challenge-060/markus-holzer/raku/ch-1.raku | 42 ++++++++++++++++++++++-------- challenge-060/markus-holzer/raku/ch-2.raku | 2 +- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/challenge-060/markus-holzer/raku/ch-1.raku b/challenge-060/markus-holzer/raku/ch-1.raku index 9211ab9b99..a870a6fb1e 100644 --- a/challenge-060/markus-holzer/raku/ch-1.raku +++ b/challenge-060/markus-holzer/raku/ch-1.raku @@ -1,21 +1,41 @@ use Test; -sub excel-column( Int $n ) +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; } + +sub to-excel( PositiveInt $n ) { - state @digits = |('A'..'Z'); + state @digits = |( 'A'..'Z' ); - multi ec( Int $i where * < 26 ) { - @digits[ $i ] } + multi ec( Int $i where * < 26 ) { + @digits[ $i ] } multi ec( Int $i ) { ec( $i div 26 - 1 ) ~ ec( $i % 26 ) } - ec( $n - 1 ); + ec $n - 1; +} + +sub from-excel( ExcelColumn $column ) +{ + [+] $column.comb.map( *.ord - 64 ).reverse.kv.map: -> $i, $v { + 26 ** $i * $v + } } -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 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..9f2b99e282 100644 --- a/challenge-060/markus-holzer/raku/ch-2.raku +++ b/challenge-060/markus-holzer/raku/ch-2.raku @@ -2,7 +2,7 @@ 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 -- cgit