aboutsummaryrefslogtreecommitdiff
path: root/challenge-066/3ter
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2020-06-24 05:43:08 +0100
committerGitHub <noreply@github.com>2020-06-24 05:43:08 +0100
commitbeae736ae805903e74469d4e7864c34486c6d714 (patch)
tree1ec1cebe5ed29bb6b4fd9599e9b84df493923ca7 /challenge-066/3ter
parent47c32db9d7780db805513a23efe5fc8c691049b1 (diff)
parentd633ef1b79ff337337e5d186ff74ba3325bf367c (diff)
downloadperlweeklychallenge-club-beae736ae805903e74469d4e7864c34486c6d714.tar.gz
perlweeklychallenge-club-beae736ae805903e74469d4e7864c34486c6d714.tar.bz2
perlweeklychallenge-club-beae736ae805903e74469d4e7864c34486c6d714.zip
Merge pull request #1862 from 3ter/branch-for-challenge-066
Branch for challenge 066
Diffstat (limited to 'challenge-066/3ter')
-rw-r--r--challenge-066/3ter/ch-1.pl56
-rw-r--r--challenge-066/3ter/ch-2.pl44
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;
+}
+