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