From 7bcc4a63695846396ff27f0d658167243e959fc4 Mon Sep 17 00:00:00 2001 From: Mohammad S Anwar Date: Wed, 24 Jun 2020 05:58:50 +0100 Subject: - Added solutions by 3ter. --- challenge-066/3ter/README | 1 + challenge-066/3ter/ch-1.pl | 56 ----------------------------------------- challenge-066/3ter/ch-2.pl | 44 -------------------------------- challenge-066/3ter/perl/ch-1.pl | 56 +++++++++++++++++++++++++++++++++++++++++ challenge-066/3ter/perl/ch-2.pl | 44 ++++++++++++++++++++++++++++++++ 5 files changed, 101 insertions(+), 100 deletions(-) create mode 100644 challenge-066/3ter/README delete mode 100644 challenge-066/3ter/ch-1.pl delete mode 100644 challenge-066/3ter/ch-2.pl create mode 100644 challenge-066/3ter/perl/ch-1.pl create mode 100644 challenge-066/3ter/perl/ch-2.pl (limited to 'challenge-066') diff --git a/challenge-066/3ter/README b/challenge-066/3ter/README new file mode 100644 index 0000000000..8c594431f3 --- /dev/null +++ b/challenge-066/3ter/README @@ -0,0 +1 @@ +Solutions by 3ter. diff --git a/challenge-066/3ter/ch-1.pl b/challenge-066/3ter/ch-1.pl deleted file mode 100644 index 577c8a3d73..0000000000 --- a/challenge-066/3ter/ch-1.pl +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/perl -use strict; -use warnings; -use v5.30; - -my ( $num, $den ) = @ARGV; -die 'Please provide two integers e.g. \'ch-1.pl 5 2\'' - if ( !defined($num) or !defined($den) ); - -say "$num//$den = " . divide_integers( $num, $den ); - -sub divide_integers { - my ( $num, $den ) = @_; - - # two edge cases - if ( $den == 0 ) { - return 'n/a'; - } - if ( $num == $den ) { - return 1; - } - - # extract the sign and forget about it later - my $sign = 0; - if ( $num < 0 and $den > 0 or $num > 0 and $den < 0 ) { - $sign = -1; - if ( abs($num) < abs($den) ) { - return -1; - } - } - elsif ( abs($num) < abs($den) ) { - return 0; - } - $num = abs($num); - $den = abs($den); - - # solve division by using addition - my $count_num_in_den = 1; - my $multiples_of_den = 0; - while ( ( $multiples_of_den += $den ) < $num ) { - $count_num_in_den++; - } - - if ( $multiples_of_den > $num ) { - $count_num_in_den--; - } - if ( $sign == -1 ) { - - # floor rounds negative numbers down so the - # absolute value gets one bigger - $count_num_in_den++; - $count_num_in_den = 0 - $count_num_in_den; - } - return $count_num_in_den; -} - diff --git a/challenge-066/3ter/ch-2.pl b/challenge-066/3ter/ch-2.pl deleted file mode 100644 index c1258b6253..0000000000 --- a/challenge-066/3ter/ch-2.pl +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/perl -use strict; -use warnings; -use v5.30; - -my ($int) = @ARGV; -die 'Please provide one integer e.g. \'ch-2.pl 9\'' - if ( !defined($int) ); - -say power_integers($int); - -sub power_integers { - my ($int) = @_; - - my ( $factor, $power ) = get_factor_and_power($int); - if ( defined($power) and $power > 0 ) { - return $factor . '^' . $power; - } - else { - return 0; - } -} - -sub get_factor_and_power { - my ($int) = @_; - - # try those factors naively - my $factor; - my $max_factor = int( sqrt($int) ); - foreach my $potential_factor ( 2 .. $max_factor ) { - if ( $int % $potential_factor == 0 ) { - $factor = $potential_factor; - - # verify that the factor is powerful enough - my $power = 1; - while ( $factor**$power < $int ) { - $power++; - } - return ( $factor, $power ) if ( $factor**$power == $int ); - } - } - return 0; -} - diff --git a/challenge-066/3ter/perl/ch-1.pl b/challenge-066/3ter/perl/ch-1.pl new file mode 100644 index 0000000000..577c8a3d73 --- /dev/null +++ b/challenge-066/3ter/perl/ch-1.pl @@ -0,0 +1,56 @@ +#!/usr/bin/perl +use strict; +use warnings; +use v5.30; + +my ( $num, $den ) = @ARGV; +die 'Please provide two integers e.g. \'ch-1.pl 5 2\'' + if ( !defined($num) or !defined($den) ); + +say "$num//$den = " . divide_integers( $num, $den ); + +sub divide_integers { + my ( $num, $den ) = @_; + + # two edge cases + if ( $den == 0 ) { + return 'n/a'; + } + if ( $num == $den ) { + return 1; + } + + # extract the sign and forget about it later + my $sign = 0; + if ( $num < 0 and $den > 0 or $num > 0 and $den < 0 ) { + $sign = -1; + if ( abs($num) < abs($den) ) { + return -1; + } + } + elsif ( abs($num) < abs($den) ) { + return 0; + } + $num = abs($num); + $den = abs($den); + + # solve division by using addition + my $count_num_in_den = 1; + my $multiples_of_den = 0; + while ( ( $multiples_of_den += $den ) < $num ) { + $count_num_in_den++; + } + + if ( $multiples_of_den > $num ) { + $count_num_in_den--; + } + if ( $sign == -1 ) { + + # floor rounds negative numbers down so the + # absolute value gets one bigger + $count_num_in_den++; + $count_num_in_den = 0 - $count_num_in_den; + } + return $count_num_in_den; +} + diff --git a/challenge-066/3ter/perl/ch-2.pl b/challenge-066/3ter/perl/ch-2.pl new file mode 100644 index 0000000000..c1258b6253 --- /dev/null +++ b/challenge-066/3ter/perl/ch-2.pl @@ -0,0 +1,44 @@ +#!/usr/bin/perl +use strict; +use warnings; +use v5.30; + +my ($int) = @ARGV; +die 'Please provide one integer e.g. \'ch-2.pl 9\'' + if ( !defined($int) ); + +say power_integers($int); + +sub power_integers { + my ($int) = @_; + + my ( $factor, $power ) = get_factor_and_power($int); + if ( defined($power) and $power > 0 ) { + return $factor . '^' . $power; + } + else { + return 0; + } +} + +sub get_factor_and_power { + my ($int) = @_; + + # try those factors naively + my $factor; + my $max_factor = int( sqrt($int) ); + foreach my $potential_factor ( 2 .. $max_factor ) { + if ( $int % $potential_factor == 0 ) { + $factor = $potential_factor; + + # verify that the factor is powerful enough + my $power = 1; + while ( $factor**$power < $int ) { + $power++; + } + return ( $factor, $power ) if ( $factor**$power == $int ); + } + } + return 0; +} + -- cgit