112 lines
3.4 KiB
Rust
112 lines
3.4 KiB
Rust
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 {
|
|
use super::*;
|
|
|
|
const INPUT: &str = ">
|
|
^v
|
|
^>v<
|
|
^v^v^v^v^v";
|
|
|
|
#[test]
|
|
fn part1() {
|
|
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);
|
|
}
|
|
}
|