diff options
author | June McEnroe <june@causal.agency> | 2017-12-03 19:35:22 -0500 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2020-11-22 00:14:25 -0500 |
commit | fe750311b96eec22103143042eef1f4e4a722970 (patch) | |
tree | c50f87c2daf938b54654e4bb0a449697f9e17622 /2017/src/bin | |
parent | Day 3, clean up (diff) | |
download | aoc-fe750311b96eec22103143042eef1f4e4a722970.tar.gz aoc-fe750311b96eec22103143042eef1f4e4a722970.zip |
Day 3, part 2
I am super surprised that worked on the first try.
Diffstat (limited to '2017/src/bin')
-rw-r--r-- | 2017/src/bin/day03.rs | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/2017/src/bin/day03.rs b/2017/src/bin/day03.rs index 8a556a1..99aecd2 100644 --- a/2017/src/bin/day03.rs +++ b/2017/src/bin/day03.rs @@ -1,3 +1,4 @@ +use std::collections::HashMap; use std::io::{self, Read}; fn solve1(input: i32) -> i32 { @@ -19,11 +20,44 @@ fn solve1(input: i32) -> i32 { unreachable!() } +fn solve2(input: i32) -> i32 { + let spiral = [(1, 0), (0, 1), (-1, 0), (0, -1)]; + let (mut x, mut y) = (0i32, 0i32); + let mut values = HashMap::new(); + values.insert((0, 0), 1); + + for (i, &(dx, dy)) in spiral.iter().cycle().enumerate() { + let length = 1 + i / 2; + for _ in 0..length { + let n = + values.get(&(x, y )).unwrap_or(&0) + + values.get(&(x - 1, y - 1)).unwrap_or(&0) + + values.get(&(x, y - 1)).unwrap_or(&0) + + values.get(&(x + 1, y - 1)).unwrap_or(&0) + + values.get(&(x + 1, y )).unwrap_or(&0) + + values.get(&(x + 1, y + 1)).unwrap_or(&0) + + values.get(&(x, y + 1)).unwrap_or(&0) + + values.get(&(x - 1, y + 1)).unwrap_or(&0) + + values.get(&(x - 1, y )).unwrap_or(&0); + values.insert((x, y), n); + + if n > input { + return n; + } + + x += dx; + y += dy; + } + } + unreachable!() +} + fn main() { let mut input = String::new(); io::stdin().read_to_string(&mut input).unwrap(); println!("Part 1: {}", solve1(input.trim().parse().unwrap())); + println!("Part 2: {}", solve2(input.trim().parse().unwrap())); } #[test] |