add day 24
This commit is contained in:
Generated
+25
@@ -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",
|
||||||
|
]
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
[package]
|
||||||
|
name = "day24"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
itertools = "*"
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
5
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
|
10
|
||||||
|
11
|
||||||
@@ -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
|
||||||
@@ -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(¢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<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(¢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::<T>()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn product<'a, T>(slice: &'a [&'a T]) -> T
|
||||||
|
where
|
||||||
|
T: std::iter::Product<&'a T>,
|
||||||
|
{
|
||||||
|
slice.iter().copied().product::<T>()
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user