aboutsummaryrefslogtreecommitdiff
path: root/challenge-144/alexander-pankoff/perl/ch-2.pl
blob: 34c0bc86748b0ad082dde79828f9d180bcdc0a54 (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
50
51
#!/usr/bin/env perl
use strict;
use warnings;
use feature qw'say signatures';
no warnings qw'experimental::signatures';

use File::Spec;
use FindBin;
use List::Util qw(min sum);

use constant DEBUG => $ENV{DEBUG} // 0;

package Challenge141Task02 {
    require File::Spec->catfile( $FindBin::RealBin,
        qw'.. .. .. challenge-141 alexander-pankoff perl ch-2.pl' );
}

run() unless caller();

sub run() {
    my $u = Challenge141Task02::prompt_for_integer('u');

    my $v;
    do {
        $v = Challenge141Task02::prompt_for_integer('v');
    } while ( $v <= $u && say("'v' must be greater than 'u' ($u)") );

    say join( ', ', generate_ulam_sequence( $u, $v ) );
}

sub generate_ulam_sequence ( $u, $v, $length = 10 ) {
    my @sequence = ( $u, $v );
    my @sums     = ( $u + $v );

    while ( @sequence < $length ) {
        @sums = grep { $_ > $sequence[-1] } @sums;
        my @unique_sums = remove_dupes(@sums);
        my $new         = min(@unique_sums);
        push @sums, ( map { $_ + $new } @sequence );
        push @sequence, $new;
    }

    return @sequence;
}

sub remove_dupes(@xs) {
    my %count;
    $count{$_}++ for @xs;
    return grep { $count{$_} == 1 } keys %count;
}