5 my @map = map { chomp; [ split // ] } <>;
6 my $xmax = $#{ $map[0] };
18 for my $y (1 .. $ymax) {
19 for my $x (0 .. $xmax) {
20 if ($map[$y][$x] eq 'O' && $map[$y-1][$x] eq '.') {
31 for my $x (1 .. $xmax) {
32 for my $y (0 .. $ymax) {
33 if ($map[$y][$x] eq 'O' && $map[$y][$x-1] eq '.') {
44 for my $y (reverse 0 .. $ymax-1) {
45 for my $x (0 .. $xmax) {
46 if ($map[$y][$x] eq 'O' && $map[$y+1][$x] eq '.') {
57 for my $x (reverse 0 .. $xmax-1) {
58 for my $y (0 .. $ymax) {
59 if ($map[$y][$x] eq 'O' && $map[$y][$x+1] eq '.') {
68 # say join('', @$_) for @map;
71 for my $y (0 .. $ymax) {
72 for my $x (0 .. $xmax) {
73 $sum += $ymax + 1 - $y if $map[$y][$x] eq 'O';
77 $rounds[$round] = $sum;
78 say "round $round sum $sum";
79 my $map = join("\n", map { join('', @$_) } @map);
81 say "round $round seen also at $seen{$map}";
82 my $period = $round - $seen{$map};
83 my $total = 1000000000;
86 say "looking at ", $round - $period + $total;
87 say $rounds[$round-$period+$total];