solution: day 7
This commit is contained in:
parent
55688a124d
commit
60999332dc
@ -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
62
src/days/d7.rs
Normal 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)
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user