]> www.fi.muni.cz Git - aoc.git/commitdiff
Day 8: messed up coordinates, too slow
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Sun, 8 Dec 2024 08:06:50 +0000 (09:06 +0100)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Sun, 8 Dec 2024 08:06:50 +0000 (09:06 +0100)
2024/15.pl [new file with mode: 0755]
2024/16.pl [new file with mode: 0755]

diff --git a/2024/15.pl b/2024/15.pl
new file mode 100755 (executable)
index 0000000..7fdd69d
--- /dev/null
@@ -0,0 +1,37 @@
+#!/usr/bin/perl -w
+
+use v5.40;
+
+my %ant;
+
+my ($w, $h);
+while (<>) {
+       chomp;
+       $w //= length()-1;
+       push @{ $ant{$&} }, [ $. - 1, pos()-1 ] while /\w/g;
+}
+$h = $.-1;
+
+my %seen;
+for my $freq (keys %ant) {
+       my @ants = $ant{$freq}->@*;
+       for my $i1 (0 .. $#ants-1) {
+               my $a1 = $ants[$i1];
+               for my $i2 ($i1+1 .. $#ants) {
+                       my $a2 = $ants[$i2];
+                       my ($dx, $dy) = (
+                               $a1->[0] - $a2->[0],
+                               $a1->[1] - $a2->[1],
+                       );
+                       for my ($x, $y) (
+                               $a2->[0]-$dx, $a2->[1]-$dy,
+                               $a1->[0]+$dx, $a1->[1]+$dy,
+                       ) {
+                               $seen{"$x,$y"}++
+                                       if $x >= 0 && $x <= $w
+                                       && $y >= 0 && $y <= $h;
+                       }
+               }
+       }
+}
+say scalar keys %seen;
diff --git a/2024/16.pl b/2024/16.pl
new file mode 100755 (executable)
index 0000000..492129e
--- /dev/null
@@ -0,0 +1,52 @@
+#!/usr/bin/perl -w
+
+use v5.40;
+
+my %ant;
+my ($w, $h);
+while (<>) {
+       chomp;
+       $w //= length()-1;
+       push @{ $ant{$&} }, [ $. - 1, pos()-1 ]
+               while /\w/g;
+}
+$h = $.-1;
+
+sub gcd($a, $b) {
+       ($a, $b) = ($b, $a) if $a < $b;
+       ($a, $b) = ($b, $a % $b) while $b;
+       return $a;
+}
+
+my %seen;
+for my $freq (keys %ant) {
+       my @ants = $ant{$freq}->@*;
+       for my $i1 (0 .. $#ants-1) {
+               my $a1 = $ants[$i1];
+
+               for my $i2 ($i1+1 .. $#ants) {
+                       my $a2 = $ants[$i2];
+
+                       my ($dx, $dy) = (
+                               $a1->[0] - $a2->[0],
+                               $a1->[1] - $a2->[1],
+                       );
+                       my $g = gcd(abs($dx), abs($dy));
+                       $dx /= $g; $dy /= $g;
+
+                       for my $dir (-1, 1) {
+                               my $t = 0;
+                               while (1) {
+                                       my $x = $a1->[0]+$dir*$t*$dx;
+                                       my $y = $a1->[1]+$dir*$t*$dy;
+                                       last if $x < 0 || $x > $w
+                                               || $y < 0 || $y > $h;
+                                       $seen{"$x,$y"}++;
+                                       $t++;
+                               }
+                       }
+               }
+       }
+}
+
+say scalar keys %seen;