From e6000bafb6f2bc020a7e8b26b27b95df369607b2 Mon Sep 17 00:00:00 2001 From: Dennis Brentjes Date: Sat, 14 Dec 2024 22:08:00 +0100 Subject: [PATCH] Added Day6 --- resources/input6.txt | 130 ++++++++++++++++++++++ src/days/day6.rs | 258 +++++++++++++++++++++++++++++++++++++++++++ src/days/mod.rs | 21 +++- src/main.rs | 3 +- 4 files changed, 410 insertions(+), 2 deletions(-) create mode 100644 resources/input6.txt create mode 100644 src/days/day6.rs diff --git a/resources/input6.txt b/resources/input6.txt new file mode 100644 index 0000000..7af5b62 --- /dev/null +++ b/resources/input6.txt @@ -0,0 +1,130 @@ +.#..#......................#........#........................................#.............#......#...............#............... +.......#...........#........................#..............#.....#......#..##............#.....#.....................##........... +.#.....#........#.##..#.............#...........#................#............#.#.........#.....................#......#.......... +...........#...#.#.................................#.....................#............#.....#.#................#..#............... +..................................................................................#............................................... +..................#....................#.................#.........#..#.................#...........#...................#......... +.......#......#................#.......#............................#.................#.........................#...#........#.... +................................#..............................................................#.........#.........#.............. +.......................................................#............#......#........#.#...................#............#.......... +.....#......#..............................................#..............................................#....................... +......#..........................................................................................#................#............... +............................#..................#............#..#.#..............#..........#...................................... +......#..........................#...................#..........#....#.........................#.......................#....#..#.. +..................................#..........#....................................................................#........#...... +..#.................................#..................................................#......................#................... +.....#............#..................#......#...................................#.#........#.#......#........#.................... +........#......................#.....#...#.##................................#......#............................................. +...........#.........#...............................................................................#............................ +..................................#...##...............................#.............#.........................................##. +..........................#.#..#......................................#........#..............................#................... +......#...........###..#....#........................................................................................#............ +..............#.....................................................................#......##.............#....................... +.................................#...................#.........#..............................................#...........#....... +....................#..#...................................................#................................#........#............ +........................................#.#.#..................#....................#.....#.................#..................... +.........................#....#.....#.................##...............................................#.......#...#.............. +..#.........................#....................#.........................#..............................#...................#... +..................##....#..#..#.#.................................................................#............................... +..............#........................................................#.............................#......#..................... +.................#...........#........................#......#..........##....................#.................................#. +..........................#.............................................#..#.................................#.........#...#...... +..#..................##.....................................................#.....................#.......#.....#................. +....#.........................................#..................#.#.........................#.......................#............ +...#.....#.#..............................................................#................#......................#...#........#.. +.............................#..#......#.....................................................##................................... +...........#......................#....#.........#........................#......................................................# +............#.............................................#.................................#....#................................ +..............................................................#.............#................#.........#.........................# +..........................................#....#........#......................#.....#.............#.............................. +..#..#.............#...............................................#.....................................................#........ +................................................................................#.............#................................... +...............................................#.......................#................#............#....................#.#..... +.......................#.............................#.#..................#...#....#.................................#...#.....#.. +.......................#...........................#.........................................#.........#.........................# +...#.........#.....#..........................................#................................................................... +..........#..#...#...#........................#..........#..........................................#......#.........#............ +...............#............................#.#...................##.....................................................#........ +.........................................................#....................#........................#.........#....##....#...#. +......................................#.#................................................#........................#............... +..........#.............................................................#..#..#..............................#...#...#.#.......... +.........#.....................................................................................#...........#..#......#..........#. +............................#....................#..............#...#............................................................. +...........................................................#........#......................#.................................#.... +.........#..................#.........#.......#...............................#................#.............#...........#........ +............................#.........#........................................................................................... +................................#...........#.......................................#..........#.#.....#.......................... +..........................................#.................................................................................#..... +..............#...............................................#................................................................... +...#....#.....................#..........#..#......................#.............................................................. +.......................#..........#.................................................#......#.............#........#....#.......... +.........................................................................#.#......................................#............... +..........................................#.......................#...............................................#.........#...#. +............................#.......................................................#...#.........#..#...##........#.............. +...........................................................................#..............#..........#.............#.............. +#............#..#...#..#........#....................#...........#..#.........................................#..........#........ +...........................................................................#......#..^.........#.........#........................ +......#............................#.............................................................................................# +......................#.....#.......................................................#........................#..........#......... +................#....#.......#.............................#..............#....................#....#....................#........ +......#...................................#..................................................................#.................... +.....#..............#.#...........................................................#.................#.........#......#........#... +..#..#..#..#........#...........#...........#....##...........#.....................#............................................. +......................##.......................................................................................................... +...........#............#.........................................................#.....#.....#....................#.............. +#.............#..........#...............#..#.......................................#..............................#.............. +#.......................................#........#....#.......................................................#..#.............#.. +.......................#...#.....#..#...........................#...........#.........................#...#...#................#.. +#...............................................................#........................................#.....................#.. +..#.....................#............................##..........#..................##...#.....................................#.. +.......#...................##..........................................#........#................................................. +.........................................................#............................................#...............##.......... +.......................#......#..............................................................................................#.... +...........#.......................................#.................................#..........#.............#..................# +....#.............#......#............................#........................#...................#......#.....#..........#...... +.................................................................#................................#............................... +..........................................................#.......................#...#........................................... +.#............#...........................................#............................#..............................#...#.#..... +..#.................................................#.............................................#.....................#......... +.....#...............#...#.......................#.......................#......................................#...........#..... +...........#...#................................#.............................#........#.........................................# +..............................#.....................#......................#...#................................#................. +.........#.....................................................#...#......................................#................#...... +.....#.....................#.................................#...................................................#....#......#.... +................#.........#.........................#...........#...#..............................................#.............. +.................................#....................................................................#..................#......#. +#..............#......................................................................#.....#..................................... +.............#......#..............##.#............#.#.....................#..........#.......#..........................#........ +.......#............#.................#...........................................................#.............................#. +...........................#.......................#..................#....#....................................#................. +....#.....##...........................................#...........#.............#........................#.....#................. +............................#..............................................##..........#..................#.......#............... +#.............................#.............#...............................#..........#...#.....................................# +.............#.......#.....................................#...###......##...............#..#..............#.........#............ +.......#......##.....#..................#....................................#............#................#...................#.. +..............#......................#............#........#.....................................................#.........#....#. +.............#.......#...............................................##......#...........#...........#............................ +#.#....#..............................................................#.........................................#...............#. +...#....#........................#.#.......#.....................#.............................#.#......................#.#....... +.##........................................................#.#...................#.....#.................................#........ +............................#.#..................................#....#........................................................... +..................................................#......#...............#...............................#..#..#.......#.......... +..........#......................#..........#.........................#...............#..##.....................#................. +...#.......#.........................................................#............#.........#...#................................# +....................#...................................#..........#.....#...#..#........#............#................#.......... +...............................#........#.....................................#.....................................#.........#... +....#....................#...................................#.#........................#......................................... +.........#............................#.....................#.............#...........##.........#................................ +.............................................##........................................#......#................................#.. +...#...............................#.#...#...........#.............................#.............................................# +.............................#...........#................#..................................................#............#....... +................#....................................................................................#..#.#....................... +...#.............#.#..#.......................#.................#...............#..#....#..............#............#......#...... +...........#......#............................#.....#..........#.#.................#..........#...........#...............#...#.. +....#..................#...........................#.........#............#........#..........#..............................#.... +..........#.......#...................#......#.......#.......#....................#.....................................#......... +...#....................................................#......#...#...................#.....................#.................... +....................#..#.....#......#...................#............#.......................................#...............#.... +.........................#.......#.....#..#.......#...........#......##..............................#.........#.................. +.#...........#...#.........#....#...#.......#....#........................#...................#...#..................#............ +.........##......#..............................#....................#..#...#..................#............................#..... \ No newline at end of file diff --git a/src/days/day6.rs b/src/days/day6.rs new file mode 100644 index 0000000..92ca854 --- /dev/null +++ b/src/days/day6.rs @@ -0,0 +1,258 @@ +use std::path::Path; + +use advent_derive::advent_day; +use itertools::Itertools; + +use crate::{error::AdventError, input::get_lines}; +use super::*; + +#[derive(PartialEq, Clone, Copy, PartialOrd, Eq)] +enum Direction { + Up, + Right, + Down, + Left +} + +impl Ord for Direction { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + match self { + Direction::Up => { + match other { + Direction::Up => std::cmp::Ordering::Equal, + Direction::Right => std::cmp::Ordering::Greater, + Direction::Down => std::cmp::Ordering::Greater, + Direction::Left => std::cmp::Ordering::Greater, + } + }, + Direction::Right => { + match other { + Direction::Up => std::cmp::Ordering::Less, + Direction::Right => std::cmp::Ordering::Equal, + Direction::Down => std::cmp::Ordering::Greater, + Direction::Left => std::cmp::Ordering::Greater, + } + }, + Direction::Down => { + match other { + Direction::Up => std::cmp::Ordering::Less, + Direction::Right => std::cmp::Ordering::Less, + Direction::Down => std::cmp::Ordering::Equal, + Direction::Left => std::cmp::Ordering::Greater, + } + }, + Direction::Left => { + match other { + Direction::Up => std::cmp::Ordering::Less, + Direction::Right => std::cmp::Ordering::Less, + Direction::Down => std::cmp::Ordering::Less, + Direction::Left => std::cmp::Ordering::Equal, + } + }, + } + } +} + +struct Guard { + position: (i32, i32), + direction: Direction +} + +struct Day6Part1 { + obstacles: Vec<(i32, i32)>, + guard: Guard, + width: usize, + height: usize +} + +impl Day6Part1 { + fn new() -> Self { + Self { + obstacles: vec![], + guard: Guard { + position: (0, 0), + direction: Direction::Up + }, + width: 0, + height: 0 + } + } +} + +struct Day6Part2 { + obstacles: Vec<(i32, i32)>, + guard: Guard, + width: usize, + height: usize +} + +impl Day6Part2 { + fn new() -> Self { + Self { + obstacles: vec![], + guard: Guard { + position: (0, 0), + direction: Direction::Up + }, + width: 0, + height: 0 + } + } +} + +fn read_input_part1(part1: &mut Day6Part1, path: &Path) -> Result<(), AdventError> { + let iter = get_lines(path).enumerate(); + for (y, s) in iter { + let s = s?; + part1.width = s.len(); + part1.height = y+1; + for (x, _) in s.chars().enumerate().filter(|(_, c)| { *c == '#'}) { + part1.obstacles.push((x as i32, y as i32)); + } + if let Some(x) = s.chars().position(|c| { c == '^'}) { + part1.guard.position = (x as i32, y as i32); + } + } + Ok(()) +} + +fn solve_part1(part1: &mut Day6Part1) -> Result { + let mut spaces = vec![]; + spaces.push(part1.guard.position); + loop { + if let Some(x) = step(part1) { + spaces.push(x); + } else { + break; + } + } + Ok(spaces.iter().unique().count() as u64) +} + +fn step(part1: &mut Day6Part1) -> Option<(i32, i32)> { + let next_space = match part1.guard.direction { + Direction::Up => (part1.guard.position.0, part1.guard.position.1 - 1), + Direction::Right => (part1.guard.position.0 + 1, part1.guard.position.1), + Direction::Down => (part1.guard.position.0, part1.guard.position.1 + 1), + Direction::Left => (part1.guard.position.0 - 1, part1.guard.position.1) + }; + + if part1.obstacles.contains(&next_space) { + part1.guard.direction = match part1.guard.direction { + Direction::Up => Direction::Right, + Direction::Right => Direction::Down, + Direction::Down => Direction::Left, + Direction::Left => Direction::Up, + }; + return step(part1); + } + + if next_space.0 < 0 || next_space.0 > part1.width as i32 || next_space.1 < 0 || next_space.1 >= part1.height as i32 { + None + } else { + part1.guard.position = next_space; + Some(next_space) + } +} + +fn read_input_part2(part2: &mut Day6Part2, path: &Path) -> Result<(), AdventError> { + let iter = get_lines(path).enumerate(); + for (y, s) in iter { + let s = s?; + part2.width = s.len(); + part2.height = y+1; + for (x, _) in s.chars().enumerate().filter(|(_, c)| { *c == '#'}) { + part2.obstacles.push((x as i32, y as i32)); + } + if let Some(x) = s.chars().position(|c| { c == '^'}) { + part2.guard.position = (x as i32, y as i32); + } + } + Ok(()) +} + +fn step2(part2: &mut Day6Part2) -> Option<(i32, i32)> { + let next_space = match part2.guard.direction { + Direction::Up => (part2.guard.position.0, part2.guard.position.1 - 1), + Direction::Right => (part2.guard.position.0 + 1, part2.guard.position.1), + Direction::Down => (part2.guard.position.0, part2.guard.position.1 + 1), + Direction::Left => (part2.guard.position.0 - 1, part2.guard.position.1) + }; + + if let Ok(_) = part2.obstacles.binary_search(&next_space) { + part2.guard.direction = match part2.guard.direction { + Direction::Up => Direction::Right, + Direction::Right => Direction::Down, + Direction::Down => Direction::Left, + Direction::Left => Direction::Up, + }; + return step2(part2); + } + + if next_space.0 < 0 || next_space.0 > part2.width as i32 || next_space.1 < 0 || next_space.1 >= part2.height as i32 { + None + } else { + part2.guard.position = next_space; + Some(next_space) + } +} + +fn solve_part2(part2: &mut Day6Part2) -> Result { + let start_pos = part2.guard.position; + let start_dir = part2.guard.direction; + + part2.obstacles.sort(); + let mut spaces = vec![]; + loop { + if let Some(x) = step2(part2) { + spaces.push(x); + } else { + break; + } + } + + let obstacles_to_be = spaces.into_iter().unique().collect::>(); + let mut loops = 0u64; + for item in obstacles_to_be.into_iter() { + let mut been = vec![]; + part2.guard.position = start_pos; + part2.guard.direction = start_dir; + let remove_index; + match part2.obstacles.binary_search(&item) { + Ok(_) => { + return Err(AdventError("Should not happen".to_string())); + } + Err(pos) => { + remove_index = pos; + part2.obstacles.insert(pos, item) + } + } + + loop { + if let Some(pos) = step2(part2) { + let needle = (pos, part2.guard.direction); + if let Ok(_) = been.binary_search(&(pos, part2.guard.direction)) { + loops += 1; + break; + } + match been.binary_search(&needle) { + Ok(_) => { + return Err(AdventError("Should not happen".to_string())); + } + Err(pos) => { + been.insert(pos, needle) + } + } + } else { + break; + } + } + part2.obstacles.remove(remove_index); + } + + Ok(loops) + +} + +#[advent_day(Day6Part1, Day6Part2)] +struct Day6; \ No newline at end of file diff --git a/src/days/mod.rs b/src/days/mod.rs index 86d848e..f94eb20 100644 --- a/src/days/mod.rs +++ b/src/days/mod.rs @@ -20,5 +20,24 @@ pub mod day2; pub mod day3; pub mod day4; pub mod day5; +pub mod day6; -pub mod day14; \ No newline at end of file +pub mod day14; + +/* +fn read_input_part1(part1: &mut Day5Part1, path: &Path) -> Result<(), AdventError> { + Ok(()) +} + +fn solve_part1(part1: &mut Day5Part1) -> Result { + Ok(0) +} + +fn read_input_part2(part2: &mut Day5Part2, path: &Path) -> Result<(), AdventError> { + Ok(()) +} + +fn solve_part2(part2: &mut Day5Part2) -> Result { + Ok(0) +} +*/ \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index cdc2772..3f83572 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,6 +10,7 @@ use day2::Day2; use day3::Day3; use day4::Day4; use day5::Day5; +use day6::Day6; use crate::error::AdventError; use crate::days::*; @@ -42,7 +43,7 @@ fn main() -> Result<(), AdventError> { Box::new(Day3::new()), Box::new(Day4::new()), Box::new(Day5::new()), - Box::new(DummyDay::new()), + Box::new(Day6::new()), Box::new(DummyDay::new()), Box::new(DummyDay::new()), Box::new(DummyDay::new()),