From 5e4c38c90a43480105a10097598aa0a59e7eab8d Mon Sep 17 00:00:00 2001 From: Phillip Harris Date: Fri, 14 Feb 2020 09:38:50 +0100 Subject: test --- challenge-047/phillip-harris/README | 1 + challenge-047/phillip-harris/README~ | 1 + challenge-047/phillip-harris/perl/ch-1.pl | 68 +++++++++++++++++++++++++++ challenge-047/phillip-harris/perl/ch-1.pl~ | 69 ++++++++++++++++++++++++++++ challenge-047/phillip-harris/perl/ch-2.pl | 13 ++++++ challenge-047/phillip-harris/perl/romcal.pl~ | 66 ++++++++++++++++++++++++++ 6 files changed, 218 insertions(+) create mode 100644 challenge-047/phillip-harris/README create mode 100644 challenge-047/phillip-harris/README~ create mode 100644 challenge-047/phillip-harris/perl/ch-1.pl create mode 100644 challenge-047/phillip-harris/perl/ch-1.pl~ create mode 100644 challenge-047/phillip-harris/perl/ch-2.pl create mode 100644 challenge-047/phillip-harris/perl/romcal.pl~ 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; +} -- cgit