aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-060/markus-holzer/raku/ch-1.raku42
-rw-r--r--challenge-060/markus-holzer/raku/ch-2.raku2
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