use strict; use warnings; use List::Util qw(min max sum); my @crabs = sort { $a <=> $b } split(/,/, <>); my $median = $crabs[@crabs / 2]; my $cost = sum(map { abs($_ - $median) } @crabs); print "$cost\n"; sub cost { my ($to, $from) = @_; my $n = abs($from - $to); $n * ($n + 1) / 2; } sub totalCost { my $x = shift; sum(map { cost($x, $_) } @_); } my $min = min(map { totalCost($_, @crabs) } min(@crabs)..max(@crabs)); print "$min\n";