]> www.fi.muni.cz Git - aoc.git/commitdiff
Day 6: pretty straightforward, but part 2 quite slow
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Fri, 6 Dec 2024 06:37:52 +0000 (07:37 +0100)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Fri, 6 Dec 2024 06:37:52 +0000 (07:37 +0100)
2024/11.pl [new file with mode: 0755]
2024/12.pl [new file with mode: 0755]

diff --git a/2024/11.pl b/2024/11.pl
new file mode 100755 (executable)
index 0000000..7f71908
--- /dev/null
@@ -0,0 +1,39 @@
+#!/usr/bin/perl -w
+
+use v5.40;
+
+my @map = map { chomp; [ split // ] } <>;
+my $xmax = $#{ $map[0] };
+my $ymax = $#map;
+
+my ($gx, $gy, $gd);
+for my $y (0 .. $ymax) {
+       for my $x (0 .. $xmax) {
+               ($gx, $gy, $gd) = ($x, $y, $map[$y][$x])
+                       if $map[$y][$x] !~ /[\.\#]/;
+       }
+}
+
+my %dir = (
+       '^' => [0, -1],
+       '>' => [1,  0],
+       'v' => [0,  1],
+       '<' => [-1, 0],
+);
+
+my %seen;
+while (1) {
+       $seen{"$gx,$gy"}++;
+       my ($dx, $dy) = $dir{$gd}->@*;
+       $dx += $gx;
+       $dy += $gy;
+       last if $dx < 0 || $dx > $xmax || $dy < 0 || $dy > $ymax;
+       if ($map[$dy][$dx] eq '#') {
+               $gd =~ y/^>v</>v<^/;
+       } else {
+               ($gx, $gy) = ($dx, $dy);
+       }
+}
+
+say scalar keys %seen;
+
diff --git a/2024/12.pl b/2024/12.pl
new file mode 100755 (executable)
index 0000000..204a5d1
--- /dev/null
@@ -0,0 +1,52 @@
+#!/usr/bin/perl -w
+
+use v5.40;
+
+my @map = map { chomp; [ split // ] } <>;
+my $xmax = $#{ $map[0] };
+my $ymax = $#map;
+
+my ($gx, $gy, $gd);
+for my $y (0 .. $ymax) {
+       for my $x (0 .. $xmax) {
+               ($gx, $gy, $gd) = ($x, $y, $map[$y][$x])
+                       if $map[$y][$x] !~ /[\.\#]/;
+       }
+}
+
+my %dir = (
+       '^' => [0, -1],
+       '>' => [1,  0],
+       'v' => [0,  1],
+       '<' => [-1, 0],
+);
+
+sub loops($map, $gx, $gy, $gd) {
+       my %seen;
+       while (1) {
+               return 1 if $seen{"$gx,$gy,$gd"}++;
+               # say "at $gx,$gy,$gd";
+               my ($dx, $dy) = $dir{$gd}->@*;
+               $dx += $gx;
+               $dy += $gy;
+               return 0 if $dx < 0 || $dx > $xmax || $dy < 0 || $dy > $ymax;
+               if ($map->[$dy][$dx] eq '#') {
+                       $gd =~ y/^>v</>v<^/;
+               } else {
+                       ($gx, $gy) = ($dx, $dy);
+               }
+       }
+}
+
+my $count;
+for my $y (0 .. $ymax) {
+       for my $x (0 .. $xmax) {
+               next if $map[$y][$x] ne '.';
+               my @m1 = map { [ @$_ ] } @map;
+               $m1[$y][$x] = '#';
+               $count++ if loops(\@m1, $gx, $gy, $gd);
+       }
+}
+
+say $count;
+