#[derive(Copy, Clone, PartialEq)] struct Pos { x :i32, y :i32 } fn move_tail(head :&Pos, tail :&mut Pos) { let dx = head.x - tail.x; let dy = head.y - tail.y; if dx.abs() > 1 || dy.abs() > 1{ tail.x += dx.signum(); tail.y += dy.signum(); } } fn execute_move(head :&mut Pos, tails :&mut Vec, cmd :&char) { match cmd { 'U' => { head.y += 1; } 'D' => { head.y -= 1; } 'L' => { head.x -= 1; } 'R' => { head.x += 1; } _ => {} } move_tail(head, &mut tails.first_mut().unwrap()); for i in 1..tails.len() { move_tail(&tails[i-1].clone(), &mut tails[i]); } } fn parse_command(inp :&String) -> (char, i32) { let split = inp.split(' ').collect::>(); return (split[0].chars().nth(0).unwrap(), split[1].parse::().unwrap()); } pub fn run(inp :Vec) { let mut visited_coordinates :Vec = vec![]; let mut head_pos = Pos {x: 0, y: 0} ; let mut tails :Vec = vec![Pos {x: 0, y: 0}; 9]; visited_coordinates.push(head_pos.clone()); for curr_move in inp { let commands = parse_command(&curr_move); for _ in 0..commands.1 { execute_move(&mut head_pos, &mut tails, &commands.0); if !visited_coordinates.contains(&tails.last().unwrap()) { visited_coordinates.push(tails.last().unwrap().clone()); } } } println!("a2: {}", visited_coordinates.len()); }