From dee3f6dfbcfc69a671128bd46f507afdf95c30d7 Mon Sep 17 00:00:00 2001 From: Devon Sawatsky Date: Mon, 8 Dec 2025 06:20:03 +0000 Subject: [PATCH] day8 part2 --- src/day8.rs | 60 +++++++++++++++++++++++++++++++++++++++-------------- src/lib.rs | 14 ++++++------- 2 files changed, 51 insertions(+), 23 deletions(-) diff --git a/src/day8.rs b/src/day8.rs index 200a649..55a47b4 100644 --- a/src/day8.rs +++ b/src/day8.rs @@ -3,23 +3,11 @@ use itertools::Itertools; use crate::{spatial::Point3D, union_find::UnionFind}; pub fn day8_part1(input: &str, connection_limit: usize) -> String { - let boxes = parse(input); - let mut pairs = boxes - .iter() - .combinations(2) - .map(|pair| (pair[0], pair[1])) - .map(|(left, right)| (left.euclidean_distance(right), left, right)) - .collect_vec(); - pairs.sort_by(|(ld, _, _), (rd, _, _)| ld.partial_cmp(rd).unwrap()); - let distanceless_pairs = pairs - .into_iter() - .map(|(_, l, r)| (l, r)) - .take(connection_limit) - .collect_vec(); + let (box_count, distanceless_pairs) = get_pairs(input, connection_limit); let mut ufo = UnionFind::default(); - for (&l, &r) in distanceless_pairs { + for (l, r) in distanceless_pairs { let l = ufo.make_set(l); let r = ufo.make_set(r); ufo.union(l, r); @@ -30,8 +18,48 @@ pub fn day8_part1(input: &str, connection_limit: usize) -> String { let product = rss.pop().unwrap() * rss.pop().unwrap() * rss.pop().unwrap(); product.to_string() } -pub fn day8_part2(input: &str) -> String { - todo!() +pub fn day8_part2(input: &str, connection_limit: usize) -> String { + let (box_count, distanceless_pairs) = get_pairs(input, connection_limit); + println!("{}", distanceless_pairs.len()); + let mut ufo = UnionFind::default(); + let mut index = 0; + + let (l, r) = loop { + let (l, r) = distanceless_pairs[index]; + + let lindex = ufo.make_set(l); + let rindex = ufo.make_set(r); + ufo.union(lindex, rindex); + + let rss = ufo.root_sizes(); + println!("{:?}", rss); + if rss.len() > 1 || rss[0] < box_count { + index += 1; + } else { + break dbg!((l, r)); + } + }; + let product = l.x * r.x; + product.to_string() +} + +fn get_pairs(input: &str, connection_limit: usize) -> (usize, Vec<(Point3D, Point3D)>) { + let boxes = parse(input); + let mut pairs = boxes + .iter() + .combinations(2) + .map(|pair| (pair[0], pair[1])) + .map(|(left, right)| (left.euclidean_distance(right), left, right)) + .collect_vec(); + pairs.sort_by(|(ld, _, _), (rd, _, _)| ld.partial_cmp(rd).unwrap()); + ( + boxes.len(), + pairs + .into_iter() + .map(|(_, l, r)| (*l, *r)) + .take(connection_limit) + .collect_vec(), + ) } fn parse(input: &str) -> Vec { diff --git a/src/lib.rs b/src/lib.rs index 69cc8e1..f35844c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -135,13 +135,13 @@ mod tests { let result = day8::day8_part1(include_str!("../input/day8.txt"), 1000); assert_eq!(result, "90036"); } - // #[test] - // fn day8_part2_test() { - // let test_result = day8::day8_part2(include_str!("../input/day8.test.txt")); - // assert_eq!(test_result, "40"); - // // let result = day8::day8_part2(include_str!("../input/day8.txt")); - // // assert_eq!(result, "3806264447357"); - // } + #[test] + fn day8_part2_test() { + let test_result = day8::day8_part2(include_str!("../input/day8.test.txt"), 1_000_000); + assert_eq!(test_result, "25272"); + let result = day8::day8_part2(include_str!("../input/day8.txt"), 1_000_000); + assert_eq!(result, "6083499488"); + } #[test] fn day7_part1_test() { -- 2.51.2