aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuben Westerberg <drclaw@mac.com>2019-06-02 19:11:01 +1000
committerRuben Westerberg <drclaw@mac.com>2019-06-02 19:11:01 +1000
commit371ce98e5f90748acb5ffaf9a0df5ae72454c571 (patch)
treeb933189926ac63576e28251b66a5a29715f48737
parent5da3a4c137fb62861edc7df7a8aa71368c0602bb (diff)
downloadperlweeklychallenge-club-371ce98e5f90748acb5ffaf9a0df5ae72454c571.tar.gz
perlweeklychallenge-club-371ce98e5f90748acb5ffaf9a0df5ae72454c571.tar.bz2
perlweeklychallenge-club-371ce98e5f90748acb5ffaf9a0df5ae72454c571.zip
Working ch-1 solutions p5 and p6
-rwxr-xr-xchallenge-010/ruben-westerberg/perl5/ch-1.pl87
-rwxr-xr-xchallenge-010/ruben-westerberg/perl6/ch-1.p68
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;