]> www.fi.muni.cz Git - aoc.git/commitdiff
Day 08: DFS and Dijkstra
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Mon, 8 Dec 2025 06:00:21 +0000 (07:00 +0100)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Mon, 8 Dec 2025 06:00:21 +0000 (07:00 +0100)
2025/15.pl [new file with mode: 0755]
2025/16.pl [new file with mode: 0755]

diff --git a/2025/15.pl b/2025/15.pl
new file mode 100755 (executable)
index 0000000..913357d
--- /dev/null
@@ -0,0 +1,40 @@
+#!/usr/bin/perl -w
+
+use v5.42;
+use experimental 'multidimensional';
+use List::Util qw(sum);
+
+my @boxes = map { [ /\d+/g ] } <>;
+
+my %dists;
+for my $i (0 .. $#boxes-1) {
+       for my $j ($i+1 .. $#boxes) {
+               $dists{$i,$j} = sqrt(sum map {
+                       ($boxes[$i][$_] - $boxes[$j][$_])**2 } 0 .. 2);
+       }
+}
+
+my @mind = sort { $dists{$a} <=> $dists{$b} } keys %dists;
+my %d1k = map { $_ => $dists{$_} } splice(@mind, 0, 1000);
+my %neighs;
+for my $node (keys %d1k) {
+       my ($n1, $n2) = split /$;/, $node;
+       push @{ $neighs{$n1} }, $n2;
+       push @{ $neighs{$n2} }, $n1;
+}
+
+my %comps;
+my %seen;
+sub walk($node, $state = undef) {
+       return if $seen{$node}++;
+       $state //= $node;
+       $comps{$state}++;
+       for my $n (@{ $neighs{$node} }) {
+               walk($n, $state);       
+       }
+}
+
+walk($_) for keys %neighs;
+my @v = reverse sort { $a <=> $b } values %comps;
+
+say $v[0]*$v[1]*$v[2];
diff --git a/2025/16.pl b/2025/16.pl
new file mode 100755 (executable)
index 0000000..137a0a4
--- /dev/null
@@ -0,0 +1,45 @@
+#!/usr/bin/perl -w
+
+use v5.42;
+use experimental 'multidimensional';
+use List::Util qw(sum);
+
+$; = ';';
+
+my @boxes = map { [ /\d+/g ] } <>;
+
+my %dists;
+for my $i (0 .. $#boxes-1) {
+       for my $j ($i+1 .. $#boxes) {
+               $dists{$i,$j} = sqrt(sum map {
+                       ($boxes[$i][$_] - $boxes[$j][$_])**2
+               } 0 .. 2);
+       }
+}
+
+my %seen;
+my $comps;
+
+for my $v (sort { $dists{$a} <=> $dists{$b} } keys %dists) {
+       my ($n1, $n2) = split /$;/, $v;
+       my $st = $seen{$n1};
+       if (!defined $st) {
+               $st = $seen{$n1} = $n1;
+               $comps++;
+       }
+       if (defined $seen{$n2} && $seen{$n2} != $st) {
+               my $prev = $seen{$n2};
+               for my $i (0 .. $#boxes) {
+                       $seen{$i} = $st if defined $seen{$i} && $seen{$i} == $prev;
+               }
+               $comps--;
+       } else {
+               $seen{$n2} = $st;
+       }
+
+       if (keys %seen == @boxes && $comps == 1) {
+               say $boxes[$n1][0] * $boxes[$n2][0];
+               last;
+       }
+}
+