aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Pankoff <ccntrq@screenri.de>2021-11-24 18:40:27 +0100
committerAlexander Pankoff <ccntrq@screenri.de>2021-11-24 18:40:27 +0100
commit9b2be2ba1121ac6a5ea2ec93374a8beb846e2b19 (patch)
tree5798788093d6eb4488a0b1d96fcded38ddaf9816
parent823c7a6d0efe08c4182a99e11df57d7a4ab7b4c2 (diff)
downloadperlweeklychallenge-club-9b2be2ba1121ac6a5ea2ec93374a8beb846e2b19.tar.gz
perlweeklychallenge-club-9b2be2ba1121ac6a5ea2ec93374a8beb846e2b19.tar.bz2
perlweeklychallenge-club-9b2be2ba1121ac6a5ea2ec93374a8beb846e2b19.zip
Add implementation for challenge 140 task 01
-rw-r--r--challenge-140/alexander-pankoff/perl/ch-1.pl54
1 files changed, 54 insertions, 0 deletions
diff --git a/challenge-140/alexander-pankoff/perl/ch-1.pl b/challenge-140/alexander-pankoff/perl/ch-1.pl
new file mode 100644
index 0000000000..37981f5430
--- /dev/null
+++ b/challenge-140/alexander-pankoff/perl/ch-1.pl
@@ -0,0 +1,54 @@
+use strict;
+use warnings;
+use feature qw'say signatures';
+no warnings 'experimental::signatures';
+
+use List::Util qw(max);
+
+run() unless caller();
+
+sub run() {
+ my $a = prompt_for_binary('a');
+ my $b = prompt_for_binary('b');
+
+ say "Result:";
+ say( add_binarys( $a, $b ) );
+
+}
+
+sub add_binarys ( $a, $b ) {
+
+ my @a_digits = reverse split( '', $a );
+ my @b_digits = reverse split( '', $b );
+
+ # we walk the digits of the binary numbers starting with the least
+ # significant digit, add the digits individually, carry the carry around
+ # with us and build our result from the back
+ my ( $out, $carry ) = ( '', 0 );
+ for ( 0 .. max( $#a_digits, $#b_digits ) ) {
+ my $res;
+ ( $res, $carry ) =
+ add_binary_digits( $a_digits[$_] // 0, $b_digits[$_] // 0, $carry );
+ $out = $res . $out;
+ }
+
+ return $carry ? $carry . $out : $out;
+}
+
+sub add_binary_digits ( $a, $b, $carry ) {
+ my $c = $a + $b + $carry;
+
+ return $c >= 3 ? ( 1, 1 ) : $c == 2 ? ( 0, 1 ) : ( $c, 0 );
+
+}
+
+sub prompt_for_binary($name) {
+ say "Enter binary number $name";
+ chomp( my $number = <STDIN> );
+ if ( $number !~ m/^[01]+$/ ) {
+ say "Invalid binary number.";
+ return prompt_for_binary($name);
+ }
+
+ return $number;
+}