tracks/perl6/exercises/all-your-base/Example.pm6 in trackler-2.2.1.65 vs tracks/perl6/exercises/all-your-base/Example.pm6 in trackler-2.2.1.66

- old
+ new

@@ -1,46 +1,26 @@ -unit module AllYourBase:ver<2>; +unit module AllYourBase:ver<3>; -class X::AllYourBase::InvalidBase is Exception { - has $.payload; - method message {"$!payload is not a valid base."} +sub convert-base ( + :%bases! where all(.keys ~~ <from to>.Set, .values.all > 1), + :@digits! where %bases<from> > .all ~~ UInt:D, + --> Array[UInt:D] +) is export { + from-decimal %bases<to>, to-decimal(%bases<from>, @digits); } -class X::AllYourBase::InvalidDigit is Exception { - has %.payload; - method message {"%!payload<digit> is not a valid digit for base %!payload<base>."} -} - -sub convert-base (Int:D $input-base, @input-digits, Int:D $output-base --> Array:D) is export { - for $input-base, $output-base { - X::AllYourBase::InvalidBase.new(payload => $_).throw if $_ < 2; - } - from-decimal($output-base, (to-decimal $input-base, @input-digits)); -} - sub to-decimal ($input-base, @input-digits) { - return [].Slip if !@input-digits; my $elems = @input-digits.elems; - for @input-digits { - if $_ == 0 { $elems-- } - else { last } - } - my $dec = 0; - loop (my $i = 0; $i < $elems; $i++) { - if @input-digits.reverse[$i] < 0 || @input-digits.reverse[$i] >= $input-base { - X::AllYourBase::InvalidDigit.new( :payload(base => $input-base, digit => @input-digits.reverse[$i]) ).throw; - } - $dec += @input-digits.reverse[$i] * $input-base ** $i; - } - return $dec; + $_ == 0 ?? $elems-- !! last for @input-digits; + (loop (my $i = 0; $i < $elems; $i++) { + @input-digits.reverse[$i] * $input-base ** $i; + }).sum; } -sub from-decimal ($output-base, $dec) { - my @output-digits; - my $num = $dec; +sub from-decimal ($output-base, $num is copy) { + my UInt:D @output-digits; while $num >= $output-base { unshift @output-digits, $num % $output-base; $num div= $output-base; } - unshift @output-digits, $num; - return @output-digits; + @output-digits.unshift: $num; }