use std::io::{self, Read}; use std::collections::HashMap; fn main() { let mut input = String::new(); io::stdin().read_to_string(&mut input).unwrap(); let count = process(&input, 2); println!("count={}", count); } fn process(input: &str, versions: usize) -> usize { let mut houses: HashMap<(i32, i32), i32> = HashMap::new(); houses.insert((0, 0), versions as i32); let mut index = (0..versions).cycle(); let mut pos = vec![(0, 0); versions]; for step in input.chars() { let i = index.next().unwrap(); pos[i] = match step { '>' => (pos[i].0 + 1, pos[i].1), '<' => (pos[i].0 - 1, pos[i].1), '^' => (pos[i].0, pos[i].1 + 1), 'v' => (pos[i].0, pos[i].1 - 1), _ => pos[i], }; let count = houses.entry(pos[i]).or_insert(0); *count += 1; } houses.len() } #[cfg(test)] mod tests { use super::process; #[test] fn example_01() { assert_eq!(2, process(">", 1)); } #[test] fn example_02() { assert_eq!(4, process("^>v<", 1)); } #[test] fn example_03() { assert_eq!(2, process("^v^v^v^v^v", 1)); } #[test] fn example_04() { assert_eq!(3, process("^v", 2)); } #[test] fn example_05() { assert_eq!(3, process("^>v<", 2)); } #[test] fn example_06() { assert_eq!(11, process("^v^v^v^v^v", 2)); } }