My submissions for Advent of Code 2025
adventofcode.com/2025
rust
aoc
1use std::{collections::HashSet, fs::read_to_string};
2
3fn main() {
4 let boxes: Vec<Vec<u64>> = read_to_string("../input.txt")
5 .expect("failed to open input file")
6 .lines()
7 .map(|jbox| {
8 jbox.split(',')
9 .map(|coord| coord.parse().unwrap())
10 .collect()
11 })
12 .collect();
13 let mut distances: Vec<(_, u64)> = boxes
14 .iter()
15 .enumerate()
16 .flat_map(|(i, jbox)| {
17 boxes.iter().enumerate().skip(i + 1).map(move |(j, other)| {
18 (
19 (i, j),
20 jbox.iter()
21 .zip(other)
22 .map(|(from, to)| from.abs_diff(*to).pow(2))
23 .sum(),
24 )
25 })
26 })
27 .collect();
28 distances.sort_unstable_by_key(|(_, distance)| *distance);
29
30 let mut circuits: Vec<HashSet<usize>> = Vec::new();
31 for ((from, to), _) in distances.into_iter() {
32 let from_idx = circuits.iter().position(|circuit| circuit.contains(&from));
33 let to_idx = circuits.iter().position(|circuit| circuit.contains(&to));
34 match (from_idx, to_idx) {
35 (Some(from_idx), Some(to_idx)) if from_idx == to_idx => {}
36 (Some(from_idx), Some(to_idx)) => {
37 let to_circuit: Vec<_> = circuits[to_idx].drain().collect();
38 circuits[from_idx].extend(to_circuit);
39 circuits.remove(to_idx);
40 }
41 (Some(from_idx), None) => {
42 circuits[from_idx].insert(to);
43 }
44 (None, Some(to_idx)) => {
45 circuits[to_idx].insert(from);
46 }
47 (None, None) => circuits.push(HashSet::from([from, to])),
48 }
49
50 if circuits[0].len() == boxes.len() {
51 let result = boxes[from][0] * boxes[to][0];
52 println!(
53 "The result of multiplying the x co-ordinates of the last two junction boxes is {result}!"
54 );
55 break;
56 }
57 }
58}