]> www.fi.muni.cz Git - aoc.git/commitdiff
Day 14: ugly but fast written solution
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Thu, 14 Dec 2023 07:04:10 +0000 (08:04 +0100)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Thu, 14 Dec 2023 07:05:00 +0000 (08:05 +0100)
2023/27.pl [new file with mode: 0755]
2023/28.pl [new file with mode: 0755]

diff --git a/2023/27.pl b/2023/27.pl
new file mode 100755 (executable)
index 0000000..ab6cbcd
--- /dev/null
@@ -0,0 +1,31 @@
+#!/usr/bin/perl -w
+
+use v5.38;
+
+my @map = map { chomp; [ split // ] } <>;
+my $xmax = $#{ $map[0] };
+my $ymax = $#map;
+
+my $sum;
+my $retry = 1;
+while ($retry) {
+       $retry = 0;
+for my $y (1 .. $ymax) {
+       for my $x (0 .. $xmax) {
+               if ($map[$y][$x] eq 'O' && $map[$y-1][$x] eq '.') {
+                       $map[$y-1][$x] = 'O';
+                       $map[$y][$x] = '.';
+                       $retry = 1;
+               }
+       }
+}
+}
+       
+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 $sum;
diff --git a/2023/28.pl b/2023/28.pl
new file mode 100755 (executable)
index 0000000..7135ca5
--- /dev/null
@@ -0,0 +1,92 @@
+#!/usr/bin/perl -w
+
+use v5.38;
+
+my @map = map { chomp; [ split // ] } <>;
+my $xmax = $#{ $map[0] };
+my $ymax = $#map;
+
+my %seen;
+my @rounds;
+my $round;
+while (1) {
+       $round++;
+       my $retry;
+       $retry = 1;
+       while ($retry) {
+               $retry = 0;
+               for my $y (1 .. $ymax) {
+                       for my $x (0 .. $xmax) {
+                               if ($map[$y][$x] eq 'O' && $map[$y-1][$x] eq '.') {
+                                       $map[$y-1][$x] = 'O';
+                                       $map[$y][$x] = '.';
+                                       $retry = 1;
+                               }
+                       }
+               }
+       }
+       $retry = 1;
+       while ($retry) {
+               $retry = 0;
+               for my $x (1 .. $xmax) {
+                       for my $y (0 .. $ymax) {
+                               if ($map[$y][$x] eq 'O' && $map[$y][$x-1] eq '.') {
+                                       $map[$y][$x-1] = 'O';
+                                       $map[$y][$x] = '.';
+                                       $retry = 1;
+                               }
+                       }
+               }
+       }
+       $retry = 1;
+       while ($retry) {
+               $retry = 0;
+               for my $y (reverse 0 .. $ymax-1) {
+                       for my $x (0 .. $xmax) {
+                               if ($map[$y][$x] eq 'O' && $map[$y+1][$x] eq '.') {
+                                       $map[$y+1][$x] = 'O';
+                                       $map[$y][$x] = '.';
+                                       $retry = 1;
+                               }
+                       }
+               }
+       }
+       $retry = 1;
+       while ($retry) {
+               $retry = 0;
+               for my $x (reverse 0 .. $xmax-1) {
+                       for my $y (0 .. $ymax) {
+                               if ($map[$y][$x] eq 'O' && $map[$y][$x+1] eq '.') {
+                                       $map[$y][$x+1] = 'O';
+                                       $map[$y][$x] = '.';
+                                       $retry = 1;
+                               }
+                       }
+               }
+       }
+               
+       # say join('', @$_) for @map;
+
+       my $sum;
+       for my $y (0 .. $ymax) {
+               for my $x (0 .. $xmax) {
+                       $sum += $ymax + 1 - $y if $map[$y][$x] eq 'O';
+               }
+       }
+       say $sum;
+       $rounds[$round] = $sum;
+       say "round $round sum $sum";
+       my $map = join("\n", map { join('', @$_) } @map);
+       if ($seen{$map}) {
+               say "round $round seen also at $seen{$map}";
+               my $period = $round - $seen{$map};
+               my $total = 1000000000;
+               $total -= $round;
+               $total %= $period;
+               say "looking at ", $round - $period + $total;
+               say $rounds[$round-$period+$total];
+               last;
+       }
+       $seen{$map} = $round;
+}
+