From 26d5edcf003ce8ca6e905581b4422ba37fd5f272 Mon Sep 17 00:00:00 2001 From: Mark Fulton Date: Tue, 17 Dec 2024 07:20:09 -0600 Subject: [PATCH] feat: 2024 Day 15 Part 1 --- 2024/day/15/part/1/solve.test.ts | 46 ++++++++++++++++++++++++++++++++ 2024/day/15/part/1/solve.ts | 34 +++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 2024/day/15/part/1/solve.test.ts create mode 100644 2024/day/15/part/1/solve.ts diff --git a/2024/day/15/part/1/solve.test.ts b/2024/day/15/part/1/solve.test.ts new file mode 100644 index 0000000..6e97feb --- /dev/null +++ b/2024/day/15/part/1/solve.test.ts @@ -0,0 +1,46 @@ +import solve from "./solve.ts"; + +import { assertEquals } from "@std/assert"; + +Deno.test("smaller example", () => { + const input = `\ +######## +#..O.O.# +##@.O..# +#...O..# +#.#.O..# +#...O..# +#......# +######## + +<^^>>>vv>v<<`; + + assertEquals(solve(input), 2028); +}); + +Deno.test("large example", () => { + const input = `\ +########## +#..O..O.O# +#......O.# +#.OO..O.O# +#..O@..O.# +#O#..O...# +#O..O..O.# +#.OO.O.OO# +#....O...# +########## + +^v>^vv^v>v<>v^v<<><>>v^v^>^<<<><^ +vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<^<^^>>>^<>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^v^^<^^vv< +<>^^^^>>>v^<>vvv^>^^^vv^^>v<^^^^v<>^>vvvv><>>v^<<^^^^^ +^><^><>>><>^^<<^^v>>><^^>v>>>^v><>^v><<<>vvvv>^<><<>^>< +^>><>^v<><^vvv<^^<><^v<<<><<<^^<^>>^<<<^>>^v^>>^v>vv>^<<^v<>><<><<>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^ +<><^^>^^^<>^vv<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<> +^^>vv<^v^v^<>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<>< +v^^>>><<^^<>>^v^v^<<>^<^v^v><^<<<><<^vv>>v>v^<<^`; + + assertEquals(solve(input), 10092); +}); diff --git a/2024/day/15/part/1/solve.ts b/2024/day/15/part/1/solve.ts new file mode 100644 index 0000000..7c8846d --- /dev/null +++ b/2024/day/15/part/1/solve.ts @@ -0,0 +1,34 @@ +const moveToDir = { "^": [0, -1], "v": [0, 1], "<": [-1, 0], ">": [1, 0] }; + +export default function solve(input: string) { + const [top, bottom] = input.split("\n\n"); + const grid = top.split("\n").map((line) => [...line]); + const moves = bottom.replaceAll("\n", ""); + let py = grid.findIndex((row) => row.includes("@")), + px = grid[py].indexOf("@"); + function swap(x1: number, y1: number, x2: number, y2: number) { + [grid[y1][x1], grid[y2][x2]] = [grid[y2][x2], grid[y1][x1]]; + } + for (const move of moves) { + const [dx, dy] = moveToDir[move as keyof typeof moveToDir]; + let canMove = false, [wx, wy] = [px + dx, py + dy]; + while (grid[wy][wx] !== "#") { + canMove ||= grid[wy][wx] === ".", wx += dx, wy += dy; + } + if (!canMove) continue; + let d = 0; + while (grid[py + (d + 1) * dy][px + (d + 1) * dx] !== ".") d++; + for (; d; d--) { + swap(px + d * dx, py + d * dy, px + (d + 1) * dx, py + (d + 1) * dy); + } + swap(px, py, px + dx, py + dy); + px += dx, py += dy; + } + let sum = 0; + for (let y = 0; y < grid.length; y++) { + for (let x = 0; x < grid[y].length; x++) { + if (grid[y][x] === "O") sum += 100 * y + x; + } + } + return sum; +}