[2016][rust][1.1]
change qmwskmsrtrokyyvxssxloxyytmqlskzw
commit 8f0cad329f47290b8576f8469afc7e44655485bf
author Alpha Chen <alpha.chen@gmail.com>
date
parent ommxplyu
diff --git a/2016/rust/src/main.rs b/2016/rust/src/main.rs
index de5a945..07ea0d4 100644
--- a/2016/rust/src/main.rs
+++ b/2016/rust/src/main.rs
@@ -1,14 +1,16 @@
+use std::collections::HashSet;
 use std::io;
 use std::io::Read;
 use std::f32::consts::PI;
 
 fn solve(input: &str) -> String {
   let mut turtle = (-PI / 2.0, (0, 0));
+  let mut visited: HashSet<(i32, i32)> = HashSet::new();
 
   for step in input.split(", ") {
     let mut chars = step.chars();
     let dir = chars.next().unwrap();
-    let blocks = chars.collect::<String>().parse::<f32>().unwrap();
+    let blocks = chars.collect::<String>().parse::<i32>().unwrap();
 
     turtle.0 += match dir {
       'R' => PI / 2.0,
@@ -18,9 +20,17 @@ fn solve(input: &str) -> String {
       }
     };
 
-    let movement = turtle.0.sin_cos();
-    (turtle.1).0 += (blocks*movement.1) as i32;
-    (turtle.1).1 += (blocks*movement.0) as i32;
+    for _ in 0..blocks {
+      let movement = turtle.0.sin_cos();
+      (turtle.1).0 += movement.1 as i32;
+      (turtle.1).1 += movement.0 as i32;
+
+      if visited.contains(&turtle.1) {
+        return ((turtle.1).0.abs() + (turtle.1).1.abs()).to_string()
+      } else {
+        visited.insert(turtle.1);
+      }
+    }
   }
 
   ((turtle.1).0.abs() + (turtle.1).1.abs()).to_string()
@@ -28,9 +38,10 @@ fn solve(input: &str) -> String {
 
 #[test]
 fn test_solve() {
-  assert_eq!(solve("R2, L3"), "5".to_string());
-  assert_eq!(solve("R2, R2, R2"), "2".to_string());
-  assert_eq!(solve("R5, L5, R5, R3"), "12".to_string());
+  // assert_eq!(solve("R2, L3"), "5".to_string());
+  // assert_eq!(solve("R2, R2, R2"), "2".to_string());
+  // assert_eq!(solve("R5, L5, R5, R3"), "12".to_string());
+  assert_eq!(solve("R8, R4, R4, R8"), "4".to_string());
 }
 
 fn main() {