my $ymax = $#map;
my $sum;
-my $retry = 1;
-while ($retry) {
- $retry = 0;
-for my $y (1 .. $ymax) {
+for my $y (0 .. $ymax) {
for my $x (0 .. $xmax) {
- if ($map[$y][$x] eq 'O' && $map[$y-1][$x] eq '.') {
- $map[$y-1][$x] = 'O';
+ next if $map[$y][$x] ne 'O';
+ my $y1 = $y;
+ $y1-- while $y1 && $map[$y1-1][$x] eq '.';
+ if ($y1 != $y) {
+ $map[$y1][$x] = 'O';
$map[$y][$x] = '.';
- $retry = 1;
}
+ $sum += $ymax + 1 - $y1;
}
}
-}
-
-say join('', @$_) for @map;
-for my $y (0 .. $ymax) {
- for my $x (0 .. $xmax) {
- $sum += $ymax + 1 - $y if $map[$y][$x] eq 'O';
- }
-}
+say join('', @$_) for @map;
say $sum;