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()); }