diff --git a/src/days/d14.rs b/src/days/d14.rs index c401448..a8c6c5b 100644 --- a/src/days/d14.rs +++ b/src/days/d14.rs @@ -1,65 +1,19 @@ use crate::prelude::*; -pub type I = &'static str; pub type O = usize; -fn _parse (data: &str) -> I { - Default::default() -} +pub const INPUT: &'static str = "qzyelonm"; -fn _solve (data: &I) -> O { - Default::default() -} - -fn _silver (data: &I) -> O { +fn _solve (extra: u32) -> O { let mut candidates: M> = M::new(); let mut done: Vec = vec![]; for i in 0.. { - let s = format!("{data}{i}"); - let hash = md5::compute(s); - let repr = format!("{:x}", hash); - - let three = repr.chars().tuple_windows().find(|&(a, b, c)| a == b && b == c); - - if let Some((c, _, _)) = three { - if !candidates.is_empty() { - let five = repr.chars().tuple_windows().find(|&(a, b, c, d, e)| a == b && a == c && a == d && a == e); - if let Some((c, _, _, _, _)) = five { - if let Some(candidates) = candidates.get_mut(&c) { - let pos = candidates.iter().position(|pos| pos + 1000 > i); - if let Some(pos) = pos { - let drained = candidates.drain(pos..).collect_vec(); - // println!("{} at: {:?} added to vec: {}", c, drained, repr); - - done.extend(drained); - candidates.clear(); - if done.len() >= 100 { // extra - done.sort(); - return done[63]; - } - } - } - - } - } - candidates.entry(c).or_default().push(i); - } - } - // 15189: too high - 0 -} - -fn _gold (data: &I) -> O { - let mut candidates: M> = M::new(); - let mut done: Vec = vec![]; - - for i in 0.. { - let s = format!("{data}{i}"); + let s = format!("{INPUT}{i}"); let mut hash = md5::compute(s); let mut repr = format!("{:x}", hash); - for _ in 0..2016 { + for _ in 0..extra { hash = md5::compute(repr); repr = format!("{:x}", hash); } @@ -73,12 +27,9 @@ fn _gold (data: &I) -> O { if let Some(candidates) = candidates.get_mut(&c) { let pos = candidates.iter().position(|pos| pos + 1000 > i); if let Some(pos) = pos { - let drained = candidates.drain(pos..).collect_vec(); - // println!("{} at: {:?} added to vec: {}", c, drained, repr); - - done.extend(drained); + done.extend(candidates.drain(pos..)); candidates.clear(); - if done.len() >= 100 { // extra + if done.len() >= 100 { // should be pretty solid, but not sure if I can prove this! done.sort(); return done[63]; } @@ -90,38 +41,31 @@ fn _gold (data: &I) -> O { candidates.entry(c).or_default().push(i); } } - // 15189: too high 0 } +fn _silver () -> O { + _solve(0) +} + +fn _gold () -> O { + _solve(2016) +} + #[cfg(test)] mod test { use super::*; - fn read () -> I { - "qzyelonm" - } - - #[test] - fn sample () { - let data = ""; - let data = _parse(data); - - assert_eq!(1, 1) - } - #[test] fn silver () { - let data = read(); - let ans = _silver(&data); + let ans = _silver(); assert_eq!(ans, 15168) } #[test] fn gold () { - let data = read(); - let ans = _gold(&data); + let ans = _gold(); assert_eq!(ans, 20864) }