From bae1972faa0d2a629b40d271103b486b82a5d33e Mon Sep 17 00:00:00 2001 From: Alpha Chen Date: Thu, 31 Dec 2015 22:49:17 -0800 Subject: [PATCH] Rust, Day 3.1 --- rust/src/day_03.rs | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/rust/src/day_03.rs b/rust/src/day_03.rs index a6d5472..8c4baa8 100644 --- a/rust/src/day_03.rs +++ b/rust/src/day_03.rs @@ -17,7 +17,24 @@ impl Day for Day03 { } fn solve(&self) -> io::Result { - let houses = Santa::houses_visited(&self.directions); + let mut santa = String::new(); + let mut robo_santa = String::new(); + let mut iter = self.directions.chars(); + + loop { + match iter.next() { + Some(c) => { santa.push(c) }, + None => break, + } + match iter.next() { + Some(c) => { robo_santa.push(c) }, + None => break, + } + } + + let mut houses: HashMap = HashMap::new(); + Santa::houses_visited(&santa, &mut houses); + Santa::houses_visited(&robo_santa, &mut houses); Ok(houses.len() as i32) } } @@ -35,16 +52,13 @@ impl<'a> Santa<'a> { } } - fn houses_visited(directions: &str) -> HashMap { + fn houses_visited(directions: &str, houses: &mut HashMap) { let santa = Santa::new(directions); - let mut houses = HashMap::new(); - houses.insert(Point::origin(), 1); + houses.insert(santa.location, 1); for point in santa { *houses.entry(point).or_insert(0) += 1; } - - houses } } @@ -73,7 +87,8 @@ fn test_one() { let expected = vec![Point { x: 1, y: 0 }]; assert_eq!(expected, points); - let houses = Santa::houses_visited(directions); + let mut houses: HashMap = HashMap::new(); + Santa::houses_visited(directions, &mut houses); assert_eq!(2, houses.len()); assert_eq!(&1, houses.get(&Point::origin()).unwrap()); assert_eq!(&1, houses.get(&Point { x: 1, y: 0 }).unwrap()); @@ -82,7 +97,9 @@ fn test_one() { #[test] fn test_two() { let directions = "^>v<"; - let houses = Santa::houses_visited(directions); + + let mut houses: HashMap = HashMap::new(); + Santa::houses_visited(directions, &mut houses); assert_eq!(4, houses.len()); assert_eq!(&2, houses.get(&Point::origin()).unwrap()); assert_eq!(&1, houses.get(&Point { x: 1, y: 0 }).unwrap()); @@ -91,13 +108,15 @@ fn test_two() { #[test] fn test_three() { let directions = "^v^v^v^v^v"; - let houses = Santa::houses_visited(directions); + + let mut houses: HashMap = HashMap::new(); + Santa::houses_visited(directions, &mut houses); assert_eq!(2, houses.len()); assert_eq!(&6, houses.get(&Point::origin()).unwrap()); assert_eq!(&5, houses.get(&Point { x: 0, y: 1 }).unwrap()); } -#[derive(Clone,Debug,Eq,Hash)] +#[derive(Clone,Copy,Debug,Eq,Hash)] struct Point { x: i32, y: i32,