From f4eeeed382a60317c349a65658019cf110dde1ab Mon Sep 17 00:00:00 2001 From: dasJake Date: Mon, 22 Nov 2021 20:43:56 +0100 Subject: 140 BUGGY add decimal_to_binary subroutine --- challenge-140/jake/perl/ch-1.pl | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 challenge-140/jake/perl/ch-1.pl diff --git a/challenge-140/jake/perl/ch-1.pl b/challenge-140/jake/perl/ch-1.pl new file mode 100644 index 0000000000..b165ee6dcf --- /dev/null +++ b/challenge-140/jake/perl/ch-1.pl @@ -0,0 +1,40 @@ +#!/r/bin/perl +use strict; +use warnings; + +# with this script you can add 2 binary numbers and get their sum as binary number +# https://theweeklychallenge.org/blog/perl-weekly-challenge-140/#TASK1 + +# get input +print "decimal number a: "; +my $a = ; +chomp $a; +my $power_n = 0; +my $a_binary += decimal_to_binary ( $power_n, $a ); +printf ( "binary number a: %i\n", $a_binary ); + +# convert dec to bin +sub decimal_to_binary { + my ( $power, $decimal_number ) = @_; + if ( $decimal_number == 0 ) { + return 0; + #exit; + } + elsif ( $decimal_number == 2**$power ) { + print "if\n$decimal_number\n$power\n\n"; + return 10**$power; + #exit; + } + elsif ( $decimal_number <= 2**($power+1) ) { + $power++; + decimal_to_binary ( $power, $decimal_number ); + print "elsif\n$decimal_number\n$power\n\n"; + } + else { + return 10**($power+1); + $decimal_number -= 2**($power+1); + $power = 0; + print "else\n$decimal_number\n$power\n\n"; + decimal_to_binary ( $power, $decimal_number ); + } +} \ No newline at end of file -- cgit From 59c35349871502dd9acedfcf24a01e24fc89ec54 Mon Sep 17 00:00:00 2001 From: dasJake Date: Mon, 22 Nov 2021 23:20:00 +0100 Subject: 140 add helper binary_to_decimal --- challenge-140/jake/perl/bin2dec.pl | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 challenge-140/jake/perl/bin2dec.pl diff --git a/challenge-140/jake/perl/bin2dec.pl b/challenge-140/jake/perl/bin2dec.pl new file mode 100644 index 0000000000..7fecc9ce09 --- /dev/null +++ b/challenge-140/jake/perl/bin2dec.pl @@ -0,0 +1,30 @@ +#!/r/bin/perl +use strict; +use warnings; + +# get input +print "binary number a: "; +my $a = ; +chomp $a; + +my $a_decimal = binary_to_decimal ( $a, 0, 0 ); +print "$a_decimal\n"; + +sub binary_to_decimal { + my ( $binary_number, $power, $acc, $tail ) = @_; + print "begin sub with $binary_number\n"; + return $acc if $binary_number eq ''; + $tail = chop ($binary_number); + if ( $tail == 1 ) { + print "if with $binary_number\n"; + $acc += 2**$power; + $power++; + return binary_to_decimal ( $binary_number, $power, $acc ); + } + + if ( $tail == 0 ) { + print "elsf with $binary_number\n"; + $power++; + return binary_to_decimal ( $binary_number, $power, $acc ); + } +} \ No newline at end of file -- cgit From 5e5a7ef993605b2d6abbcfe7e119482a04a0f7a2 Mon Sep 17 00:00:00 2001 From: dasJake Date: Tue, 23 Nov 2021 20:24:31 +0100 Subject: 140 debug decimal_to_binary sub --- challenge-140/jake/perl/ch-1.pl | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/challenge-140/jake/perl/ch-1.pl b/challenge-140/jake/perl/ch-1.pl index b165ee6dcf..b0c78536ed 100644 --- a/challenge-140/jake/perl/ch-1.pl +++ b/challenge-140/jake/perl/ch-1.pl @@ -15,26 +15,24 @@ printf ( "binary number a: %i\n", $a_binary ); # convert dec to bin sub decimal_to_binary { - my ( $power, $decimal_number ) = @_; + my ( $power, $decimal_number, $binary_quantum ) = @_; + if ( $decimal_number == 0 ) { return 0; - #exit; - } - elsif ( $decimal_number == 2**$power ) { - print "if\n$decimal_number\n$power\n\n"; - return 10**$power; - #exit; } - elsif ( $decimal_number <= 2**($power+1) ) { - $power++; - decimal_to_binary ( $power, $decimal_number ); - print "elsif\n$decimal_number\n$power\n\n"; + + if ( $decimal_number == 2**$power ) { + $binary_quantum += 10**$power; + return $binary_quantum; } - else { - return 10**($power+1); - $decimal_number -= 2**($power+1); + + if ( $decimal_number > 2**$power && $decimal_number < 2**( $power +1 ) ) { + $binary_quantum += 10**$power; + $decimal_number -= 2**$power; $power = 0; - print "else\n$decimal_number\n$power\n\n"; - decimal_to_binary ( $power, $decimal_number ); + return decimal_to_binary ( $power, $decimal_number, $binary_quantum ); } + + $power++; + return decimal_to_binary ( $power, $decimal_number, $binary_quantum ); } \ No newline at end of file -- cgit From 13ad8858a5e089fdf92bc43ac28e197d2a041062 Mon Sep 17 00:00:00 2001 From: dasJake Date: Tue, 23 Nov 2021 20:56:18 +0100 Subject: 140 add _decimal_to_binary to seperate input --- challenge-140/jake/perl/ch-1.pl | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/challenge-140/jake/perl/ch-1.pl b/challenge-140/jake/perl/ch-1.pl index b0c78536ed..8d16cefb0d 100644 --- a/challenge-140/jake/perl/ch-1.pl +++ b/challenge-140/jake/perl/ch-1.pl @@ -9,12 +9,17 @@ use warnings; print "decimal number a: "; my $a = ; chomp $a; -my $power_n = 0; -my $a_binary += decimal_to_binary ( $power_n, $a ); +my $a_binary = decimal_to_binary ( $a ); printf ( "binary number a: %i\n", $a_binary ); # convert dec to bin sub decimal_to_binary { + my ( $decimal ) = @_; + + return _decimal_to_binary ( 0, $decimal ); +} + +sub _decimal_to_binary { my ( $power, $decimal_number, $binary_quantum ) = @_; if ( $decimal_number == 0 ) { @@ -30,9 +35,9 @@ sub decimal_to_binary { $binary_quantum += 10**$power; $decimal_number -= 2**$power; $power = 0; - return decimal_to_binary ( $power, $decimal_number, $binary_quantum ); + return _decimal_to_binary ( $power, $decimal_number, $binary_quantum ); } $power++; - return decimal_to_binary ( $power, $decimal_number, $binary_quantum ); + return _decimal_to_binary ( $power, $decimal_number, $binary_quantum ); } \ No newline at end of file -- cgit From afec256a9d3aadf2e7f97a8911bb6ee96ce9f491 Mon Sep 17 00:00:00 2001 From: dasJake Date: Tue, 23 Nov 2021 21:33:45 +0100 Subject: 140 refactor decimal_to_binary --- challenge-140/jake/perl/ch-1.pl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/challenge-140/jake/perl/ch-1.pl b/challenge-140/jake/perl/ch-1.pl index 8d16cefb0d..59f7ccbecd 100644 --- a/challenge-140/jake/perl/ch-1.pl +++ b/challenge-140/jake/perl/ch-1.pl @@ -6,11 +6,11 @@ use warnings; # https://theweeklychallenge.org/blog/perl-weekly-challenge-140/#TASK1 # get input -print "decimal number a: "; -my $a = ; -chomp $a; -my $a_binary = decimal_to_binary ( $a ); -printf ( "binary number a: %i\n", $a_binary ); +print "decimal number: "; +my $decimal_input = ; +chomp $decimal_input; +my $a_binary = decimal_to_binary ( $decimal_input ); +printf ( "binary number: %i\n", $a_binary ); # convert dec to bin sub decimal_to_binary { -- cgit From 7273b996d81ab9cc525f3cc5163a9ff135ede306 Mon Sep 17 00:00:00 2001 From: dasJake Date: Tue, 23 Nov 2021 21:42:48 +0100 Subject: 140 refactor binary_to_decimal --- challenge-140/jake/perl/bin2dec.pl | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/challenge-140/jake/perl/bin2dec.pl b/challenge-140/jake/perl/bin2dec.pl index 7fecc9ce09..6514d88e7d 100644 --- a/challenge-140/jake/perl/bin2dec.pl +++ b/challenge-140/jake/perl/bin2dec.pl @@ -3,28 +3,33 @@ use strict; use warnings; # get input -print "binary number a: "; -my $a = ; -chomp $a; +print "binary number: "; +my $binary_input = ; +chomp $binary_input; -my $a_decimal = binary_to_decimal ( $a, 0, 0 ); +my $a_decimal = binary_to_decimal ( $binary_input ); print "$a_decimal\n"; sub binary_to_decimal { + my ( $binary ) = @_; + + return _binary_to_decimal ( $binary, 0, 0 ); +} + +sub _binary_to_decimal { my ( $binary_number, $power, $acc, $tail ) = @_; - print "begin sub with $binary_number\n"; return $acc if $binary_number eq ''; + $tail = chop ($binary_number); + if ( $tail == 1 ) { - print "if with $binary_number\n"; $acc += 2**$power; $power++; - return binary_to_decimal ( $binary_number, $power, $acc ); + return _binary_to_decimal ( $binary_number, $power, $acc ); } if ( $tail == 0 ) { - print "elsf with $binary_number\n"; $power++; - return binary_to_decimal ( $binary_number, $power, $acc ); + return _binary_to_decimal ( $binary_number, $power, $acc ); } } \ No newline at end of file -- cgit From fe6ef5470946dc22efc1d04a61af03f7b3559e22 Mon Sep 17 00:00:00 2001 From: dasJake Date: Tue, 23 Nov 2021 23:33:15 +0100 Subject: 140 add binary_to_decimal sub and addition --- challenge-140/jake/perl/ch-1.pl | 58 +++++++++++++++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 8 deletions(-) diff --git a/challenge-140/jake/perl/ch-1.pl b/challenge-140/jake/perl/ch-1.pl index 59f7ccbecd..112b2e33b9 100644 --- a/challenge-140/jake/perl/ch-1.pl +++ b/challenge-140/jake/perl/ch-1.pl @@ -5,14 +5,31 @@ use warnings; # with this script you can add 2 binary numbers and get their sum as binary number # https://theweeklychallenge.org/blog/perl-weekly-challenge-140/#TASK1 -# get input -print "decimal number: "; -my $decimal_input = ; -chomp $decimal_input; -my $a_binary = decimal_to_binary ( $decimal_input ); -printf ( "binary number: %i\n", $a_binary ); - -# convert dec to bin +# get input of 2 binary numbers + +print "binary number a: "; +my $binary_input_a = ; +print "binary number b: "; +my $binary_input_b = ; +chomp ( $binary_input_a, $binary_input_b ); + + +# convert binaries to decimals + +my $a_decimal = binary_to_decimal ( $binary_input_a ); +my $b_decimal = binary_to_decimal ( $binary_input_b ); + + +# perform regular addition on decimals + +my $result_decimal = $a_decimal + $b_decimal; + + +# convert decimal results to binary + +my $result_binary = decimal_to_binary ( $result_decimal ); +print "$result_binary\n"; + sub decimal_to_binary { my ( $decimal ) = @_; @@ -40,4 +57,29 @@ sub _decimal_to_binary { $power++; return _decimal_to_binary ( $power, $decimal_number, $binary_quantum ); +} + +sub binary_to_decimal { + my ( $binary ) = @_; + + return _binary_to_decimal ( $binary, 0, 0 ); +} + +sub _binary_to_decimal { + my ( $binary_number, $power, $acc, $tail ) = @_; + + return $acc if $binary_number eq ''; + + $tail = chop ($binary_number); + + if ( $tail == 1 ) { + $acc += 2**$power; + $power++; + return _binary_to_decimal ( $binary_number, $power, $acc ); + } + + if ( $tail == 0 ) { + $power++; + return _binary_to_decimal ( $binary_number, $power, $acc ); + } } \ No newline at end of file -- cgit From 05436a73750a6f51db4bcae860c1991e83179191 Mon Sep 17 00:00:00 2001 From: dasJake Date: Tue, 23 Nov 2021 23:35:56 +0100 Subject: 140 add comments --- challenge-140/jake/perl/ch-1.pl | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/challenge-140/jake/perl/ch-1.pl b/challenge-140/jake/perl/ch-1.pl index 112b2e33b9..7e199720aa 100644 --- a/challenge-140/jake/perl/ch-1.pl +++ b/challenge-140/jake/perl/ch-1.pl @@ -30,6 +30,19 @@ my $result_decimal = $a_decimal + $b_decimal; my $result_binary = decimal_to_binary ( $result_decimal ); print "$result_binary\n"; +### +# convert decimals to binaries +# +# each n-th power of 2 in decimal translates to the n-th power of 10 in binary: +# n=0: 1>1 | n=1: 2>10 | n=2: 4>100 and so on, we know the drill. +# For conversion, we first determine the largest power contained in the decimal number. +# Next, we subtract this power from our decimal and determine the largest power in this 'remainder'. +# This is repeated until there is no remainder left. +# For each n-th power of 2 we add a binary quantum to an accumulator. +# At the end of our 'run for power' this accumulator is our binary equivalent to our decimal. +### + +# container sub so main needs to pass only 1 argument sub decimal_to_binary { my ( $decimal ) = @_; @@ -39,15 +52,24 @@ sub decimal_to_binary { sub _decimal_to_binary { my ( $power, $decimal_number, $binary_quantum ) = @_; + # special case of 0 if ( $decimal_number == 0 ) { return 0; } + # any decimal or remainder hitting exactly an n-th power of 2 will eventually finish the run here if ( $decimal_number == 2**$power ) { $binary_quantum += 10**$power; return $binary_quantum; } + # if a number will not finish at the previous step, we check if the number is between the current power or the next one. + # if it is, we know the largest power to 2 in this number is the current power, so we have to add this power to 10 to our binary quantum accumulator. + # we then take the remainder (what comes on top of the current power to 2) and investigate its powers. + # p.e. our decimal is 9. + # since 2^3 < 9 < 2^4, we add 10^3 to our binary quant. + # then we perform 9-2^3 = 1 to get the remainder which needs to be quantized itself. + # 1 is our remaining decimal, which we re-investigate starting again with power = 0. if ( $decimal_number > 2**$power && $decimal_number < 2**( $power +1 ) ) { $binary_quantum += 10**$power; $decimal_number -= 2**$power; @@ -55,10 +77,22 @@ sub _decimal_to_binary { return _decimal_to_binary ( $power, $decimal_number, $binary_quantum ); } + # this operation is needed whenever our decimal is larger than our current power to 2 and the next one. $power++; return _decimal_to_binary ( $power, $decimal_number, $binary_quantum ); } +### +# convert binaries to decimals +# +# We investigate each digit of our binary number starting from the back. +# Every digit represents the next power to 2, so we count the digits as we run towards the front of the binary. +# For each digit we check if it's 1 or 0. +# Whenever we hit a 1 we use the digit count as power to 2 and add the result to our accumulator. +# Once we reach the beginning of our binary, we will have accumulated our decimal. +### + +# container sub so main needs to pass only 1 argument sub binary_to_decimal { my ( $binary ) = @_; @@ -68,6 +102,7 @@ sub binary_to_decimal { sub _binary_to_decimal { my ( $binary_number, $power, $acc, $tail ) = @_; + # once we reach the beginning of our binary the string will be empty, since in each iteration we chop the tail off of our binary return $acc if $binary_number eq ''; $tail = chop ($binary_number); -- cgit From b5c6839b3d7e0e19090b54f8308af36092a90ee8 Mon Sep 17 00:00:00 2001 From: dasJake Date: Wed, 24 Nov 2021 23:27:51 +0100 Subject: 140 remove helper bin2dec.pl from master --- challenge-140/jake/perl/bin2dec.pl | 35 ----------------------------------- 1 file changed, 35 deletions(-) delete mode 100644 challenge-140/jake/perl/bin2dec.pl diff --git a/challenge-140/jake/perl/bin2dec.pl b/challenge-140/jake/perl/bin2dec.pl deleted file mode 100644 index 6514d88e7d..0000000000 --- a/challenge-140/jake/perl/bin2dec.pl +++ /dev/null @@ -1,35 +0,0 @@ -#!/r/bin/perl -use strict; -use warnings; - -# get input -print "binary number: "; -my $binary_input = ; -chomp $binary_input; - -my $a_decimal = binary_to_decimal ( $binary_input ); -print "$a_decimal\n"; - -sub binary_to_decimal { - my ( $binary ) = @_; - - return _binary_to_decimal ( $binary, 0, 0 ); -} - -sub _binary_to_decimal { - my ( $binary_number, $power, $acc, $tail ) = @_; - return $acc if $binary_number eq ''; - - $tail = chop ($binary_number); - - if ( $tail == 1 ) { - $acc += 2**$power; - $power++; - return _binary_to_decimal ( $binary_number, $power, $acc ); - } - - if ( $tail == 0 ) { - $power++; - return _binary_to_decimal ( $binary_number, $power, $acc ); - } -} \ No newline at end of file -- cgit