Sha256: 7549867a6b62812e988885dd9b3caa105eb8ff37ff11975f6219313cf871abd9

Contents?: true

Size: 1.33 KB

Versions: 121

Compression:

Stored size: 1.33 KB

Contents

unit module AllYourBase:ver<2>;

class X::AllYourBase::InvalidBase is Exception {
  has $.payload;
  method message {"$!payload is not a valid base."}
}

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

sub from-decimal ($output-base, $dec) {
  my @output-digits;
  my $num = $dec;
  while $num >= $output-base {
    unshift @output-digits, $num % $output-base;
    $num div= $output-base;
  }
  unshift @output-digits, $num;
  return @output-digits;
}

Version data entries

121 entries across 121 versions & 1 rubygems

Version Path
trackler-2.2.1.65 tracks/perl6/exercises/all-your-base/Example.pm6
trackler-2.2.1.64 tracks/perl6/exercises/all-your-base/Example.pm6
trackler-2.2.1.63 tracks/perl6/exercises/all-your-base/Example.pm6
trackler-2.2.1.62 tracks/perl6/exercises/all-your-base/Example.pm6
trackler-2.2.1.61 tracks/perl6/exercises/all-your-base/Example.pm6
trackler-2.2.1.60 tracks/perl6/exercises/all-your-base/Example.pm6
trackler-2.2.1.59 tracks/perl6/exercises/all-your-base/Example.pm6
trackler-2.2.1.58 tracks/perl6/exercises/all-your-base/Example.pm6
trackler-2.2.1.57 tracks/perl6/exercises/all-your-base/Example.pm6
trackler-2.2.1.56 tracks/perl6/exercises/all-your-base/Example.pm6
trackler-2.2.1.55 tracks/perl6/exercises/all-your-base/Example.pm6
trackler-2.2.1.54 tracks/perl6/exercises/all-your-base/Example.pm6
trackler-2.2.1.53 tracks/perl6/exercises/all-your-base/Example.pm6
trackler-2.2.1.52 tracks/perl6/exercises/all-your-base/Example.pm6
trackler-2.2.1.51 tracks/perl6/exercises/all-your-base/Example.pm6
trackler-2.2.1.50 tracks/perl6/exercises/all-your-base/Example.pm6
trackler-2.2.1.49 tracks/perl6/exercises/all-your-base/Example.pm6
trackler-2.2.1.48 tracks/perl6/exercises/all-your-base/Example.pm6
trackler-2.2.1.47 tracks/perl6/exercises/all-your-base/Example.pm6
trackler-2.2.1.46 tracks/perl6/exercises/all-your-base/Example.pm6