From bf5747e9925988c8cf053f974fdcc35ca76df361 Mon Sep 17 00:00:00 2001 From: Gard Spreemann Date: Sun, 11 Dec 2022 16:14:28 +0100 Subject: Days 8 and 9 --- 09/src/part-1.rs | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 09/src/part-1.rs (limited to '09/src/part-1.rs') 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 = 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()); + + +} -- cgit v1.2.3