solution: day 7

This commit is contained in:
YK 2024-12-07 08:41:08 +03:00
parent 55688a124d
commit 60999332dc
2 changed files with 63 additions and 1 deletions

View File

@ -4,7 +4,7 @@ pub mod d3;
pub mod d4;
pub mod d5;
pub mod d6;
// pub mod d7;
pub mod d7;
// pub mod d8;
// pub mod d9;
// pub mod d10;

62
src/days/d7.rs Normal file
View File

@ -0,0 +1,62 @@
use crate::prelude::*;
pub type I = Vec<(u64, Vec<u64>)>;
pub type O = u64;
fn _parse (data: &str) -> I {
data.trim().lines().map(|e| e.trim().split_once(": ").map(|(left, right)| (p!(left), right.split_ascii_whitespace().map(|e| p!(e)).collect())).unwrap()).collect()
}
fn _solve (data: I, consider_concats: bool) -> O {
data.iter().filter(|(val, list)| {
let mut results: S<u64> = S::from([list[0]]);
for &i in &list[1..] {
for p in results.drain().collect_vec() {
let prod = i * p;
let sum = i + p;
if prod <= *val { results.insert(prod); }
if sum <= *val { results.insert(sum); }
if consider_concats {
let concat = p * 10u64.pow(i.ilog10() + 1) + i;
if concat <= *val { results.insert(concat); }
}
}
}
results.contains(val)
}).map(|(val, _)| val).sum()
}
fn _silver (data: I) -> O {
_solve(data, false)
}
fn _gold (data: I) -> O {
_solve(data, true)
}
#[cfg(test)]
mod test {
use super::*;
fn read () -> I {
let data = inc!(7);
_parse(data)
}
#[test]
fn silver () {
let data = read();
let ans = _silver(data);
assert_eq!(ans, 5837374519342)
}
#[test]
fn gold () {
let data = read();
let ans = _gold(data);
assert_eq!(ans, 492383931650959)
}
}