y2024d6
This commit is contained in:
parent
013b85fbbf
commit
dbf878baf1
130
y2024/resources/6_input.txt
Normal file
130
y2024/resources/6_input.txt
Normal file
@ -0,0 +1,130 @@
|
||||
.........................#...........#.#...#...............#..............##.....................#...........#..#.........#.......
|
||||
.....................#.................#.......#.........................#...........#.#.......#..................................
|
||||
.........#...........#........#.........#.........#...........#........................................#.........................#
|
||||
.......#.........................#...........................#.............#......................................................
|
||||
..................#................##...............#.#.....................##............#.......................................
|
||||
......#...#................#..................................................................#....#.#............................
|
||||
.......##................#........#..#.......#......................................#........#............#......###..........#...
|
||||
.....................#....................................................#...........#..#...#..........................#.........
|
||||
...........#....#...........................#.#...............#..#....................................#..............#......#.....
|
||||
.....#........##...............#.......#..#..............................................#..........................#.............
|
||||
.#.........#.#...........................#..........................#......................#...........#........#.................
|
||||
.................................................................#..#.#.......#..#................................................
|
||||
...............................................#.......#...................#....................#.................................
|
||||
.......#......#......#......................#...............................#.....##........#...........#......#..................
|
||||
........................................................................................................#.....#.#.................
|
||||
..#...............................#.#..................................#.............#............................................
|
||||
..............#..........................................#.....#.....#..........................#....#.........#..................
|
||||
...................................#........................................#................#...........##.....#....#............
|
||||
.#.....................................#.......#........................#...................##............#.......................
|
||||
.#..................#...........#...........................................................................................#.....
|
||||
........................#...................................................##.................................#..#..........##...
|
||||
........#............................#.......#...........................#.#...#...................................#.....#........
|
||||
...............................#............#.....#......................#.......#...#........................#...................
|
||||
.........#.............#.................................................#.......................................#....#...........
|
||||
...................................................................#...#.................................#...................#....
|
||||
...#.....................#...#...............#..................................................#...#...#.........................
|
||||
...................#........#....#....#..#..#...................#.........#..................#..#....#.......#.#.................#
|
||||
..............................#........................................#......#.....#..............##................#............
|
||||
............#..#.............#.......#........................................................##........#.....#...................
|
||||
.....#.............................................................#...#.#.#.............................#..#.#...........#.......
|
||||
.......#....#............................................#.................................#...................................#..
|
||||
..#.................#.......#..........................#........................................#...............#..............#..
|
||||
....#.#...................#............................#..#.......................................................................
|
||||
.......................#...............#..............#......#......................#.....................#..............#........
|
||||
.#..........#.......................................................................#....................................#........
|
||||
.#.......#..................................................................#.....................................................
|
||||
..................................................#.............#.............................................#................#.#
|
||||
.......................#......#....#................#......................................................#.......#.........#....
|
||||
..........................#.#........................................................#......#................................#....
|
||||
....................................................................#...............................#.............................
|
||||
..#...........#..............................#..#....#............................#...............##..............#...#...#...#..#
|
||||
...................................#................................................................#....#...................#....
|
||||
..#....#........#..##....#........................#...#...................................#.......................................
|
||||
...................#................................................................................................#.............
|
||||
.......#........#................#...#.......................................................................#....................
|
||||
..............#....................#..........................##.........#.....................................#..................
|
||||
.........................................................................#.................#........................#.............
|
||||
.............................#..........#.......................................................#......................#..........
|
||||
............###....................................................................#.......................#......................
|
||||
........#........#...........#.............................#....................#..........#.........................#.#.....#....
|
||||
.........................................................................................................#..#.....................
|
||||
#.#.....#..........................................................#.....................#........................................
|
||||
........##..........#....................................................#..#........#.......#........#................#..........
|
||||
.............................................#..........................#.........#........................#......................
|
||||
...........................##.............#........................#.#........................#..#................#.....#........#
|
||||
#...#..............................................#........#...................................................#.................
|
||||
.............#................#............................#............#.........................................................
|
||||
#..........................#............#.....................#.....#.................#......#...##...#.............#.#...........
|
||||
.....................#...#..#....#...................................#....................#..............#........#...............
|
||||
.......................#.................#...........#....#.......#...........................................#..#................
|
||||
.........#...........#.#.........#.........................#.....#................................................................
|
||||
....................#........#...................................................................#............#..#.#.#............
|
||||
..........#.......................#.......................#.......................................................................
|
||||
......................................#......#............................#..............................................#........
|
||||
.....................#...#.................#.............................#....#...................................................
|
||||
..............##...................................................................#......................................##......
|
||||
.....#....#...............................................#.......#.##........#.#.............#...............#...................
|
||||
....................................#......................#........#.......................................................#.....
|
||||
.....#.........................................#.....................#.............#.................#..................#.........
|
||||
................................#.........#..#............................................#.........................#.............
|
||||
....#.#.....................#......#...................................#..........................................#..#.....#...#..
|
||||
.........##.......................#..........................................#.........................#...##.....................
|
||||
...............................................................#................................................................#.
|
||||
............#.........................................##.......................................#..................................
|
||||
.............................#..............................#..................#.........#.....#..................................
|
||||
..........................................................#...#.....#..................#................................#.........
|
||||
......#...................#.........................................................................................#.............
|
||||
#...............................#...........................#.....................................................................
|
||||
.......#........#.................................................#.......................................................#.......
|
||||
.#......................................................#..............#..................................#...........#...........
|
||||
.............#..#.#.......................#..........#......#.##.........................................................#..#.....
|
||||
.......#...............#........#......................................................................#..#...........#...........
|
||||
............#.........................................#................................................#...................#......
|
||||
............#...........................................#.#.......#....................................#..........................
|
||||
...........................................#.........................................................#..............#.............
|
||||
..................#..#....................................................#..................#....................................
|
||||
..#........................#........#.............................................................................................
|
||||
.............#........#......................#.......................................#...#....#............................#......
|
||||
............#.......#.............#...#...........#.#.................................#.................##........................
|
||||
.....................................................................................#.........#.......................#.....#....
|
||||
.................#................................#..#....#......#..........................................#.....#...............
|
||||
..#...............................#........................................................#.......#...#............#.............
|
||||
#.........#..#..#.....................................#....................................#................#.................#...
|
||||
.......................#..#...#............................................................................#..#.....#.......##....
|
||||
..........#............#.......................#.........................^......#.#...................................#...........
|
||||
...##........................##..........#..........#.................#...............#...........#.....##........................
|
||||
..............#............#..........................#....#...........#......#......#......................#.....................
|
||||
......#.....#....................................................#............#.#......................................#..........
|
||||
......#.............................#......................#...............................#........#.............................
|
||||
.#..........#.............................................#.............................................#.........................
|
||||
...............................##.................................................................................................
|
||||
.....................#................................................#...............#............#...............#.....#.....#..
|
||||
..................#...........................................................................#...........#...................#...
|
||||
##..............................#.#...#.#...............................#...........#.#...................#.......................
|
||||
......................#.........#...................................#.................#...........................................
|
||||
.......................#............................................................................#.........##...........#......
|
||||
.....................................................................#.......#.....#.......................................#......
|
||||
#....................................#........#.#.................................................................##.....#........
|
||||
..............#..............................#......#..........###.........#................#..............#..................#...
|
||||
..................................#..............................#.................##.............................#...#...........
|
||||
...............#......#........................#....#........#............#.........#..........#..............#......#............
|
||||
...#...........#........#...#...........................#.............#.....................................#.....................
|
||||
..............###............#...........................................................#.............#.........##..#............
|
||||
............#................................................#.......#..................#....#....................................
|
||||
.........#.#...#.....#...........................#.....##......#.....................#..#........#......#.........................
|
||||
.#....#.......#.......................#.................................................................#.......#..............#..
|
||||
...................#................................................................#.............#...#...........#.........#.....
|
||||
.......#.#.......#.......................#....#.....#...............#...#.....#...........................................#.......
|
||||
.......#........#...........................................#...........#.........................#....#.......#..................
|
||||
..................................#.#.................#.#............................................#...........#....#...........
|
||||
....##......#.............#...................................#...#.........#...........................#......#..................
|
||||
.........................#......#....#...#........................................................................................
|
||||
...#...............#............................................................................#...........................#.....
|
||||
....##.#..............................................#............#................#................................#......#.....
|
||||
.........#...........................................#...#.......##..............................#................................
|
||||
..................#..........#......#.......#......................................#........#...............#......#...........##.
|
||||
........................................#......#..........#......................................................................#
|
||||
..............#...#...................#.....#..........................................................#..............#......#....
|
||||
...#........#........................#...#................#........#.............................##..........................#....
|
||||
............#............................#.#........................#.................................#..........................#
|
20
y2024/src/bin/d6.rs
Normal file
20
y2024/src/bin/d6.rs
Normal file
@ -0,0 +1,20 @@
|
||||
use std::fs;
|
||||
|
||||
use y2024::days::d6;
|
||||
|
||||
fn main() {
|
||||
part1();
|
||||
part2();
|
||||
}
|
||||
|
||||
fn part1() {
|
||||
let root = env!("CARGO_MANIFEST_DIR");
|
||||
let content = fs::read_to_string(format!("{root}/resources/6_input.txt")).unwrap();
|
||||
println!("{}", d6::process_part1(&content));
|
||||
}
|
||||
|
||||
fn part2() {
|
||||
let root = env!("CARGO_MANIFEST_DIR");
|
||||
let content = fs::read_to_string(format!("{root}/resources/6_input.txt")).unwrap();
|
||||
println!("{}", d6::process_part2(&content));
|
||||
}
|
331
y2024/src/days/d6.rs
Normal file
331
y2024/src/days/d6.rs
Normal file
@ -0,0 +1,331 @@
|
||||
use std::{collections::HashSet, error::Error, fmt::Display};
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
||||
enum GuardDirection {
|
||||
Up,
|
||||
Down,
|
||||
Left,
|
||||
Right,
|
||||
}
|
||||
|
||||
impl GuardDirection {
|
||||
fn turn_right(&mut self) {
|
||||
*self = match self {
|
||||
GuardDirection::Up => GuardDirection::Right,
|
||||
GuardDirection::Down => GuardDirection::Left,
|
||||
GuardDirection::Left => GuardDirection::Up,
|
||||
GuardDirection::Right => GuardDirection::Down,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
impl From<GuardDirection> for char {
|
||||
fn from(value: GuardDirection) -> Self {
|
||||
match value {
|
||||
GuardDirection::Up => '^',
|
||||
GuardDirection::Down => 'v',
|
||||
GuardDirection::Left => '<',
|
||||
GuardDirection::Right => '>',
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl TryFrom<char> for GuardDirection {
|
||||
type Error = Box<dyn Error>;
|
||||
|
||||
fn try_from(value: char) -> std::result::Result<GuardDirection, Box<dyn Error>> {
|
||||
match value {
|
||||
'^' => Ok(Self::Up),
|
||||
'v' => Ok(Self::Down),
|
||||
'<' => Ok(Self::Left),
|
||||
'>' => Ok(Self::Right),
|
||||
_ => Err(Box::from(format!("{value} is not a valid direction"))),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Display for GuardDirection {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
match self {
|
||||
GuardDirection::Up => write!(f, "^"),
|
||||
GuardDirection::Down => write!(f, "v"),
|
||||
GuardDirection::Left => write!(f, "<"),
|
||||
GuardDirection::Right => write!(f, ">"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn process_part1(input: &str) -> i32 {
|
||||
let grid = input
|
||||
.lines()
|
||||
.map(|line| line.chars().collect::<Vec<char>>())
|
||||
.collect::<Vec<Vec<char>>>();
|
||||
get_visited_positions(grid, true).len() as i32
|
||||
}
|
||||
|
||||
fn get_visited_positions(grid: Vec<Vec<char>>, initial: bool) -> HashSet<(i32, i32)> {
|
||||
let width = grid[1].len() as i32;
|
||||
let height = grid.len() as i32;
|
||||
let mut crates: Vec<(i32, i32)> = Vec::new();
|
||||
let mut guard_position = (0, 0);
|
||||
let mut guard_direction = GuardDirection::Up;
|
||||
for (row, line) in grid.into_iter().enumerate() {
|
||||
for (col, chara) in line.into_iter().enumerate() {
|
||||
if chara == '#' {
|
||||
crates.push((col as i32, row as i32));
|
||||
}
|
||||
if chara == '.' {
|
||||
continue;
|
||||
}
|
||||
if GuardDirection::try_from(chara).is_ok() {
|
||||
guard_position = (col as i32, row as i32);
|
||||
guard_direction = GuardDirection::try_from(chara).unwrap();
|
||||
}
|
||||
}
|
||||
}
|
||||
let mut visited_positions = HashSet::new();
|
||||
if initial {
|
||||
visited_positions.insert(guard_position);
|
||||
}
|
||||
loop {
|
||||
match guard_direction {
|
||||
GuardDirection::Up => {
|
||||
let mut closest = (guard_position.0, -1);
|
||||
crates.iter().for_each(|&crate_pos| {
|
||||
if guard_position.0 == crate_pos.0
|
||||
&& guard_position.1 > crate_pos.1
|
||||
&& guard_position.1 - crate_pos.1 < guard_position.1 - closest.1
|
||||
{
|
||||
closest = crate_pos;
|
||||
}
|
||||
});
|
||||
for idx in ((closest.1 + 1)..guard_position.1).rev() {
|
||||
visited_positions.insert((guard_position.0, idx));
|
||||
if idx == 0 {
|
||||
return visited_positions;
|
||||
}
|
||||
}
|
||||
guard_position.1 = closest.1 + 1;
|
||||
guard_direction.turn_right();
|
||||
}
|
||||
GuardDirection::Down => {
|
||||
let mut closest = (guard_position.0, height);
|
||||
crates.iter().for_each(|&crate_pos| {
|
||||
if guard_position.0 == crate_pos.0
|
||||
&& guard_position.1 < crate_pos.1
|
||||
&& crate_pos.1 - guard_position.1 < closest.1 - guard_position.1
|
||||
{
|
||||
closest = crate_pos;
|
||||
}
|
||||
});
|
||||
for idx in (guard_position.1 + 1)..closest.1 {
|
||||
visited_positions.insert((guard_position.0, idx));
|
||||
if idx == height - 1 {
|
||||
return visited_positions;
|
||||
}
|
||||
}
|
||||
guard_position.1 = closest.1 - 1;
|
||||
guard_direction.turn_right();
|
||||
}
|
||||
GuardDirection::Left => {
|
||||
let mut closest = (-1, guard_position.1);
|
||||
crates.iter().for_each(|&crate_pos| {
|
||||
if guard_position.1 == crate_pos.1
|
||||
&& guard_position.0 > crate_pos.0
|
||||
&& guard_position.0 - crate_pos.0 < guard_position.0 - closest.0
|
||||
{
|
||||
closest = crate_pos;
|
||||
}
|
||||
});
|
||||
for idx in ((closest.0 + 1)..guard_position.0).rev() {
|
||||
visited_positions.insert((idx, guard_position.1));
|
||||
if idx == 0 {
|
||||
return visited_positions;
|
||||
}
|
||||
}
|
||||
guard_position.0 = closest.0 + 1;
|
||||
guard_direction.turn_right();
|
||||
}
|
||||
GuardDirection::Right => {
|
||||
let mut closest = (width, guard_position.1);
|
||||
crates.iter().for_each(|&crate_pos| {
|
||||
if guard_position.1 == crate_pos.1
|
||||
&& guard_position.0 < crate_pos.0
|
||||
&& crate_pos.0 - guard_position.0 < closest.0 - guard_position.0
|
||||
{
|
||||
closest = crate_pos;
|
||||
}
|
||||
});
|
||||
for idx in (guard_position.0 + 1)..closest.0 {
|
||||
visited_positions.insert((idx, guard_position.1));
|
||||
if idx == width - 1 {
|
||||
return visited_positions;
|
||||
}
|
||||
}
|
||||
guard_position.0 = closest.0 - 1;
|
||||
guard_direction.turn_right();
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// 1424
|
||||
pub fn process_part2(input: &str) -> i32 {
|
||||
let grid = input
|
||||
.lines()
|
||||
.map(|line| line.chars().collect::<Vec<char>>())
|
||||
.collect::<Vec<Vec<char>>>();
|
||||
let width = grid[1].len() as i32;
|
||||
let height = grid.len() as i32;
|
||||
let mut crates: Vec<(i32, i32)> = Vec::new();
|
||||
let possible_obstacles: Vec<(i32, i32)> = Vec::from_iter(get_visited_positions(grid, false));
|
||||
let mut initial_guard_position = (0, 0);
|
||||
let mut initial_guard_direction = GuardDirection::Up;
|
||||
for (row, line) in input.lines().enumerate() {
|
||||
for (col, chara) in line.chars().enumerate() {
|
||||
if chara == '#' {
|
||||
crates.push((col as i32, row as i32));
|
||||
}
|
||||
if chara == '.' {
|
||||
continue;
|
||||
}
|
||||
if GuardDirection::try_from(chara).is_ok() {
|
||||
initial_guard_position = (col as i32, row as i32);
|
||||
initial_guard_direction = GuardDirection::try_from(chara).unwrap();
|
||||
}
|
||||
}
|
||||
}
|
||||
let mut loops = 0;
|
||||
for possible_obstacle in possible_obstacles {
|
||||
let mut visited_obstacles = HashSet::new();
|
||||
crates.push(possible_obstacle);
|
||||
let mut guard_position = initial_guard_position;
|
||||
let mut guard_direction = initial_guard_direction;
|
||||
'loop_finder: loop {
|
||||
match guard_direction {
|
||||
GuardDirection::Up => {
|
||||
let mut closest = (guard_position.0, -1);
|
||||
crates.iter().for_each(|&crate_pos| {
|
||||
if guard_position.0 == crate_pos.0
|
||||
&& guard_position.1 > crate_pos.1
|
||||
&& guard_position.1 - crate_pos.1 < guard_position.1 - closest.1
|
||||
{
|
||||
closest = crate_pos;
|
||||
}
|
||||
});
|
||||
guard_position.1 = closest.1 + 1;
|
||||
if closest.1 == -1 {
|
||||
break 'loop_finder;
|
||||
}
|
||||
if visited_obstacles
|
||||
.contains(&((guard_position.0, closest.1 + 1), guard_direction))
|
||||
{
|
||||
loops += 1;
|
||||
break 'loop_finder;
|
||||
}
|
||||
visited_obstacles.insert(((guard_position.0, closest.1 + 1), guard_direction));
|
||||
guard_direction.turn_right();
|
||||
}
|
||||
GuardDirection::Down => {
|
||||
let mut closest = (guard_position.0, height);
|
||||
crates.iter().for_each(|&crate_pos| {
|
||||
if guard_position.0 == crate_pos.0
|
||||
&& guard_position.1 < crate_pos.1
|
||||
&& crate_pos.1 - guard_position.1 < closest.1 - guard_position.1
|
||||
{
|
||||
closest = crate_pos;
|
||||
}
|
||||
});
|
||||
guard_position.1 = closest.1 - 1;
|
||||
if closest.1 == height {
|
||||
break 'loop_finder;
|
||||
}
|
||||
if visited_obstacles
|
||||
.contains(&((guard_position.0, closest.1 - 1), guard_direction))
|
||||
{
|
||||
loops += 1;
|
||||
break 'loop_finder;
|
||||
}
|
||||
visited_obstacles.insert(((guard_position.0, closest.1 - 1), guard_direction));
|
||||
guard_direction.turn_right();
|
||||
}
|
||||
GuardDirection::Left => {
|
||||
let mut closest = (-1, guard_position.1);
|
||||
crates.iter().for_each(|&crate_pos| {
|
||||
if guard_position.1 == crate_pos.1
|
||||
&& guard_position.0 > crate_pos.0
|
||||
&& guard_position.0 - crate_pos.0 < guard_position.0 - closest.0
|
||||
{
|
||||
closest = crate_pos;
|
||||
}
|
||||
});
|
||||
guard_position.0 = closest.0 + 1;
|
||||
if closest.0 == -1 {
|
||||
break 'loop_finder;
|
||||
}
|
||||
if visited_obstacles
|
||||
.contains(&((closest.0 + 1, guard_position.1), guard_direction))
|
||||
{
|
||||
loops += 1;
|
||||
break 'loop_finder;
|
||||
}
|
||||
visited_obstacles.insert(((closest.0 + 1, guard_position.1), guard_direction));
|
||||
guard_direction.turn_right();
|
||||
}
|
||||
GuardDirection::Right => {
|
||||
let mut closest = (width, guard_position.1);
|
||||
crates.iter().for_each(|&crate_pos| {
|
||||
if guard_position.1 == crate_pos.1
|
||||
&& guard_position.0 < crate_pos.0
|
||||
&& crate_pos.0 - guard_position.0 < closest.0 - guard_position.0
|
||||
{
|
||||
closest = crate_pos;
|
||||
}
|
||||
});
|
||||
guard_position.0 = closest.0 - 1;
|
||||
if closest.0 == width {
|
||||
break 'loop_finder;
|
||||
}
|
||||
if visited_obstacles
|
||||
.contains(&((closest.0 - 1, guard_position.1), guard_direction))
|
||||
{
|
||||
loops += 1;
|
||||
break 'loop_finder;
|
||||
}
|
||||
visited_obstacles.insert(((closest.0 - 1, guard_position.1), guard_direction));
|
||||
guard_direction.turn_right();
|
||||
}
|
||||
};
|
||||
}
|
||||
crates.pop();
|
||||
}
|
||||
loops
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
const INPUT: &str = "....#.....
|
||||
.........#
|
||||
..........
|
||||
..#.......
|
||||
.......#..
|
||||
..........
|
||||
.#..^.....
|
||||
........#.
|
||||
#.........
|
||||
......#...";
|
||||
|
||||
#[test]
|
||||
fn part1() {
|
||||
let result = process_part1(INPUT);
|
||||
assert_eq!(result, 41);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn part2() {
|
||||
let result = process_part2(INPUT);
|
||||
assert_eq!(result, 6);
|
||||
}
|
||||
}
|
@ -7,3 +7,5 @@ pub mod d3;
|
||||
pub mod d4;
|
||||
|
||||
pub mod d5;
|
||||
|
||||
pub mod d6;
|
||||
|
Loading…
Reference in New Issue
Block a user