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() {