aboutsummaryrefslogtreecommitdiff
path: root/challenge-222/barroff/perl/ch-1.pl
blob: c671043ea7ae6e3a6bb3e61a2125f7b5821f24fc (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
44
45
46
47
48
49
#!/usr/bin/env perl

use v5.36;
use strict;
use warnings;

use experimental qw(switch);

use List::Util qw( uniq );

sub last_member (@numbers) {
    return 0 unless @numbers;
    return $numbers[0] if @numbers == 1;
    my @sorted_numbers = sort { $a < $b } @numbers;
    $sorted_numbers[0] == $sorted_numbers[1]
      ? last_member( @sorted_numbers[ 2 .. -1 ] )
      : last_member( @sorted_numbers[ 2 .. -1 ],
        $sorted_numbers[0] - $sorted_numbers[1] );
}

sub last_member2 (@numbers) {
    given ( scalar @numbers ) {
        when ( $_ == 0 ) { return 0 }
        when ( $_ == 1 ) { return $numbers[0] }
        default {
            my @sorted_numbers = sort { $a < $b } @numbers;
            return $sorted_numbers[0] == $sorted_numbers[1]
              ? last_member( @sorted_numbers[ 2 .. -1 ] )
              : last_member( @sorted_numbers[ 2 .. -1 ],
                $sorted_numbers[0] - $sorted_numbers[1] );
        }
    }
}

#| Run test cases
sub MAIN() {
    use Test2::V0 qw( is plan );
    plan 6;

    is last_member( 2, 7, 4, 1, 8, 1 ), 1, 'works for (2, 7, 4, 1, 8, 1)';
    is last_member(1),                  1, 'works for (1)';
    is last_member( 1, 1 ),             0, 'works for (1, 1)';

    is last_member2( 2, 7, 4, 1, 8, 1 ), 1, 'works for (2, 7, 4, 1, 8, 1)';
    is last_member2(1),                  1, 'works for (1)';
    is last_member2( 1, 1 ),             0, 'works for (1, 1)';
}

MAIN();