use core::panic; use std::collections::HashSet; pub fn process_part1(input: &str) -> i64 { let mut visited_coords = HashSet::new(); let mut last_coord = (0, 0); visited_coords.insert(last_coord); input.chars().for_each(|char| { if char == '^' { last_coord.1 += 1; visited_coords.insert(last_coord); } else if char == '>' { last_coord.0 += 1; visited_coords.insert(last_coord); } else if char == '<' { last_coord.0 -= 1; visited_coords.insert(last_coord); } else if char == 'v' { last_coord.1 -= 1; visited_coords.insert(last_coord); } else if char == '\n' { println!("The end"); } else { panic!("Could not parse direction"); } }); visited_coords.len() as i64 } pub fn process_part2(input: &str) -> i64 { let mut visited_coords = HashSet::new(); let mut last_coord = (0, 0); let mut is_robot = false; let mut last_robo_coord = (0, 0); visited_coords.insert(last_coord); input.chars().for_each(|char| { if is_robot { if char == '^' { last_robo_coord.1 += 1; visited_coords.insert(last_robo_coord); } else if char == '>' { last_robo_coord.0 += 1; visited_coords.insert(last_robo_coord); } else if char == '<' { last_robo_coord.0 -= 1; visited_coords.insert(last_robo_coord); } else if char == 'v' { last_robo_coord.1 -= 1; visited_coords.insert(last_robo_coord); } else if char == '\n' { println!("The end"); } else { panic!("Could not parse direction"); } } else if char == '^' { last_coord.1 += 1; visited_coords.insert(last_coord); } else if char == '>' { last_coord.0 += 1; visited_coords.insert(last_coord); } else if char == '<' { last_coord.0 -= 1; visited_coords.insert(last_coord); } else if char == 'v' { last_coord.1 -= 1; visited_coords.insert(last_coord); } else if char == '\n' { println!("The end"); } else { panic!("Could not parse direction"); } is_robot = !is_robot; }); visited_coords.len() as i64 } #[cfg(test)] mod tests_3 { use super::*; const INPUT: &str = "> ^v ^>v< ^v^v^v^v^v"; #[test] fn it_works() { let mut lines = INPUT.lines(); let result = process_part1(lines.next().unwrap()); assert_eq!(result, 2); let result = process_part1(lines.next().unwrap()); assert_eq!(result, 2); let result = process_part1(lines.next().unwrap()); assert_eq!(result, 4); let result = process_part1(lines.next().unwrap()); assert_eq!(result, 2); } #[test] fn part2() { let mut lines = INPUT.lines(); let result = process_part2(lines.next().unwrap()); assert_eq!(result, 2); let result = process_part2(lines.next().unwrap()); assert_eq!(result, 3); let result = process_part2(lines.next().unwrap()); assert_eq!(result, 3); let result = process_part2(lines.next().unwrap()); assert_eq!(result, 11); } }