AdventOfCode/y2015/src/days/d3.rs
2024-10-30 11:34:40 +01:00

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