diff options
| author | Ruben Westerberg <drclaw@mac.com> | 2019-06-02 17:18:45 +1000 |
|---|---|---|
| committer | Ruben Westerberg <drclaw@mac.com> | 2019-06-02 17:18:45 +1000 |
| commit | 5da3a4c137fb62861edc7df7a8aa71368c0602bb (patch) | |
| tree | fd609184ee2f27a875a3b4f1e49627149339154e | |
| parent | 54dd93498b0d4c290dabea580a5963c3d2702a04 (diff) | |
| download | perlweeklychallenge-club-5da3a4c137fb62861edc7df7a8aa71368c0602bb.tar.gz perlweeklychallenge-club-5da3a4c137fb62861edc7df7a8aa71368c0602bb.tar.bz2 perlweeklychallenge-club-5da3a4c137fb62861edc7df7a8aa71368c0602bb.zip | |
ch-1 solution for p6
| -rwxr-xr-x | challenge-010/ruben-westerberg/perl6/ch-1.p6 | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/challenge-010/ruben-westerberg/perl6/ch-1.p6 b/challenge-010/ruben-westerberg/perl6/ch-1.p6 new file mode 100755 index 0000000000..9e08666137 --- /dev/null +++ b/challenge-010/ruben-westerberg/perl6/ch-1.p6 @@ -0,0 +1,79 @@ +#!/usr/bin/env perl6 + +sub MAIN( + Str $input, +) { + given $input { + when /<[MDCLXVI]>/ { + say romanToDecimal2($_); + } + when /\d+/ { + say decimalToRoman($_); + } + default { + die "What on earth are you trying to convert?"; + } + } + +} +sub decimalToRoman ($input) { + my @digits=$input.comb; + my $roman= join '', do for @digits.kv { + my $power=@digits-$^k-1; + #decimalToRoman($^v,@digits-$^k-1); + my @out; + my @p=<I X C M>; + my @h=<V L D>; + my $base=@p[$power]; + my $half=@h[$power]; + given $^v { + when 1..3 { + @out.append: $base xx $_; + } + when 4 { + @out.push: $base; + @out.push: $half; + } + when 5 { + @out.push: $half; + } + when 6..8 { + @out.push: $half; + @out.append: $base xx ($_- 5); + } + when 9 { + @out.push: $base; + @out.push: @p[$power+1]; + } + + } + |@out; + } +} + +sub romanToDecimal2($input) { + + my %r=(M=>1000, C=>100 ,X=>10, I=>1, V=>5, L=>50, D=>500); + my @order=%r.sort: *.value <=> *.value; + my @c=$input.comb; + my $diff=0; + my $sum=0; + + for @c.kv -> $k, $v { + if $k+1 < @c { + if (%r{@c[$k+1]} > %r{$v}) { + $diff=%r{$v}; + } + else { + $sum+=%r{$v}- $diff; + $diff=0; + } + + } + else { + $sum+=%r{$v}- $diff; + } + } + $sum; +} + |
