From 95acefb1284579d640db6f8b0c11a2531312d108 Mon Sep 17 00:00:00 2001 From: timeshifter Date: Sun, 5 Jul 2026 19:41:49 +0200 Subject: [PATCH] add day 24 --- day24/Cargo.lock | 25 ++++++++ day24/Cargo.toml | 7 +++ day24/example.txt | 10 ++++ day24/input.txt | 28 +++++++++ day24/src/main.rs | 142 ++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 212 insertions(+) create mode 100644 day24/Cargo.lock create mode 100644 day24/Cargo.toml create mode 100644 day24/example.txt create mode 100644 day24/input.txt create mode 100644 day24/src/main.rs diff --git a/day24/Cargo.lock b/day24/Cargo.lock new file mode 100644 index 0000000..45a4ac0 --- /dev/null +++ b/day24/Cargo.lock @@ -0,0 +1,25 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "day24" +version = "0.1.0" +dependencies = [ + "itertools", +] + +[[package]] +name = "either" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" + +[[package]] +name = "itertools" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc" +dependencies = [ + "either", +] diff --git a/day24/Cargo.toml b/day24/Cargo.toml new file mode 100644 index 0000000..58dd58f --- /dev/null +++ b/day24/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day24" +version = "0.1.0" +edition = "2024" + +[dependencies] +itertools = "*" diff --git a/day24/example.txt b/day24/example.txt new file mode 100644 index 0000000..f4909b4 --- /dev/null +++ b/day24/example.txt @@ -0,0 +1,10 @@ +1 +2 +3 +4 +5 +7 +8 +9 +10 +11 diff --git a/day24/input.txt b/day24/input.txt new file mode 100644 index 0000000..874e61e --- /dev/null +++ b/day24/input.txt @@ -0,0 +1,28 @@ +1 +3 +5 +11 +13 +17 +19 +23 +29 +31 +41 +43 +47 +53 +59 +61 +67 +71 +73 +79 +83 +89 +97 +101 +103 +107 +109 +113 diff --git a/day24/src/main.rs b/day24/src/main.rs new file mode 100644 index 0000000..622cef3 --- /dev/null +++ b/day24/src/main.rs @@ -0,0 +1,142 @@ +use itertools::Itertools; + +#[cfg(debug_assertions)] +const INPUT: &str = "example.txt"; +#[cfg(debug_assertions)] +const LENGTH: usize = 10; + +#[cfg(not(debug_assertions))] +const INPUT: &str = "input.txt"; +#[cfg(not(debug_assertions))] +const LENGTH: usize = 28; + +fn main() { + let packages: Vec = std::fs::read_to_string(INPUT) + .unwrap() + .lines() + .map(|l| l.parse().unwrap()) + .collect(); + + part_1(packages.clone()); + part_2(packages) +} + +fn part_2(packages: Vec) { + let total_weight = packages.iter().sum::(); + + let target_weight = total_weight / 4; + + let best_qe = u64::MAX; + + let lowest_center_count = 1000; + + 'outer: for kc in 1..LENGTH - 3 { + if lowest_center_count < kc { + break 'outer; + } + for mut center in packages.iter().combinations(kc) { + if weight(¢er) != target_weight { + continue; + } + + let mut remaining_packages = packages.clone(); + remaining_packages.sort(); + + center.sort(); + + let mut to_remove = vec![]; + + let qe = product(¢er); + + for (idx, rem_package) in remaining_packages.iter().enumerate() { + if center.contains(&rem_package) { + to_remove.push(idx) + } + } + + for idx in to_remove.into_iter().rev() { + remaining_packages.remove(idx); + } + + for kl in 1..LENGTH - kc - 2 { + for left in remaining_packages.iter().combinations(kl) { + if weight(&left) != target_weight { + continue; + } + + if qe < best_qe && center.len() <= lowest_center_count { + println!("{}", qe); + break 'outer; + } + } + } + } + } +} + +fn part_1(packages: Vec) { + let total_weight = packages.iter().sum::(); + + let target_weight = total_weight / 3; + + let best_qe = u64::MAX; + + let lowest_center_count = 1000; + + 'outer: for kc in 1..LENGTH - 2 { + if lowest_center_count < kc { + break 'outer; + } + for mut center in packages.iter().combinations(kc) { + if weight(¢er) != target_weight { + continue; + } + + let mut remaining_packages = packages.clone(); + remaining_packages.sort(); + + center.sort(); + + let mut to_remove = vec![]; + + let qe = product(¢er); + + for (idx, rem_package) in remaining_packages.iter().enumerate() { + if center.contains(&rem_package) { + to_remove.push(idx) + } + } + + for idx in to_remove.into_iter().rev() { + remaining_packages.remove(idx); + } + + for kl in 1..LENGTH - kc - 1 { + for left in remaining_packages.iter().combinations(kl) { + if weight(&left) != target_weight { + continue; + } + + if qe < best_qe && center.len() <= lowest_center_count { + println!("{}", qe); + break 'outer; + } + } + } + } + } +} + +fn weight<'a, T>(slice: &'a [&'a T]) -> T +where + T: std::iter::Sum<&'a T>, +{ + slice.iter().copied().sum::() +} + +fn product<'a, T>(slice: &'a [&'a T]) -> T +where + T: std::iter::Product<&'a T>, +{ + slice.iter().copied().product::() +}