4 use experimental 'multidimensional';
16 push @map, [ split // ];
18 my $xmax = $#{ $map[0] };
21 my @dx = (1, 0, -1, 0);
22 my @dy = (0, 1, 0, -1);
26 my @todo = [ $sx, $sy ];
30 for my $step (0 .. 1000) {
34 $oddeven[$step & 1]++;
36 my $nx = $x + $dx[$d];
37 my $ny = $y + $dy[$d];
38 next if $map[$ny % ($ymax + 1)][$nx % ($xmax + 1)] ne '.';
39 next if $seen{$nx,$ny}++;
40 push @ntodo, [$nx, $ny];
44 push @sums, $oddeven[$step & 1];
54 for my $i ($start .. ($#sums - 3*$period)) {
56 push @d, $sums[$i+($_+1)*$period]
59 next PERIOD if $d[1]-$d[0] != $d[2]-$d[1];
64 $start += ($steps - $start) % $period;
65 my $a = $sums[$start+$period] - $sums[$start];
66 my $d = $sums[$start+2*$period] - $sums[$start+$period] - $a;
67 my $n = ($steps - $start) / $period;
68 say $sums[$start] + (2*$a + ($n-1)*$d)*$n/2;