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;
}