summary refs log tree commit diff homepage
path: root/2023/day09.pl
blob: c9814c93882b763fc0972bccf821984c000ede24 (plain) (blame)
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
use strict;
use warnings;
use List::Util qw(any);
sub diff {
	my @diff;
	for my $i (0 .. $#_-1) {
		push @diff, $_[$i+1] - $_[$i];
	}
	@diff;
}
sub extrapolate {
	my @diffs = (\@_);
	while (any { $_ != 0 } @{$diffs[0]}) {
		unshift @diffs, [diff(@{$diffs[0]})];
	}
	unshift @{$diffs[0]}, 0;
	push @{$diffs[0]}, 0;
	for (1 .. $#diffs) {
		unshift @{$diffs[$_]}, $diffs[$_][0] - $diffs[$_-1][0];
		push @{$diffs[$_]}, $diffs[$_-1][-1] + $diffs[$_][-1];
	}
	($diffs[-1][0], $diffs[-1][-1]);
}
my ($sum, $sum2) = (0, 0);
while (<>) {
	chomp;
	my @history = split(/ /);
	my ($first, $last) = extrapolate(@history);
	$sum += $last;
	$sum2 += $first;
}
print $sum, "\n";
print $sum2, "\n";