aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author3ter <dritterseinistalles@gmail.com>2020-06-23 21:36:00 +0200
committer3ter <dritterseinistalles@gmail.com>2020-06-23 21:36:00 +0200
commit198832014560d0ef9c7f1940fddda5fd263b695f (patch)
treee2ed3c98e9b2402a7fa52ecac197146b71974457
parentf68b9cf5d79b8bd60690fd12d7bc12f48e5d176f (diff)
downloadperlweeklychallenge-club-198832014560d0ef9c7f1940fddda5fd263b695f.tar.gz
perlweeklychallenge-club-198832014560d0ef9c7f1940fddda5fd263b695f.tar.bz2
perlweeklychallenge-club-198832014560d0ef9c7f1940fddda5fd263b695f.zip
add first challenge
-rw-r--r--challenge-066/3ter/ch-1.pl56
1 files changed, 56 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;
+}
+