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