From 7f9920447ae56c14c21696293ae43a27d325dab2 Mon Sep 17 00:00:00 2001 From: dece Date: Sun, 27 Dec 2020 20:25:15 +0100 Subject: [PATCH] 2015 day 3 --- 2015/src/bin/day3.rs | 45 ++++++++++++++++++++++++++++++++++++++++++++ 2015/src/input.rs | 4 ++++ 2 files changed, 49 insertions(+) create mode 100644 2015/src/bin/day3.rs diff --git a/2015/src/bin/day3.rs b/2015/src/bin/day3.rs new file mode 100644 index 0000000..c94b0d1 --- /dev/null +++ b/2015/src/bin/day3.rs @@ -0,0 +1,45 @@ +use std::collections::HashMap; + +use aoc::input; + +fn main() { + let chars = input::read_chars(); + + // Part 1 + let mut houses = HashMap::<(i32, i32), u32>::new(); + let (mut x, mut y) = (0, 0); + houses.insert((0, 0), 1); + for c in chars.chars() { + match c { + '>' => x += 1, + '<' => x -= 1, + 'v' => y += 1, + '^' => y -= 1, + _ => {} + } + let presents = houses.entry((x, y)).or_insert(0); + *presents += 1; + } + let num_houses = houses.values().filter(|v| **v > 0).count(); + println!("Houses delivered: {}.", num_houses); + + // Part 2 + let mut houses = HashMap::<(i32, i32), u32>::new(); + let (mut x, mut y, mut rx, mut ry) = (0, 0, 0, 0); + houses.insert((0, 0), 1); + let mut is_robot_turn = false; + for c in chars.chars() { + match c { + '>' => if is_robot_turn { rx += 1 } else { x += 1 }, + '<' => if is_robot_turn { rx -= 1 } else { x -= 1 }, + 'v' => if is_robot_turn { ry += 1 } else { y += 1 }, + '^' => if is_robot_turn { ry -= 1 } else { y -= 1 }, + _ => {} + } + let presents = houses.entry(if is_robot_turn { (rx, ry) } else { (x, y) }).or_insert(0); + *presents += 1; + is_robot_turn = !is_robot_turn; + } + let num_houses = houses.values().filter(|v| **v > 0).count(); + println!("Houses delivered: {}.", num_houses); +} diff --git a/2015/src/input.rs b/2015/src/input.rs index e0e02d1..49a7895 100644 --- a/2015/src/input.rs +++ b/2015/src/input.rs @@ -15,3 +15,7 @@ pub fn read_lines() -> Vec { } lines } + +pub fn read_chars() -> String { + read_lines()[0].to_owned() +}