diff options
| author | Ruben Westerberg <drclaw@mac.com> | 2019-06-02 19:11:01 +1000 |
|---|---|---|
| committer | Ruben Westerberg <drclaw@mac.com> | 2019-06-02 19:11:01 +1000 |
| commit | 371ce98e5f90748acb5ffaf9a0df5ae72454c571 (patch) | |
| tree | b933189926ac63576e28251b66a5a29715f48737 | |
| parent | 5da3a4c137fb62861edc7df7a8aa71368c0602bb (diff) | |
| download | perlweeklychallenge-club-371ce98e5f90748acb5ffaf9a0df5ae72454c571.tar.gz perlweeklychallenge-club-371ce98e5f90748acb5ffaf9a0df5ae72454c571.tar.bz2 perlweeklychallenge-club-371ce98e5f90748acb5ffaf9a0df5ae72454c571.zip | |
Working ch-1 solutions p5 and p6
| -rwxr-xr-x | challenge-010/ruben-westerberg/perl5/ch-1.pl | 87 | ||||
| -rwxr-xr-x | challenge-010/ruben-westerberg/perl6/ch-1.p6 | 8 |
2 files changed, 91 insertions, 4 deletions
diff --git a/challenge-010/ruben-westerberg/perl5/ch-1.pl b/challenge-010/ruben-westerberg/perl5/ch-1.pl new file mode 100755 index 0000000000..929fd12f1b --- /dev/null +++ b/challenge-010/ruben-westerberg/perl5/ch-1.pl @@ -0,0 +1,87 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use List::Util; +use v2.26; + +die "Need a single argument" if @ARGV != 1; + + +if ($ARGV[0] =~ /[MDCLXVI]/) { + print romanToDecimal($ARGV[0])."\n"; +} +elsif ($ARGV[0] =~ /\d+/) { + print decimalToRoman($ARGV[0])."\n"; +} +else { + die "What on earth are you trying to convert?"; +} + +sub decimalToRoman { + my @digits= split "", shift; + + #my @p=qw<I X C M>; + #my @h=qw<V L D>; + my @out; + my @p=<I X C M>; + my @h=<V L D>; + for (my $i=0; $i < @digits; $i++) { + my $power=@digits-$i-1; + my $base=$p[$power]; + my $half=$h[$power]; + $_=$digits[$i]; + if ($_ == 0) { + } + + elsif (grep {$_ == $digits[$i]} (1..3)) { + push @out,$base x $_; + + } + elsif( $_ == 4) { + push @out,$base; + push @out, $half; + } + elsif( $_ == 5) { + push @out, $half; + } + elsif( grep {$_ == $digits[$i]} 6..8 ) { + push @out, $half; + push @out, $base x ($_ - 5); + } + elsif ( $_== 9) { + push @out, $base; + push @out, $p[$power+1]; + } + else{ + + } + } + return join '', @out; + +} + +sub romanToDecimal { + my %r=(M=>1000, D=>500, C=>100, L=>50, X=>10, V=>5, I=>1); + my @c=split '', shift; + my $diff=0; + my $sum=0; + for (my $i=0; $i<@c; $i++) { + if (($i+1) < @c) { + print "is Diff\n"; + + if ($r{$c[$i+1]} > $r{$c[$i]}) { + $diff=$r{$c[$i]}; + } + else { + $sum+= $r{$c[$i]} -$diff; + $diff=0; + } + } + else { + $sum+=$r{$c[$i]} -$diff; + } + } + return $sum; +} + + diff --git a/challenge-010/ruben-westerberg/perl6/ch-1.p6 b/challenge-010/ruben-westerberg/perl6/ch-1.p6 index 9e08666137..96d9a889b0 100755 --- a/challenge-010/ruben-westerberg/perl6/ch-1.p6 +++ b/challenge-010/ruben-westerberg/perl6/ch-1.p6 @@ -5,7 +5,7 @@ sub MAIN( ) { given $input { when /<[MDCLXVI]>/ { - say romanToDecimal2($_); + say romanToDecimal($_); } when /\d+/ { say decimalToRoman($_); @@ -18,12 +18,12 @@ sub MAIN( } sub decimalToRoman ($input) { my @digits=$input.comb; + my @p=<I X C M>; + my @h=<V L D>; 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 { @@ -51,7 +51,7 @@ sub decimalToRoman ($input) { } } -sub romanToDecimal2($input) { +sub romanToDecimal($input) { my %r=(M=>1000, C=>100 ,X=>10, I=>1, V=>5, L=>50, D=>500); my @order=%r.sort: *.value <=> *.value; |
