summaryrefslogtreecommitdiff
path: root/09/src/part-1.rs
diff options
context:
space:
mode:
Diffstat (limited to '09/src/part-1.rs')
-rw-r--r--09/src/part-1.rs59
1 files changed, 59 insertions, 0 deletions
diff --git a/09/src/part-1.rs b/09/src/part-1.rs
new file mode 100644
index 0000000..f61c09d
--- /dev/null
+++ b/09/src/part-1.rs
@@ -0,0 +1,59 @@
+use std::collections::{HashSet};
+use std::io::{BufRead};
+
+
+fn main() {
+ let stdin = std::io::stdin();
+ let mut handle = stdin.lock();
+
+ let mut buf: Vec<u8> = Vec::new();
+ let mut seen: HashSet<[isize; 2]> = HashSet::new();
+ let mut head_pos: [isize; 2] = [0; 2];
+ let mut tail_pos: [isize; 2] = head_pos.clone();
+ seen.insert(tail_pos.clone());
+
+ loop {
+ buf.clear();
+ let num_bytes = handle.read_until(b'\n', &mut buf).expect("IO error");
+ if num_bytes == 0 { break; }
+
+ if buf[buf.len() - 1] == b'\n' { buf.pop(); }
+
+ let direction = buf[0];
+ let num_steps: usize = std::str::from_utf8(& buf[2..]).expect("Malformed input")
+ .parse().expect("Malformed input");
+
+ for dir in std::iter::repeat(direction).take(num_steps) {
+ match dir {
+ b'L' => head_pos[0] -= 1,
+ b'R' => head_pos[0] += 1,
+ b'U' => head_pos[1] += 1,
+ b'D' => head_pos[1] -= 1,
+ _ => panic!("Malformed input")
+ };
+ let delta: [isize; 2] = {
+ let mut ret: [isize; 2] = [0; 2];
+ for i in 0..2 { ret[i] = head_pos[i] - tail_pos[i]; }
+ ret
+ };
+ if delta[0].abs() == 2 {
+ tail_pos[0] += delta[0].signum();
+ if delta[1].abs() == 1 {
+ tail_pos[1] += delta[1].signum();
+ }
+ seen.insert(tail_pos.clone());
+ }
+ else if delta[1].abs() == 2 {
+ tail_pos[1] += delta[1].signum();
+ if delta[0].abs() == 1 {
+ tail_pos[0] += delta[0].signum();
+ }
+ seen.insert(tail_pos.clone());
+ }
+ }
+ }
+
+ println!("{}", seen.len());
+
+
+}