From 198832014560d0ef9c7f1940fddda5fd263b695f Mon Sep 17 00:00:00 2001 From: 3ter Date: Tue, 23 Jun 2020 21:36:00 +0200 Subject: add first challenge --- challenge-066/3ter/ch-1.pl | 56 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 challenge-066/3ter/ch-1.pl (limited to 'challenge-066') 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; +} + -- cgit From d633ef1b79ff337337e5d186ff74ba3325bf367c Mon Sep 17 00:00:00 2001 From: 3ter Date: Tue, 23 Jun 2020 22:29:33 +0200 Subject: add second challenge --- challenge-066/3ter/ch-2.pl | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 challenge-066/3ter/ch-2.pl (limited to 'challenge-066') 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; +} + -- cgit