5 my @map = map { chomp; [ split // ] } <>;
6 my $xmax = $#{ $map[0] };
16 for my $y (0 .. $ymax) {
17 for my $x (0 .. $xmax) {
18 next if $map[$y][$x] ne 'O';
20 while ($y1 && $map[$y1-1][$x] eq '.') {
22 $map[--$y1][$x] = 'O';
27 @map = map { # rotate clockwise
29 [ map { $map[$_][$x] } reverse 0 .. $ymax ]
31 ($xmax, $ymax) = ($ymax, $xmax);
34 $key = join("\n", map { join('', @$_) } @map);
38 for my $y (0 .. $ymax) {
39 for my $x (0 .. $xmax) {
40 $sum += $ymax + 1 - $y if $map[$y][$x] eq 'O';
45 $score[$round] = $sum;
48 my $remains = (1000000000 - $round) % ($round - $seen{$key});
49 say $score[$seen{$key} + $remains];