From c95653f24d289f2ecab267aa46e6edf1c225ecde Mon Sep 17 00:00:00 2001 From: kageru Date: Tue, 15 Dec 2020 10:32:11 +0100 Subject: [PATCH] Improve 2020/15 fold() the world :umu: --- 2020/src/bin/day15.rs | 38 +++++++++++++------------------------- 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/2020/src/bin/day15.rs b/2020/src/bin/day15.rs index 9034bee..dbfb795 100644 --- a/2020/src/bin/day15.rs +++ b/2020/src/bin/day15.rs @@ -13,32 +13,20 @@ fn parse_input(raw: &str) -> Parsed { } fn part1(parsed: &Parsed, limit: usize) -> usize { - let mut iter = parsed.iter(); - let mut previous = HashMap::new(); - let mut current = 0; - for i in 0..limit - 1 { - if let Some(&n) = iter.next() { - current = n; - previous.insert(current, i); - current = 0; - continue; - } - println!("Adding {} to {:?}", current, previous); - match previous.get(¤t) { - Some(&position) => { - previous.insert(current, i); - current = i.saturating_sub(position); - } - None => { - previous.insert(current, i); - current = 0; - } - } - } - current + (parsed.len()..limit - 1) + .fold( + (parsed.iter().enumerate().map(|(i, n)| (*n, i)).collect::>(), 0), + |(mut prev, curr), i| { + let next = prev.get(&curr).map(|p| i - p).unwrap_or(0); + prev.insert(curr, i); + (prev, next) + }, + ) + .1 } // only here so the test/bench macro works +#[inline] fn part2(parsed: &Parsed, limit: usize) -> usize { part1(parsed, limit) } @@ -60,7 +48,7 @@ mod tests { test!(part1(2020) == 436); test!(part2(30000000) == 175594); - //bench!(part1() == 0); - //bench!(part2() == 0); + bench!(part1(2020) == 249); + // bench!(part2(30000000) == 41687); bench_input!(len == 6); }