summary refs log tree commit diff homepage
path: root/2017/src/bin/day03.rs
diff options
context:
space:
mode:
Diffstat (limited to '2017/src/bin/day03.rs')
-rw-r--r--2017/src/bin/day03.rs57
1 files changed, 57 insertions, 0 deletions
diff --git a/2017/src/bin/day03.rs b/2017/src/bin/day03.rs
new file mode 100644
index 0000000..4f38ac3
--- /dev/null
+++ b/2017/src/bin/day03.rs
@@ -0,0 +1,57 @@
+use std::io::{self, Read};
+
+// 17  16  15  14  13
+// 18   5   4   3  12
+// 19   6   1   2  11
+// 20   7   8   9  10
+// 21  22  23---> ...
+//
+// 1 R
+// 1 U
+// 2 L
+// 2 D
+// 3 R
+// 3 U
+// 4 L
+// 4 D
+// 5 R
+
+fn solve1(input: i32) -> i32 {
+    let ds = [(1, 0), (0, 1), (-1, 0), (0, -1)];
+
+    let mut n = 1;
+    let mut x = 0i32;
+    let mut y = 0i32;
+    let mut r = 1;
+    let mut i = 0;
+
+    for &(dx, dy) in ds.iter().cycle() {
+        for _ in 0..r {
+            if n == input {
+                return x.abs() + y.abs();
+            }
+
+            n += 1;
+            x += dx;
+            y += dy;
+        }
+        r += i % 2;
+        i += 1;
+    }
+    unreachable!()
+}
+
+fn main() {
+    let mut input = String::new();
+    io::stdin().read_to_string(&mut input).unwrap();
+
+    println!("Part 1: {}", solve1(input.trim().parse().unwrap()));
+}
+
+#[test]
+fn part1() {
+    assert_eq!(0, solve1(1));
+    assert_eq!(3, solve1(12));
+    assert_eq!(2, solve1(23));
+    assert_eq!(31, solve1(1024));
+}