diff options
| -rw-r--r-- | challenge-066/3ter/ch-1.pl | 56 | ||||
| -rw-r--r-- | challenge-066/3ter/ch-2.pl | 44 |
2 files changed, 100 insertions, 0 deletions
diff --git a/challenge-066/3ter/ch-1.pl b/challenge-066/3ter/ch-1.pl new file mode 100644 index 0000000000..577c8a3d73 --- /dev/null +++ b/challenge-066/3ter/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/ch-2.pl b/challenge-066/3ter/ch-2.pl new file mode 100644 index 0000000000..c1258b6253 --- /dev/null +++ b/challenge-066/3ter/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; +} + |
