My submissions for Advent of Code 2025 adventofcode.com/2025
rust aoc
at main 58 lines 2.1 kB view raw
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}