## Perl Weekly Challenge 140: Add Binary

These are some answers to the Week 140 of the Perl Weekly Challenge organized by Mohammad S. Anwar.

Spoiler Alert: This weekly challenge deadline is due in a few days from now (on November 28, 2021 at 24:00). This blog post offers some solutions to this challenge, please don’t read on if you intend to complete the challenge on your own.

You are given two decimal-coded binary numbers, `\$a` and `\$b`.

Write a script to simulate the addition of the given binary numbers.

The script should simulate something like `\$a + \$b`. (operator overloading)

Example 1:

``````Input: \$a = 11; \$b = 1;
Output: 100
``````

Example 2:

``````Input: \$a = 101; \$b = 1;
Output: 110
``````

Example 3:

``````Input: \$a = 100; \$b = 11;
Output: 111
``````

In Raku, we simply convert the binary strings to regular integers, using the parse-base method, add these integers with normal addition, and convert the result back to a binary string with the base built-in method.

``````use v6;

(\$a.Str.parse-base(2) + \$b.Str.parse-base(2)).base(2);
}
for (11, 1), (101, 1), (100, 11), (1011,11) -> \$test {
say "\$test\t=> ", add-bin \$test[0], \$test[1];
}
``````

This scipt displays the following output:

``````\$ raku ./add-binary.raku
11 1    => 100
101 1   => 110
100 11  => 111
``````

In Perl, we implemented manually an `add_bin` subroutine to perform direct addition of decimal-coded binary numbers.

``````use strict;
use warnings;
use feature "say";

my (\$c, \$d) = @_;
(\$d, \$c) = (\$c, \$d) if \$d > \$c;
my \$result = "";
my @c = reverse split //, \$c;
my @d = reverse split //, \$d;
my \$carry = 0;   # carry over
for my \$i (0 .. \$#c){
my \$e = \$d[\$i] // 0;
my \$t = \$c[\$i] + \$e + \$carry;
\$result .= \$t and \$carry = 0 if \$t <= 1;
if (\$t == 2) {
\$result .= 0;
\$carry = 1;
} elsif (\$t == 3) {
\$result .= 1;
\$carry = 1;
}
}
\$result .= (\$carry == 0 ? '' : \$carry == 1 ? 1 : '01');
return scalar reverse \$result;
}
for my \$test ( [11, 1], [101, 1], [100, 11], [100, 100], [1011, 11]) {
}
``````

This script displays the following output:

``````\$ perl  ./add-binary.pl
11 1    => 100
101 1   => 110
100 11  => 111
100 100 => 1000
1011 11 => 1110
``````

I have no time now to complete this task and will be busy most of the weekend. I might be able to complete it on Sunday evening and will post accordingly if I do.

Update: I manage to complete Task 2 in time. Please find below a link to my new blog post providing Raku and Perl solutions to task 2 of PWC 140:

http://blogs.perl.org/users/laurent_r/2021/11/perl-weekly-challenge-140-multiplication-tables.html

## Wrapping up

The next week Perl Weekly Challenge will start soon. If you want to participate in this challenge, please check https://perlweeklychallenge.org/ and make sure you answer the challenge before 23:59 BST (British summer time) on December 5, 2021. And, please, also spread the word about the Perl Weekly Challenge if you can.