diff options
| author | Alexander Pankoff <ccntrq@screenri.de> | 2021-11-24 18:40:27 +0100 |
|---|---|---|
| committer | Alexander Pankoff <ccntrq@screenri.de> | 2021-11-24 18:40:27 +0100 |
| commit | 9b2be2ba1121ac6a5ea2ec93374a8beb846e2b19 (patch) | |
| tree | 5798788093d6eb4488a0b1d96fcded38ddaf9816 | |
| parent | 823c7a6d0efe08c4182a99e11df57d7a4ab7b4c2 (diff) | |
| download | perlweeklychallenge-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.pl | 54 |
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; +} |
