aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhillip Harris <psh@gmx.org>2020-02-14 09:38:50 +0100
committerPhillip Harris <psh@gmx.org>2020-02-14 09:38:50 +0100
commit5e4c38c90a43480105a10097598aa0a59e7eab8d (patch)
tree4802b2850928b53a7f6ba8270299bafe30db4862
parent5e0a1807a04e0f144da845c5c9fefed244cbc074 (diff)
downloadperlweeklychallenge-club-5e4c38c90a43480105a10097598aa0a59e7eab8d.tar.gz
perlweeklychallenge-club-5e4c38c90a43480105a10097598aa0a59e7eab8d.tar.bz2
perlweeklychallenge-club-5e4c38c90a43480105a10097598aa0a59e7eab8d.zip
test
-rw-r--r--challenge-047/phillip-harris/README1
-rw-r--r--challenge-047/phillip-harris/README~1
-rw-r--r--challenge-047/phillip-harris/perl/ch-1.pl68
-rw-r--r--challenge-047/phillip-harris/perl/ch-1.pl~69
-rw-r--r--challenge-047/phillip-harris/perl/ch-2.pl13
-rw-r--r--challenge-047/phillip-harris/perl/romcal.pl~66
6 files changed, 218 insertions, 0 deletions
diff --git a/challenge-047/phillip-harris/README b/challenge-047/phillip-harris/README
new file mode 100644
index 0000000000..3636cf47d8
--- /dev/null
+++ b/challenge-047/phillip-harris/README
@@ -0,0 +1 @@
+Solution by Phillip Harris.
diff --git a/challenge-047/phillip-harris/README~ b/challenge-047/phillip-harris/README~
new file mode 100644
index 0000000000..c899c90e8a
--- /dev/null
+++ b/challenge-047/phillip-harris/README~
@@ -0,0 +1 @@
+Solution by Phillip Harris
diff --git a/challenge-047/phillip-harris/perl/ch-1.pl b/challenge-047/phillip-harris/perl/ch-1.pl
new file mode 100644
index 0000000000..7affcfa318
--- /dev/null
+++ b/challenge-047/phillip-harris/perl/ch-1.pl
@@ -0,0 +1,68 @@
+#!/usr/bin/perl
+
+# For multiplication, the asterisk must be escaped \*.
+
+use strict;
+
+my $input = join( " ", @ARGV );
+
+if ( $input !~ /.*?([IVXLCDM]+)(.*?)([IVXLCDM]+)/ ) { die "Invalid input" }
+my $number1 = $1;
+my $operator = $2;
+my $number2 = $3;
+$operator =~ s/[^\+\-\*\/]//g;
+
+if ( $operator eq '+' ) {
+ print dec2rom( rom2dec($number1) + rom2dec($number2) );
+}
+elsif ( $operator eq '-' ) {
+ print dec2rom( rom2dec($number1) - rom2dec($number2) );
+}
+elsif ( $operator eq '*' ) {
+ print dec2rom( rom2dec($number1) * rom2dec($number2) );
+}
+elsif ( $operator eq '/' ) {
+ print dec2rom( int( rom2dec($number1) / rom2dec($number2) + .5 ) );
+}
+else { die "Invalid operator" }
+print "\n";
+
+sub dec2rom {
+ my @rdb = qw(I IV V IX X XL L XC C CD D CM M);
+ my @ddb = qw(1 4 5 9 10 40 50 90 100 400 500 900 1000);
+ my $dec = $_[0];
+ my $rom;
+ for ( my $x = $#ddb ; $x >= 0 ; $x-- ) {
+ if ( $dec / $ddb[$x] >= 1 ) {
+ $rom .= $rdb[$x] x int( $dec / $ddb[$x] );
+ $dec = $dec - ( $ddb[$x] * int( $dec / $ddb[$x] ) );
+ }
+ }
+ return $rom;
+}
+
+sub rom2dec {
+ my %r2d = (
+ "I" => 1,
+ "V" => 5,
+ "X" => 10,
+ "L" => 50,
+ "C" => 100,
+ "D" => 500,
+ "M" => 1000
+ );
+ my $dec;
+ my @char = split //, $_[0];
+ for ( my $x = 0 ; $x <= $#char ; $x++ ) {
+ my $current = $r2d{ $char[$x] };
+ my $lookahead = $r2d{ $char[ $x + 1 ] };
+ if ( $lookahead > $current ) {
+ $dec += $lookahead - $current;
+ $x++;
+ }
+ else {
+ $dec += $current;
+ }
+ }
+ return $dec;
+}
diff --git a/challenge-047/phillip-harris/perl/ch-1.pl~ b/challenge-047/phillip-harris/perl/ch-1.pl~
new file mode 100644
index 0000000000..16ed2c86b9
--- /dev/null
+++ b/challenge-047/phillip-harris/perl/ch-1.pl~
@@ -0,0 +1,69 @@
+#!/usr/bin/perl
+
+# For multiplication, the asterisk must be escaped \*.
+
+use strict;
+
+my $input = join( " ", @ARGV );
+
+if ( $input !~ /.*?([IVXLCDM]+)(.*?)([IVXLCDM]+)/ ) { die "Invalid input" }
+my $number1 = $1;
+my $operator = $2;
+my $number2 = $3;
+$operator =~ s/[^\+\-\*\/]//g;
+
+if ( $operator eq '+' ) {
+ print dec2rom( rom2dec($number1) + rom2dec($number2) );
+}
+elsif ( $operator eq '-' ) {
+ print dec2rom( rom2dec($number1) - rom2dec($number2) );
+}
+elsif ( $operator eq '*' ) {
+ print dec2rom( rom2dec($number1) * rom2dec($number2) );
+}
+elsif ( $operator eq '/' ) {
+ print dec2rom( int( rom2dec($number1) / rom2dec($number2) + .5 ) );
+}
+else { die "Invalid operator" }
+print "\n";
+
+sub dec2rom {
+ my @rdb = qw(I IV V IX X XL L XC C CD D CM M);
+ print @rdb;
+ my @ddb = qw(1 4 5 9 10 40 50 90 100 400 500 900 1000);
+ my $dec = $_[0];
+ my $rom;
+ for ( my $x = $#ddb ; $x >= 0 ; $x-- ) {
+ if ( $dec / $ddb[$x] >= 1 ) {
+ $rom .= $rdb[$x] x int( $dec / $ddb[$x] );
+ $dec = $dec - ( $ddb[$x] * int( $dec / $ddb[$x] ) );
+ }
+ }
+ return $rom;
+}
+
+sub rom2dec {
+ my %r2d = (
+ "I" => 1,
+ "V" => 5,
+ "X" => 10,
+ "L" => 50,
+ "C" => 100,
+ "D" => 500,
+ "M" => 1000
+ );
+ my $dec;
+ my @char = split //, $_[0];
+ for ( my $x = 0 ; $x <= $#char ; $x++ ) {
+ my $current = $r2d{ $char[$x] };
+ my $lookahead = $r2d{ $char[ $x + 1 ] };
+ if ( $lookahead > $current ) {
+ $dec += $lookahead - $current;
+ $x++;
+ }
+ else {
+ $dec += $current;
+ }
+ }
+ return $dec;
+}
diff --git a/challenge-047/phillip-harris/perl/ch-2.pl b/challenge-047/phillip-harris/perl/ch-2.pl
new file mode 100644
index 0000000000..0ca5094d3a
--- /dev/null
+++ b/challenge-047/phillip-harris/perl/ch-2.pl
@@ -0,0 +1,13 @@
+#!/usr/bin/perl
+
+#Write a script to print first 20 Gapful Numbers greater than or equal to 100.
+#Please check out the page for more information about Gapful Numbers.
+
+$x = 100;
+while ( $gaps < 20 ) {
+ if ( $x % ( substr( $x, 0, 1 ) . substr( $x, -1 ) ) == 0 ) {
+ print "$x\n";
+ $gaps++;
+ }
+ $x++;
+}
diff --git a/challenge-047/phillip-harris/perl/romcal.pl~ b/challenge-047/phillip-harris/perl/romcal.pl~
new file mode 100644
index 0000000000..29e9a5be6e
--- /dev/null
+++ b/challenge-047/phillip-harris/perl/romcal.pl~
@@ -0,0 +1,66 @@
+#!/usr/bin/perl
+
+use strict;
+
+my $input = join( " ", @ARGV );
+
+if ( $input !~ /.*?([IVXLCDM]+)(.*?)([IVXLCDM]+)/ ) { die "Invalid input" }
+my $number1 = $1;
+my $operator = $2;
+my $number2 = $3;
+$operator =~ s/[^\+\-\*\/]//g;
+
+if ( $operator eq '+' ) {
+ print dec2rom( rom2dec($number1) + rom2dec($number2) );
+}
+elsif ( $operator eq '-' ) {
+ print dec2rom( rom2dec($number1) - rom2dec($number2) );
+}
+elsif ( $operator eq '*' ) {
+ print dec2rom( rom2dec($number1) * rom2dec($number2) );
+}
+elsif ( $operator eq '/' ) {
+ print dec2rom( int( rom2dec($number1) / rom2dec($number2) + .5 ) );
+}
+print "\n";
+else { die "Invalid operator" }
+
+sub dec2rom {
+ my @rdb = qw(I IV V IX X XL L XC C CD D CM M);
+ my @ddb = qw(1 4 5 9 10 40 50 90 100 400 500 900 1000);
+ my $dec = $_[0];
+ my $rom;
+ for ( my $x = $#ddb ; $x >= 0 ; $x-- ) {
+ if ( $dec / $ddb[$x] >= 1 ) {
+ $rom .= $rdb[$x] x int( $dec / $ddb[$x] );
+ $dec = $dec - ( $ddb[$x] * int( $dec / $ddb[$x] ) );
+ }
+ }
+ return $rom;
+}
+
+sub rom2dec {
+ my %r2d = (
+ "I" => 1,
+ "V" => 5,
+ "X" => 10,
+ "L" => 50,
+ "C" => 100,
+ "D" => 500,
+ "M" => 1000
+ );
+ my $dec;
+ my @char = split //, $_[0];
+ for ( my $x = 0 ; $x <= $#char ; $x++ ) {
+ my $current = $r2d{ $char[$x] };
+ my $lookahead = $r2d{ $char[ $x + 1 ] };
+ if ( $lookahead > $current ) {
+ $dec += $lookahead - $current;
+ $x++;
+ }
+ else {
+ $dec += $current;
+ }
+ }
+ return $dec;
+}