From c85e82ee45d661ff20e07d1a55f365c8b184b142 Mon Sep 17 00:00:00 2001 From: Curtis McEnroe Date: Sat, 3 Dec 2016 22:28:54 -0500 Subject: Day 1 part 2 --- src/bin/day01.rs | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) (limited to 'src/bin') diff --git a/src/bin/day01.rs b/src/bin/day01.rs index ed2d845..a198e64 100644 --- a/src/bin/day01.rs +++ b/src/bin/day01.rs @@ -1,7 +1,8 @@ +use std::collections::HashSet; use std::io::{self, Read}; use std::ops::{Add, Mul}; -#[derive(Clone, Copy)] +#[derive(Clone, Copy, PartialEq, Eq, Hash)] struct Point(i32, i32); impl Point { @@ -26,20 +27,14 @@ impl Add for Point { } } -impl Mul for Point { - type Output = Self; - - fn mul(self, rhs: i32) -> Self { - Point(self.0 * rhs, self.1 * rhs) - } -} - fn main() { let mut input = String::new(); io::stdin().read_to_string(&mut input).unwrap(); let mut position = Point(0, 0); let mut direction = Point(0, -1); + let mut visited = HashSet::new(); + let mut collision = None; for instruction in input.trim().split(", ") { let (turn, count) = instruction.split_at(1); @@ -51,8 +46,16 @@ fn main() { } let count: i32 = count.parse().unwrap(); - position = position + direction * count; + for _ in 0..count { + position = position + direction; + if !visited.insert(position) && collision.is_none() { + collision = Some(position); + } + } } println!("Part 1: {}", position.distance(Point(0, 0))); + if let Some(point) = collision { + println!("Part 2: {}", point.distance(Point(0, 0))); + } } -- cgit 1.4.1