From 16f4451d576062f31a2858fa15d1e09150faa04d Mon Sep 17 00:00:00 2001 From: "Jan \"Yenya\" Kasprzak" Date: Mon, 8 Dec 2025 07:00:21 +0100 Subject: [PATCH] Day 08: DFS and Dijkstra --- 2025/15.pl | 40 ++++++++++++++++++++++++++++++++++++++++ 2025/16.pl | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100755 2025/15.pl create mode 100755 2025/16.pl diff --git a/2025/15.pl b/2025/15.pl new file mode 100755 index 0000000..913357d --- /dev/null +++ b/2025/15.pl @@ -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 index 0000000..137a0a4 --- /dev/null +++ b/2025/16.pl @@ -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; + } +} + -- 2.47.3