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.

Task 1: Add Binary

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

Add Binary in Raku

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;

sub add-bin ($a, $b) {
    ($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

Add Binary in Perl

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";

sub add_bin {
    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]) {
    say "@$test\t=> ", add_bin @$test;
}

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

Task 2: Multiplication Table

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:

https://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.

Leave a comment

About laurent_r

user-pic I am the author of the "Think Perl 6" book (O'Reilly, 2017) and I blog about the Perl 5 and Raku programming languages.