add day 24

This commit is contained in:
timeshifter
2026-07-05 19:41:49 +02:00
parent 52a6d3a28a
commit 95acefb128
5 changed files with 212 additions and 0 deletions
+25
View File
@@ -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",
]
+7
View File
@@ -0,0 +1,7 @@
[package]
name = "day24"
version = "0.1.0"
edition = "2024"
[dependencies]
itertools = "*"
+10
View File
@@ -0,0 +1,10 @@
1
2
3
4
5
7
8
9
10
11
+28
View File
@@ -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
+142
View File
@@ -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<u64> = 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<u64>) {
let total_weight = packages.iter().sum::<u64>();
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(&center) != target_weight {
continue;
}
let mut remaining_packages = packages.clone();
remaining_packages.sort();
center.sort();
let mut to_remove = vec![];
let qe = product(&center);
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<u64>) {
let total_weight = packages.iter().sum::<u64>();
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(&center) != target_weight {
continue;
}
let mut remaining_packages = packages.clone();
remaining_packages.sort();
center.sort();
let mut to_remove = vec![];
let qe = product(&center);
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::<T>()
}
fn product<'a, T>(slice: &'a [&'a T]) -> T
where
T: std::iter::Product<&'a T>,
{
slice.iter().copied().product::<T>()
}