--- /dev/null
+#!/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];
--- /dev/null
+#!/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;
+ }
+}
+