From 1af8eab8c2d4694e5926fa116f0ec12493093cc0 Mon Sep 17 00:00:00 2001 From: Bill Thiede Date: Wed, 9 Dec 2020 18:04:50 -0800 Subject: [PATCH] Add (much slower) sort and binary search day 9 part 1 --- 2020/src/day9.rs | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/2020/src/day9.rs b/2020/src/day9.rs index 76603b5..06a4e7c 100644 --- a/2020/src/day9.rs +++ b/2020/src/day9.rs @@ -87,7 +87,6 @@ fn parse(input: &str) -> Vec { fn solution1_impl(nums: &[usize], win_size: usize) -> usize { nums.windows(win_size + 1) - // TODO(wathiede): try soring and/or hashmap for speed. .skip_while(|chunk| { let past = &chunk[..win_size]; let cur = chunk[win_size]; @@ -104,11 +103,35 @@ fn solution1_impl(nums: &[usize], win_size: usize) -> usize { .unwrap() } +fn solution1_impl_sorted(nums: &[usize], win_size: usize) -> usize { + nums.windows(win_size + 1) + .skip_while(|chunk| { + let mut past = (&chunk[..win_size]).clone().to_owned(); + past.sort_unstable(); + let cur = chunk[win_size]; + for p in &past { + let diff = if cur > *p { cur - p } else { p - cur }; + if past.binary_search(&diff).is_ok() { + return true; + } + } + + false + }) + .find_map(|chunk| Some(chunk[win_size])) + .unwrap() +} + #[aoc(day9, part1)] fn solution1(nums: &[usize]) -> usize { solution1_impl(nums, 25) } +#[aoc(day9, part1, sorted)] +fn solution1_sorted(nums: &[usize]) -> usize { + solution1_impl_sorted(nums, 25) +} + fn sum_min_max(low: usize, hi: usize, nums: &[usize]) -> usize { let (min, max) = nums[low..hi] .iter()