]> www.fi.muni.cz Git - aoc.git/commitdiff
Day 4: nested loops, too slow to write
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Wed, 4 Dec 2024 11:28:07 +0000 (12:28 +0100)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Wed, 4 Dec 2024 11:28:07 +0000 (12:28 +0100)
2024/07.pl [new file with mode: 0755]
2024/08.pl [new file with mode: 0755]

diff --git a/2024/07.pl b/2024/07.pl
new file mode 100755 (executable)
index 0000000..a66adb6
--- /dev/null
@@ -0,0 +1,29 @@
+#!/usr/bin/perl -w
+
+use v5.40;
+
+my @map = map { chomp; [ split // ] } <>;
+my $xmax = $#{ $map[0] };
+my $ymax = $#map;
+
+my $count;
+for my $y (0 .. $ymax) {
+       for my $x (0 .. $xmax) {
+               for my $dx (-1 .. 1) {
+                       DIR:
+                       for my $dy (-1 .. 1) {
+                               next if $dx == 0 && $dy == 0;
+                               for my $off (0 .. 3) {
+                                       my ($x1, $y1) = ($x + $dx*$off, $y + $dy*$off);
+                                       next DIR if $x1 < 0 || $x1 > $xmax;
+                                       next DIR if $y1 < 0 || $y1 > $ymax;
+                                       next DIR if $map[$y1][$x1] ne qw(X M A S)[$off];
+                               } 
+                               $count++;
+                       }
+               }
+       }
+}
+
+say $count;
+
diff --git a/2024/08.pl b/2024/08.pl
new file mode 100755 (executable)
index 0000000..0291c6d
--- /dev/null
@@ -0,0 +1,35 @@
+#!/usr/bin/perl -w
+
+use v5.40;
+
+my @map = map { chomp; [ split // ] } <>;
+my $xmax = $#{ $map[0] };
+my $ymax = $#map;
+
+my $count;
+for my $y (0 .. $ymax) {
+       for my $x (0 .. $xmax) {
+               for my $dx1 (-1 .. 1) {
+                       for my $dy1 (-1 .. 1) {
+                               next if $dx1 == 0 || $dy1 == 0;
+                               DIR:
+                               for my ($dx2, $dy2) ($dy1, -$dx1, -$dy1, $dx1) {
+                                       for my $off (-1 .. 1) {
+                                               my ($x1, $y1) = ($x + $dx1*$off, $y + $dy1*$off);
+                                               my ($x2, $y2) = ($x + $dx2*$off, $y + $dy2*$off);
+                                               next DIR if $x1 < 0 || $x1 > $xmax;
+                                               next DIR if $y1 < 0 || $y1 > $ymax;
+                                               next DIR if $x2 < 0 || $x2 > $xmax;
+                                               next DIR if $y2 < 0 || $y2 > $ymax;
+                                               next DIR if $map[$y1][$x1] ne qw(M A S)[$off+1];
+                                               next DIR if $map[$y2][$x2] ne qw(M A S)[$off+1];
+                                       }
+                                       $count++;
+                               }
+                       }
+               }
+       }
+}
+
+say $count/2;
+