From 24386b750b6922688402c9bd34eb515f1346d4cf Mon Sep 17 00:00:00 2001 From: Johannes Date: Sun, 15 Dec 2024 11:26:09 +0100 Subject: [PATCH] day 15 part 1 --- src/day15.rs | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + src/main.rs | 1 + 3 files changed, 77 insertions(+) create mode 100644 src/day15.rs diff --git a/src/day15.rs b/src/day15.rs new file mode 100644 index 0000000..40f6880 --- /dev/null +++ b/src/day15.rs @@ -0,0 +1,75 @@ +use std::fs::read_to_string; + +use crate::utils::grid::Grid; + +pub fn day_main() { + let input = read_to_string("input/day15.txt").unwrap(); + let input = input.trim(); + println!(" part1: {}", part1(input)); + println!(" part2: {}", part2(input)); +} + +type RiddleResult = i64; + +fn part1(input: &str) -> RiddleResult { + let (grid, movements) = input.split_once("\n\n").unwrap(); + let mut grid = Grid::parse(grid); + let mut robot = grid.entries().find(|(_r, c)| **c == '@').unwrap().0; + let directions = |d| match d { + '^' => (0, -1), + 'v' => (0, 1), + '<' => (-1, 0), + '>' => (1, 0), + _ => panic!(), + }; + for m in movements.chars().filter(|c| *c != '\n') { + let dir = directions(m); + let space = (1..) + .map(|i| (robot.0 + i * dir.0, robot.1 + i * dir.1)) + .take_while(|p| grid.get(*p).is_some() && (grid[*p] == '.' || grid[*p] == 'O')) + .find(|p| grid[*p] == '.'); + if let Some(p) = space { + if (p.0 - robot.0).abs() + (p.1 - robot.1).abs() > 1 { + // this means: the free spot is not a direct neighbor of the robot, i.e. there are boxes + grid[p] = 'O'; + } + grid[robot] = '.'; + robot = (robot.0 + dir.0, robot.1 + dir.1); + grid[robot] = '@'; + } + } + grid.entries() + .filter(|(_, c)| **c == 'O') + .map(|((x, y), _)| y * 100 + x) + .sum() +} + +fn part2(_input: &str) -> RiddleResult { + 0 +} + +#[cfg(test)] +mod test { + use super::{part1, part2}; + + const TEST_INPUT: &str = r"######## +#..O.O.# +##@.O..# +#...O..# +#.#.O..# +#...O..# +#......# +######## + +<^^>>>vv>v<<"; + + #[test] + fn test1() { + assert_eq!(part1(TEST_INPUT), 2028); + } + + #[test] + fn test2() { + assert_eq!(part2(TEST_INPUT), 0); + } +} diff --git a/src/lib.rs b/src/lib.rs index a2305cd..594a95f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,5 +12,6 @@ pub mod day11; pub mod day12; pub mod day13; pub mod day14; +pub mod day15; // PLACEHOLDER pub mod utils; diff --git a/src/main.rs b/src/main.rs index 29e9315..00b7b58 100644 --- a/src/main.rs +++ b/src/main.rs @@ -19,6 +19,7 @@ fn main() { (12, day12::day_main), (13, day13::day_main), (14, day14::day_main), + (15, day15::day_main), // PLACEHOLDER ]); let day: Option = args().nth(1).and_then(|a| a.parse().ok());