aboutsummaryrefslogtreecommitdiff
path: root/challenge-129/e-choroba/perl/ch-2.pl
blob: 3aee8a022ddb23ea2b367b09f67f1ff336e5fa19 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/usr/bin/perl
use warnings;
use strict;

sub add_linked_lists {
    my ($l1, $l2) = @_;

    my $carry = 0;
    my $reversed;

    while (@$l1 || @$l2 || $carry) {
        my $e1 = shift @$l1 // 0;
        $l1    = shift @$l1 || [];
        my $e2 = shift @$l2 // 0;
        $l2    = shift @$l2 || [];

        my $r = $e1 + $e2 + $carry;
        $carry = int($r / 10);
        $r %= 10;

        $reversed = $reversed ? [$r, $reversed] : [$r];
    }
    return [] unless $reversed;

    my $result = [shift @$reversed];
    while (@$reversed) {
        $reversed =  shift @$reversed;
        $result   = [shift @$reversed, $result];
    }
    return $result
}

use Test2::V0;
plan 3;

is add_linked_lists([3, [2, [1]]],[1, [2, [3]]]),
    [4, [4, [4]]], 'Example 1';

is add_linked_lists([5, [4, [3, [2, [1]]]]], [5, [5, [6]]]),
    [0, [0, [0, [3, [1]]]]], 'Example 2';

is add_linked_lists([5, [9]], [5]),
    [0, [0, [1]]], 'Carry not lost even when both lists are exhausted';