diff options
| author | Phillip Harris <psh@gmx.org> | 2020-02-14 09:38:50 +0100 |
|---|---|---|
| committer | Phillip Harris <psh@gmx.org> | 2020-02-14 09:38:50 +0100 |
| commit | 5e4c38c90a43480105a10097598aa0a59e7eab8d (patch) | |
| tree | 4802b2850928b53a7f6ba8270299bafe30db4862 | |
| parent | 5e0a1807a04e0f144da845c5c9fefed244cbc074 (diff) | |
| download | perlweeklychallenge-club-5e4c38c90a43480105a10097598aa0a59e7eab8d.tar.gz perlweeklychallenge-club-5e4c38c90a43480105a10097598aa0a59e7eab8d.tar.bz2 perlweeklychallenge-club-5e4c38c90a43480105a10097598aa0a59e7eab8d.zip | |
test
| -rw-r--r-- | challenge-047/phillip-harris/README | 1 | ||||
| -rw-r--r-- | challenge-047/phillip-harris/README~ | 1 | ||||
| -rw-r--r-- | challenge-047/phillip-harris/perl/ch-1.pl | 68 | ||||
| -rw-r--r-- | challenge-047/phillip-harris/perl/ch-1.pl~ | 69 | ||||
| -rw-r--r-- | challenge-047/phillip-harris/perl/ch-2.pl | 13 | ||||
| -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;
+}
|
