From 4421042a811c948c41f8cada713ffa3944fddcd9 Mon Sep 17 00:00:00 2001 From: C4 Patino Date: Sun, 15 Dec 2024 02:24:36 -0600 Subject: [PATCH] Added day 15 code --- 2024/cmd/root.go | 2 + 2024/day15/day15.go | 237 +++++++++++++++++++++++++++++++++++++++ 2024/day15/day15_test.go | 44 ++++++++ 2024/day15/input.txt | 71 ++++++++++++ 2024/day15/test.txt | 21 ++++ 5 files changed, 375 insertions(+) create mode 100755 2024/day15/day15.go create mode 100755 2024/day15/day15_test.go create mode 100755 2024/day15/input.txt create mode 100755 2024/day15/test.txt diff --git a/2024/cmd/root.go b/2024/cmd/root.go index 159ac22..5989406 100644 --- a/2024/cmd/root.go +++ b/2024/cmd/root.go @@ -23,6 +23,7 @@ import ( "cpatino.com/advent-of-code/2024/day12" "cpatino.com/advent-of-code/2024/day13" "cpatino.com/advent-of-code/2024/day14" + "cpatino.com/advent-of-code/2024/day15" ) var days = map[int]func(string) (int, int){ @@ -40,6 +41,7 @@ var days = map[int]func(string) (int, int){ 12: day12.Run, 13: day13.Run, 14: day14.Run, + 15: day15.Run, } var rootCmd = &cobra.Command{ diff --git a/2024/day15/day15.go b/2024/day15/day15.go new file mode 100755 index 0000000..ea60c21 --- /dev/null +++ b/2024/day15/day15.go @@ -0,0 +1,237 @@ +package day15 + +import ( + "bufio" + "image" + "os" +) + +type Direction string +type Object string + +const ( + NORTH Direction = "^" + SOUTH Direction = "v" + EAST Direction = ">" + WEST Direction = "<" +) + +const ( + Player Object = "@" + Box Object = "O" + Wall Object = "#" + Empty Object = "." + BoxLeft Object = "[" + BoxRight Object = "]" +) + +var transformations = map[Direction]image.Point{ + NORTH: image.Point{X: 0, Y: -1}, + SOUTH: image.Point{X: 0, Y: 1}, + EAST: image.Point{X: 1, Y: 0}, + WEST: image.Point{X: -1, Y: 0}, +} + +func checkCanMove(grid [][]Object, position image.Point, direction Direction) bool { + newPosition := position.Add(transformations[direction]) + object := grid[newPosition.Y][newPosition.X] + + var leftPos, rightPos image.Point + switch object { + case BoxLeft: + leftPos, rightPos = newPosition, newPosition.Add(transformations[EAST]) + case BoxRight: + leftPos, rightPos = newPosition.Add(transformations[WEST]), newPosition + } + + switch object { + case Wall: + return false + case Box: + return checkCanMove(grid, newPosition, direction) + case BoxLeft, BoxRight: + switch direction { + case NORTH, SOUTH: + return checkCanMove(grid, leftPos, direction) && checkCanMove(grid, rightPos, direction) + case EAST: + return checkCanMove(grid, rightPos, direction) + case WEST: + return checkCanMove(grid, newPosition, direction) + } + } + + return true +} + +func move(grid [][]Object, position image.Point, direction Direction) image.Point { + newPosition := position.Add(transformations[direction]) + if !checkCanMove(grid, position, direction) { + return position + } + + object := grid[position.Y][position.X] + switch grid[newPosition.Y][newPosition.X] { + case Box: + move(grid, newPosition, direction) + case BoxLeft: + switch direction { + case NORTH, SOUTH: + move(grid, newPosition, direction) + move(grid, newPosition.Add(transformations[EAST]), direction) + case EAST, WEST: + move(grid, newPosition, direction) + } + case BoxRight: + switch direction { + case NORTH, SOUTH: + move(grid, newPosition, direction) + move(grid, newPosition.Add(transformations[WEST]), direction) + case EAST, WEST: + move(grid, newPosition, direction) + } + } + + grid[position.Y][position.X] = Empty + grid[newPosition.Y][newPosition.X] = object + + return newPosition +} + +func takeScore(grid [][]Object) int { + score := 0 + + for y, row := range grid { + for x := range row { + if grid[y][x] == Box || grid[y][x] == BoxLeft { + score += 100*y + x + } + } + } + + return score +} + +func Part1(grid [][]Object, position image.Point, movements []Direction) int { + for _, direction := range movements { + position = move(grid, position, direction) + } + + return takeScore(grid) +} + +func Part2(grid [][]Object, position image.Point, movements []Direction) int { + for _, direction := range movements { + position = move(grid, position, direction) + } + + return takeScore(grid) +} + +func parse(file *os.File) ([][]Object, image.Point, []Direction) { + var grid [][]Object + var position image.Point + + y := 0 + scanner := bufio.NewScanner(file) + for scanner.Scan() { + line := scanner.Text() + if line == "" { + break + } + + row := make([]Object, len(line)) + for x, char := range line { + if Object(char) == Player { + position = image.Point{X: x, Y: y} + } + + row[x] = Object(char) + } + + grid = append(grid, row) + y++ + } + + var movements []Direction + for scanner.Scan() { + line := scanner.Text() + for _, char := range line { + direction := Direction(char) + movements = append(movements, direction) + } + } + + if err := scanner.Err(); err != nil { + panic(err) + } + + return grid, position, movements +} + +func parseLarge(file *os.File) ([][]Object, image.Point, []Direction) { + var grid [][]Object + var position image.Point + + y := 0 + scanner := bufio.NewScanner(file) + for scanner.Scan() { + line := scanner.Text() + if line == "" { + break + } + + var row []Object + for x, char := range line { + switch Object(char) { + case Box: + row = append(append(row, BoxLeft), BoxRight) + case Wall: + row = append(append(row, Wall), Wall) + case Empty: + row = append(append(row, Empty), Empty) + case Player: + row = append(append(row, Player), Empty) + position = image.Point{X: x * 2, Y: y} + } + } + + grid = append(grid, row) + y++ + } + + var movements []Direction + for scanner.Scan() { + line := scanner.Text() + for _, char := range line { + direction := Direction(char) + movements = append(movements, direction) + } + } + + if err := scanner.Err(); err != nil { + panic(err) + } + + return grid, position, movements +} + +func Run(filename string) (int, int) { + file, err := os.Open(filename) + if err != nil { + panic(err) + } + defer file.Close() + + grid, position, movements := parse(file) + part1 := Part1(grid, position, movements) + + _, err = file.Seek(0, 0) + if err != nil { + panic(err) + } + + grid, position, movements = parseLarge(file) + part2 := Part2(grid, position, movements) + + return part1, part2 +} diff --git a/2024/day15/day15_test.go b/2024/day15/day15_test.go new file mode 100755 index 0000000..e13b242 --- /dev/null +++ b/2024/day15/day15_test.go @@ -0,0 +1,44 @@ +package day15 + +import ( + "os" + "testing" +) + +func TestDay15(t *testing.T) { + filename := "test.txt" + if _, err := os.Stat(filename); os.IsNotExist(err) { + t.Fatalf("test file does not exist: %v", filename) + } + + part1, part2 := Run(filename) + + expectedPart1 := 10092 + if part1 != expectedPart1 { + t.Fatalf("unexpected part1:\nwant:\t%d\ngot:\t%d", expectedPart1, part1) + } + + expectedPart2 := 9021 + if part2 != expectedPart2 { + t.Fatalf("unexpected part2:\nwant:\t%d\ngot:\t%d", expectedPart2, part2) + } +} + +func TestDay15Solutions(t *testing.T) { + filename := "input.txt" + if _, err := os.Stat(filename); os.IsNotExist(err) { + t.Fatalf("test file does not exist: %v", filename) + } + + part1, part2 := Run(filename) + + expectedPart1 := 1497888 + if part1 != expectedPart1 { + t.Fatalf("unexpected part1:\nwant:\t%d\ngot:\t%d", expectedPart1, part1) + } + + expectedPart2 := 1522420 + if part2 != expectedPart2 { + t.Fatalf("unexpected part2:\nwant:\t%d\ngot:\t%d", expectedPart2, part2) + } +} diff --git a/2024/day15/input.txt b/2024/day15/input.txt new file mode 100755 index 0000000..1cfef81 --- /dev/null +++ b/2024/day15/input.txt @@ -0,0 +1,71 @@ +################################################## +#O........OO.##O.OO......O.O.OO#O....O.......#...# +#...#O...O.O.O....OO..O..#.....O.....O..O.O.OOO..# +##..O...O.OO.O.#O.......O...OO........OO#.......## +#OO........OOO.....#..O...OO....O.OO#..O.OOO.....# +#O.O..OO..O#...##O..#..##.O#..O......O.O.O...OO.O# +#.....O#.........O#O..#...#.#.O...OOO.O#...O.....# +#OO..O.........OO.OO..#O......OO.O.OO..O.O#.O..O.# +#..#......O......O..O..O#O....O......O....#O.#.#.# +#O...#..O.......O.O...#.O.O.OOO.#..O..OO...#O#...# +#OOO..#..#OO....O.O...O.O..........OOO.O.#O......# +#O..O...#....OO.OO.....#.....#...O...OO....O...O.# +#...O....O#..#.O....O.......O........O....#....OO# +##O......O.......O...O##.O.....#O.O..O..........O# +#.O#OO.OO....O..O...O...O.O.O..O..O.....#...O...O# +#...#..O...#....O...O##..O..#.........O.....OO...# +#.O..O.....O...#..O#..OO#...O.O.....O.O#.........# +#.#...#..O.OO..O#.......O#.......#...OO..O...O...# +#.#...OO.#O..#.......##.......##OO..O.O..O..OO...# +#....#...OO.OO....#O.....#..OO..O..O.O.O.#..O....# +#....OO....#.#.O.O#........O...O.#..#OO.OO#OO.O.O# +##O....O.O.#O..O....##......O..OO.O.....O...O#.#.# +#..O..#..O....OO........O.#O..O.O.O#OO..#.OO..O..# +#.......OO..#O#.OO..#.#........O#O...O..OOO..O..O# +##O..O#.O.##O...O##OO#.#@...#..#O...O...##.....OO# +#...O....O.O...#OO..OO##...O#OO...O...O...#.....O# +#.O.OO.....#..#OO.....OO....O..OO#.OO...O.#.O....# +#..O..OO#O.......OO...O#.OO...OO.#.......#....O.O# +#......#OO.O.....O.....O.....#..O....#.#OO...#...# +#.#OOOO.O.O......O....O#..O...O.#...OOO...O.OOO..# +#.#.O..OO...O##.O.O..O...#.#.O..#..OO#......#OO..# +#....O.#.#..O..#OO...#..###.O....OO...O..OO.O.O..# +#.O.O........#.OO.#O.O...#O..O...O.OO#...O.......# +#OO.O.....O.....#...O..O....O.OO.O.O....O..OO....# +#O..OO...#O.O#.OO.O........O.#OO....OO.......#.O.# +#...OO...OO.OO......O.O.O...OO..O.O...O.O......O.# +#.O....##.O....#O.#O....O..#O......#O.O.O.##O#...# +#..O.....OOO........#...O...O.....O.O...O.OO.....# +#......OOOO.....O..OO...O#.O.O.O..#.OO..OOOO...OO# +#OOO.O.....OOO...O.O.O...OO....O.#.#.#..O.....#.## +#.#O.....O....#O.OOO..O..#..OOO.....O.....O..#..O# +#......O........O...O....O...#....#..O...O.O...O.# +#OO...#.O#O.O....O#.#..O#..O...O......O.O....O...# +#O....#OO#.....OO.OO.....O.......OO...#..OO.O#...# +#...O#.OO...OO.O..O..OOO.OO.....O.O.....O.O..#.OO# +#O.O..O..O##..........O#O..O.#.....#O...O.##.#O..# +#O.O................O.O.....#.OO.O##....#O.O...O.# +#.OO#O.O..O.#..O#..O...O#.............#..O....OO.# +#...OO....OOOOOOOO#.....OOO.O............O..O..O.# +################################################## + +>>^>^v^><<<^<^><^v^^vv>^v^v>^<<>>>>>^^v^>v^>><^>>v>>^<^>>>>>^v<>^v^<<<>>><>>^v^^^^^>^<^<>v<>v>>v>>v>>>^>v>>v>v^v><<>>vvv>>^>^^v^><>^<^<^>>v>v^<^><^>>vv^<>>v<^^^^vvv<^^<>>>>>>^vv^v<>v^><>>v^<^^<<><<>>>v>^>^<>^><<^<^v<><<^<>vvv<<><>vvv>>^^^^vv<<vv<<^v>v^>>>>^<<<v^v^v<>><^>v<>^^>^^^<<<>v>^>^<^^>v>>^<^>>>^<^>^v^^><<<^^>>>^>>^<^>^<<>>vv<>v><>v>v><^^<<^vv^>><vv>><>^>^^^v<<^>>>v<^^><<>>v>v^>vv^>><>>^v><^v<<><^<<>>>vvv<^^<>^v<>>><<^vv^>>^><^>>^vvv^^^^^vvv^>^^vv>^><^v<>>vv><<<<^v<^^>v<>>^>v^<>v^<>^<^>><^^<^^<^^<<<><<>>v^^<^v^<<>vvv>^^^>v<^>>>v>^>v<>v>^^><>vv>vv<^v<>vvv<<<>^v^vv<<>>v><^^<^vv>>^<vv>>^><>>><<>^<>>><>><>>^<>^^v^<<><^<^^v^^<<>>^>^^vv>>^<^>^<<^v>>^><^>>vv^^v>v<< +>vv>^^>>v>^>>v<<<^v>^><<>v^><>^<<>^>^<<^<^>>v>^^vvv>v<<>>v<<^^^^>^<^<>>^><>>v^^vvv<^^<<>^^v>^^>^v<^<^^^v<>^^vv>vv^v^^v^vvvvv<<>^<^^<^^>^<>>>>><<><<>>^^<>>>>^<<^<^vvvv>v^>^^v>>^^<>vv>>^^<^<<>^v^^^>^>v^v^>^^>>>v^><>^>v^vv^^>^<^^>^<v><>^v^<<<>>v^^<^^><>>^^>vv<><<><>v>v^^<<^^vv^vv^>><<>>v^v>>>>^v^^>>^<^^v>>^><><>>^>vv<^>v^^^v<^v>>vvv<>>^vv<<>>^^vvv^^<>^>^<>>^v<><><<<<>>>^><>>>v^<>vv><<>v>v<^^^>^v>^>>v>^>^v<^vv^>>^>>>^<>>v<><<>>><<><^>v>v>^vv>^<<<^><^^v>v^>vv<<^^^^>^><<>^^>>>v<>v^^>vv^v<>v^><<<>^^^>v><^>>v>^>>v>vvv>>>v^v>^>>^^v<<<><^<^>>v<>^^v>><>><<^^^^^>^v^<<>vvvv^><><^v^vv>v^^v<^<<^v><>^<^^>v^>^<<^v^^v<><<^^v^><<><>v<><>vv><^>>^^<^<>><<>><>>^<vvv><^^vv^vvv>>><>^^>>v>><><<><><^^^<>>>>>vv^^v>^<>v^>^>vv^>>>^>> +^v><<^><v^^^>^>>><^^^>v^^v>^v^^<>^^^>>^>><<><vv^^v^><><>vv><<<^<>vv<<^v^>vvv^v<>>^v>^^>vv^<>v^<><^^<>^^>v>>^vvv<>><<^>^>vv<>>^<v<>>>v>vv^>^>vv>v<>^v<><^v>v<<^>^>vv>^<<>^^<<>^vv<>vv<>>v^^><><^<^v>>>v^><^<^>^>>><^>>^>^^v>vvv^<>><>v>v<><>v^>>>>vv>^^^v>v^v<>^<<<^v<<<>>><^v<^v>v<^<>><>^^<<>^^>v>vv^<><><<^<>>>vv^^>v>v^^^<^>^^<>v>v>>^><<^><<>>><<^^<>v^<>^>v<<<<v^v^^<<^vvv^v>^v^^^>v>vv<^>><<>>>^vv>vv>^v><<<<^<^<>>vv^>vv^v>v^v>v>^v><<^v><>^>vvv^v<^vv>v>v^v^^><>v^^vv<^<>^v^<<^vvvv<^>^^^^v^^^^>^^v<>^>^<>^^<<^<^<^vv><^>^^vvv^>><>>^v>v^^^v><^^^<>>vvv<>><<<<<>^^^><><<><^^>v><^>>^<^v<^^v<><^>>v^<>^<<^v><<^>^v<>vvv<>v>>^v<>>>v<>vv>>v^<>^v><><^^^^vvv>>^<^v^^<^^><>><^>^v<^><<>v>v>>vv^vvvv^>^v^>>^<>><<<^^<<v^>>v<^>^v^^v>^v>^<>vv^^vvv^>>v>>v>vv^<>v<>>>v>>>>^< +<><>^v^v>>^v><<>^v<^v<<^<>v<>v^>>>>^v>>>^^^v>^>^^>^<<^^>v>v>>^^<>>>v<v>>><^^^>vvv<v^^v^><<>^v>^^>><>v<>^v^>>^v^v^<<^><<<>^v<>>^>>^<^vv>>>v^>vvv<<v^>v^v^^>><>^^<^^<>v<^v^^^<>vv^<<^^<<v>v^<>^^^^<^v<^>><v<<<<^^^>^^v>v^v^^>><^^^>>>^^<vvv^><^v^^>>vv^v^>^^vv<><>><<<><>^>>>^^>v^>v>>>^><>^v<>^>>>>>^v<^^v><^v<><^<>^<>^>>>>^>>v>>^^v><>v^<vvv^>^v<^<>^v>^^>>vv>^^^<><^>><^<<>^>^^><^>>>v<^>^^^v<>><^v<^<<<^>v^^v<<<^<^>^v^v>v<>v^v>^<^^v<><^<<>^<v>v^v<>>>>v<^vv>^><^^>v^^^<^^<<^<>>v<^>^><<>^^^^vv>v>vv^>v>>vv>vv^^^<^^vv>><>^^>>vv<^>^^^>><><<<>>v><^^v^v^>^vvv<<>>^v^^^>v^>v>v<<><<^>>vv>><<>^v>^^v^v<<>v^<^^>v<^<>^>v^^v>>v^<>><^>^vv>>><<><>><><<^>>>><<^^> +v<<^<>>^^v^^^<<<^>><<>>>>v^<>^^^^<>><^^>^>>>v<>>>vv^>v>>>^<^vvv^^v<v^>^v<><^>^>^<>^^<<^>v>><<>>v^v>vvvv^vvv>^^>^^v^>v<>^<>>>vv<<v<^<^><^<^^>^>>^>vv<<^vv>>>^v<^^vvvv^>>>v^^vv<>v>>>>v^^><<><^<>^v^>^^>^^<<^v^v>>vv>vvv>v<^>^^<<><<<<^>^>^><>^>vv>>^v^^<<<^v>>><<<^v^<^^>v^><>v<^<<<<>^^v>^vv><<<^v<<^>^v><>v^^v<^v<<^<^<<>^^^>v<^<^>>^^^v>vv^><<>^v^vvv><^>^v<>vv^^^^>vv<>^^^^v>^<^<<^^>v>v>^^><><>v^^>>>>vv^^v^^^>^>v>><>>>>^v<>^vv>v<^>^^^>^>v>^^^^v<>v^^<^^^v^<>><>v>^vv<><<><^<<<^>><><><^^^<^^><^<^v>>vv>vv<>>><>^>^>^^v^v<^vvv^<>><>^^<>^>vvv^<<>>>^>v>>>>>v><>^><<^^v<<^vvv>v^<>>><^<v<^v^>v>^^v<^^^<><>v^<>^<<^^<^v^v>^^^v<^vv>vv>^v<<<^v<^<^<>v>^v<vvv^^v>>>v^^v^<<>>^^<<>v>^^vvv><^<> +>v^v<<^^>^<v^v<<<<<^v<<^v<>v>vv^>>><^vv^v>vv^<>v<^v>v>^<>^><^><>^>>>^v^^vv^v^<<^><^^v><^^>^^v>^<^><^^<<<<>>v^^^^>^>>^^v>^v>>vv^v^<>v>v><<^>^<^v^^vv>>>><>vvv^>v^v>^^v>>^v>^^<^>v<<^>v>>^>><>^vv>^v^v<^v>^>v<>^<><>^v^>^^<<<^>^^v<>^^<<>>v<^v>>><^vv<><<^v>v^<^v^<<>>^v><^v^<>><^vv>>v^^>^>^<>>v^<<^>v<^>^<^>^>>^^v>^vv>^>><^>v<>v^v<>^^^v^<^><<>^^<^<^>v<^vv^><>vv^^<>>>>^v>^>^^vv<<<^<>>>v>^^^v>>>vv^>><>><<<<^^^<>^v<<>><<>v<<^v>vv>>><^v>>><<v^vv>><>^>^^>v^<^^vvvvvvv>v>v^v>v^<><>v>v<<<>>v^vvv^>v<^>><>vv^^v^<^<<>^<>>^vv^<^v^>^^>^>>^v>v^^<<<>v>^<^v^^<v^v^>v^><>v>v<^vv<<^v^>^v^^v^vv<>^>>>v^>vv^v<^^v>>^^v<^^<>><>^>>^^vv>v<>>v^^vv>vv<^>v>^^>>>v<^v^v^v<<><<<<^>>>^^>^<<^vvv^<>vvv>< +<^>>^><^v<>^^>v<^<>v^>^>>>v><^v>v^>vv^>^^<^v^>v^^>v<>><^^^v^<>^v>>^<^vvv<<>^v>v<<^<><^<<<>>^v<>^><<>vv^v<^>v>>^<>>>>>^<<<>^v^^<^vv^^vv>^>^^^v^vv<<^^<<><<^>>>v>^<>^>^<>v<^<>v^>v^vv^>^v<<><>^v<<>v^><<^>>^^^v^>vv^<<>^<^>^>>^^<>v>^<^<^vv<>vv>v>v^<^^><^v<^^<><v<^v>^<>>^^v^>^^v^<<^<<><>v^^v^<>>v>^<<<^vv>^v^>v><>^vvv^v>v>>v><^<><>^v^<^vv>>v<^^v^><^^v<^vv<>><^>>>>^v<v^v<<^v^>>><>vv^v^^^^v<^^<<>v><>>vv>vv^<^v>v^<^^<>^^>^v<>^vvv>v>vv><^<v<^v<>vv>><^v<>>v<<^^^v>v^>^<<^<<<<vv>v<<<<<^>v>^<>>>v<><<>v>>vv>^^^v>>>v<<^vv>^v>vv>v>>v^v<<>^v^^<v^^<<<^v<<<<^^^vv>>>>>v<^v<>^v^<^^^^>^vv^>><>^^<<^v>>>>vv<^^v><>^<<<>^^^v>v>^^>vv>^>^>>v<<<^v^v^vv<<>^<<>v>vvv>vv<^^v>vv<^vv<>vvv^vv^^>>^>>^v>^v>>v<><>v^<<^^^v<<<>v>v><<^v>v^^vv>v>^^<>vvvv<>>^v +^vv<^<>vv^<>>>><v^^v^v>^<><>^^v><^^>^v<><^v>vv^>>><<>v>^^v>>>>^^<<>^<^^>v<<^^^vv<<><^^<<^^<^>><^<>v<>v<>>v<>v^^<>v>^^vv^^<>^>><^v>^^<^<^^>>>^vv^<>^vvv^v>^^^v^>^>><^<>^^>>^>^<>^>>v>^<>^^v>>v><>>^^^>v^><>>vv<<^>><<^v>>vv^v<>^^v<>v>^v^<<<<^^>>v><>>>^<^v>vvvv<>^v>^<^^<vvvv>^vv^<^>v>v<<<>v>v^<^v^^v<^^^<<<vv>>>v<^^<><^>>^^>v^v><<<>>>vv<<>><^>^^<^^v<^>>>vv>v^^v^v>v>>><>vv>^vv<^^v<<><>^v><><<^>v>v>>vv^>>vv^>v^^v>>>^><^>>>>>>^^>^>^>v^vv>>><<^<>^^>>v<^<><^<^<><><<>>^v><<^<<^>>v<^<^^v^^>^<^^v^<>^v<^v<><<^^^^^^^<>v^><<^^v>v>v<>^>>^>>^^^<>>^^>v^v^<^<^<>^v^>vv>v^><>>v<>^<<>^^^v<^v^^<^>><<>^>v<^>v>vv>^<^<>^v>vv^^<<^>v^<>^v<>^^^>v<<<<>>>v>>v^<^vv^^^^^v>^^>>v><^>^^>^<^^>><^^ +^^vv>>v>v<<<>^<>^>>>^^>>vvvvv<v>><<><^^>^^><<>v^<^<vv>>^v>^^^>^><<<^<<<^>^>><^<^>vvv^>>^^>>^>^v>vv>^>^^>^^v^^^><^vv^vvv<>vv>vv^<><>>^^v^^^vvv>v^<<^<>v^^<><<^v><><^^>^<>>^^vv<^<^v<>^>^>>><^^>^vvvv^<^^^v^<^^^^v>>>>v^v>>v>v>v<<<<>^vvv<>^^v>^v>>v><^>>^v>><><><<^>^^vv<>^>^v>v^v>v>^^^vv>>>v><<^<>><<^<<^v<^v>>v<v<^<^<^<>^<^v<^v^v^<^>>>><^<>v<>v>>v<>vv><><^>>>v><^<v<>v>>>v<>><<>v>v^<^<^>>^<>>v>^v><>vv<><>^<><^vv^>>^v<>^v^v^>v><<<>>^>v^><>>^vv>^^^^<<<<^^>v^>>>^>>v>^v<^v>v><^v^>vv<^vv><^^<>>>>^v<>^v^>^>^^^^>^>>^v^^<>^v^<<^>>>vvvv>^><<>^^>v>v^<^>^^><>>v><<<<^^vv^v^<<^<<><>v^^>>>^>><^^v^^<>v>^<<>v^<^^^<<^v^><>v>^^vv^v><^^>^v^>v<^v<^<>^<^<<^^>vv><^^><^v><^v^<>^vv^vvv^v>v<><><^<<^v><<^v>^^^^^>><<>^><><<^>v>>>v< +>>v^>^^^vvv>^^<<^^>>v^<^v^><^><v<>>^>^^>^>><^^>v<<<><>><<>><^^><>^>v>v^v<<^<^^><^><^<>v><^<^>vv>vvv>v^vv><vv^><<^<^<<<^^v^<><^vv>v^<>^^<^<<>v^^><^>^>vv>>^<><^<><<>>>v^>^>^^<>^>v^<^<^vvvv>^<<>v<>><^<^^<<^><^^v<<^^^<>^<^>v<>^v^>^>><<^^v>>>v>>v^vv<^>^^^^<<>vv><<<^v^<<^>^^vvvv>><>>v<>>^^^>><>v<^<^>>>v>>>>v^><^<<><v^>v>v<>^><^v^>v>><<vv>^^<v^>v<^vvv<<>>^vv^v^><>>>><>^vvv^^v>^<^^<<<><>^<v><^><^v^v^^v<>><<>^^>v^^v<>v^^><<^<^^v>>vv^>v>vv^v^<>><<><>vv^<<>^>v>>>>^>>vvv<<>^>^>><>v^^vv>^^>^vv>v^^<><<>><>v^>v>vv<><^<^v>^<^vv><^<^^>vvvv>v<<^v>vvv^>v>v^v^vv^^<^>^>><<^v<^v^^>^><<>^v><^>v>>><^vv^^v^^v<^>v<^<<^<^<><^>^<<^^^v<^v^vv><><^<>><>^<>v^v>^><<<<^>>v>>v +>>v<<>>>^^^>v^vv<^^v^<>^vv>vv><>vv>vv^^v<>^vv<>>^^v<<^<>v^^>v<>v>v<^v^<>v><^<<<^<<v<^><>vvv^>^^^<^v^^<v>v^<><<^v<<<<>><>^v>^^v^^<<^v<^<<<><^>^^>>>^^><<<>^^v>^^>>^<>v>vvvv><><^>^>^^<>>>>>^>v>^v^<>v<>>v>^v<^^<v<^<<^vvv^v^vvv<<<^<>^<><<^<><<>^<^<>vv^><>^^^><^^v^>v<<>v>^v<^v^<^^<>^vvv>v<<^<^>^v^v>><>>^>v^<vv>>>>v^^<>vv>v^>^^vv<>><^^^v<^^^v^>v>>^vv<<>v>vvv>v<>>vv>^>vvv^v<^^^^<>v>>v>><<>v<>^>v<<^<><^>>^^^^^^>>^^v<>^^>^v>v^>v^<>^<<>><vv<^^v<<<^^v<^v><<<<><^^vv>vv><>>vv^v<^v^^v<^v><^^^v>v><>vv<>^>^^>^<^>vvv>v<>v^><>>>^^><>^<><^^v^^<<^v>v<><>^^<>>v^>^>>vvv<>^<^^^vv<^><^^v<<>>^<>^v>>^>^><>^<^^v>>v><^^><<^vv^v^^^v<vvvvv^v<<^<<^^v^^v>vvvv<^^<<<^^^<^v>>v>^^vvv^v<^^>v<>>>>v^><^vv^^vvv>><^<^<<^^<>><<><^^^>vv><^><^<>v^><>>>v< +^>>v>v>>>>v>^v><<>>>v><><>vv<^v^^>>v^v>>vvvv<^vv^^>vv^<>v<>v>^v>>v<>^>^<^^^^v^^^><>^>^v<>>>vvv^^<<>vv^><^v^^><^v^^<<^^^^v^^<>>v>>>v^v^v><>>v>>>^><^v<<>v><>>>>>^<^v^vv<>>^v>>><><^^>^<>vv>><<>>><>><vv^v^v^v<>>>^>^>^vv>>^v<<><<>vv<>vvv>^<^>v>^vv>>^v>v^^vvvv<^vv>^^<>^^>^^>v<^>^>>^^^><^vv>v>^>^^<>^v><<^<>vv^vvv^v^vv^^<<^vvv^^^>vv><>^<<>^<^>>v><^>v>>^^<^^<^<<>^v>><><<^<<>v<><^<^>>>vvvvv^v<>v><<^^>>v^^vvvv^^v<<>^^>v><<^>v>v<<<>vv<>vv><<v^^<<<^>vv^>^^><<^^v><><^v>^>^^>^><^^>>^<^<>^^^<<<>><>>v^v>v>>>><^>^<>>>^v^<<<>^^<<^v^^^>^<<^>v><^>vv>^<>><<<>vvv<<^^>vvv^^vv<>^<^^>vv>>^<<<<>v^v<^<^>><><<>v^><>>v^<>^v><>^v<>v>>>v^v>>v><<^>><<<>>v>^>vv>^<^<>v<^^>><>>><<>^>v>v^<^vv^><^^v<v<^^^>v>vvv>^vvv<>>>>><^vv<^ +vvvv<v^<>>>^>>v^vvv<^>><<>^<>><<^^vv^^v>>vv^>v<>>^><<^^^^<<>v><<<^v^v^<<^vv^^^^<<>v^>v<^>^>>^<>^<^<^vv^^^<^<><^><>v^<<<<<<^^>v^v>^<<>v>vv<^^v<<^v<<>^>^><^^<^^^<><><>>vv>v^v><<^v^v<^v>>>>^<><<<^v>>^v>>v>>^^<^>vv<^<<<>vvvv^<><<^^v<<<^v^^v^^<^><^>^>vv^^>vv^vv^^>^^>v^^<^>^^>^v<>v^>v<>^^v<>>^^^v>>>v<<><^v^>v<<^<<<<<>vv<<^><^<<^^^^>>^>>v><^^v^^^>v^>vv^v>^>^>vv<>>vvv>>v<^vv^^v^vv>v<<^v^>vv^v><>>^<^<^>^<>^vv<>^>v<<>^^^^^^><^>><<^<^^v<>><^<<^vv^^>>>^><>>vv^vv^^>^vvv<>>><>vv^v^^vvv>v>><^>v^>^v^<<^^^^v^^^<><^^^^v>>>^<>v>>>^>^>>^^v<^^v^<^^^^><<^^>^>v>^^>^v<^>><><>^v>v>>^^<<>^^<^<^>v>^v^<>^>^^><>v^><><>^>>>vv<^>v^>^^>^<>>^>vv^><<^><>^vv>><^<>>^^vvv<>>vv^^<<^><>^<>^^>>>^^v^^v^^><>^v<>v^v^<^<>>^>v^v><><<<^vvv><><>>^>vv^^^^^v<^^>><^^><^v^vv^v<^^>v>^>>^^>v>>v<^>v><>><>v<^^<><><^>vv<^>v>v<<>v +<^v<^v>^<<>>^^^>^<>^^><^v><>><<^vv^><^>>^<><<<>><<>^v^^<<><><>>vvv^>v>^>v<<<^v>v<<>^^<>v>><>>v^>^v<^^>^^v>vv^vvv><<<>^^<^v<^v^v^^<<<>^v>><^^vv>>v<^>^vvvv^^^>^<<>vv>^<>>>^<^>^>^vv^><><^>^><^>^v><>v^vvv^>^v^vv^>>v<<<>vv>v><v^<<^<<^>v>^>>^vvv>vv^<<^<^><>>^v^v>v>vv<<^^>>^<^>^<<<>v^><<^^<>v<<<<^<^v^^^^>>vvv>v<^>>vv<><^^<>vvv>v>v>>>>^<^vv>^>>^^^^vv>>>^>^<<<>^<<^^^^v>^^>vv>^vv<^<>>>^v>^<^<^>^<>v^vvv<^<<^vv^^>><<^^v<^^<<>^>v>v><<^v><>^>^v<>^<^^v>vv><>v>>^>^vv><^>^<<>>>^>^>>^>>v^<^vv<^^><>^>>^vv^>v<<^>>><<>>vv^v><>vvv<>^v^^^>^^^>>^<><^^>v<^>v>v^^>>>>><^^v<^>>>v^><<><<^v>^><^<<<^<><<<>>^v>^><<<>^>^^^>>^<^^<<^^<^>><<^^v^>^^>v<^vv><^<^^^<^^><vv^><^<<>v<<^v<^v>^^^vv +v^<^v<>v^<^>vvv>^^^v^^v<^><^>><><<>^v>v<<>vv>vvvv^<<^^^vv>>vv<^^^v>^^>^><>^^vv>vvv^v>>v>>><^^>^^<<^><^<>^>v^>>^<><^>v^^^v^vv>v>^><><<^^>>^>>>^^vvv^^^^^v^^v>^>>>>>^><<^><>>^>v^><^<>vv<vv^>>v<<v^<>v><<^^v><^<^>v<><<^^^v<>^^><>v^^^>^^<<^<^v^v>^^>>^v><>>v^<>vv^vv>v>^^<^>^>>><<^><>>v<^vv>v<<>vvv<>^>^>>><><<><>vvv<><>v^^v>^<>^><^>>>v^>^>v>v<^v^vv^>v^<<>^v><<^v>v>><>^>>>vv>>vvv>>^v>v^>><^<<<<^^<>>>^<><<<^<^v^^<^^^v^v^>v<<<^<>^v>v<^^^v>><<>>^^>^<<>>^<><<^>>^^^><^><<<^<^v<>>^v<>>^>>^>^^v^vv^v^>^><^>^vvv^<<^>^>vv>v>><<^>^^vv>^>vv>v><>^<<^v^><<^>v>>v^v>><^v^v^^<<<^^v^>^><<>^vvvv^v^^v<^<><>vvv>^v>><^><>^v<>>v>v^>^v^vv>v<>^^^^v^>vv><<^<^^><<>>>v^><>^v<><<^^vvv>^^<>><^v^>vvv^^<^>^>><<^>vvv<>v><^v><v>> +^^<<<>^<><^^^>v<^vv^^><^vv<<^^^><><>^^^v>^v>^^^>vvv^><><>^^>^>><<<>v^>v>^v^^^v^v<>>>>><>>^>>><^v^v^<v<^<>^v^v^^>>v^<>v^^^v^^<^v><>>^^><<^>>^<^vv^^v^>><^^v<>^v^^<<^^>v<>>v<<>vv<^^^v<>>^v^v><>^>><^^vv>^vvv^vv^>v^>^v<<>v^<>vvv^^^v>^v^vv>>^^^vvvv<^<^<>^<^^v><>^^v><>^v<>v^v<>>v<><^^^^>^<<>><^^>vv^<<^>v><>>^<<^<<^>vv>^<^^<v<>v^><^>vvv>>^v>v<^<>v^vv>vv<>vv>v^>>>vvv<^<^^^>>v^v^^v^^^>>^><^v^^><>>v^^^^v>><>v><<<>vv<<>>><>^vv>^^<>^>v^^>v^^vvv^<<^vv<>v^<>v>>v>v<^^>^v>^vv<>v>><^^<^^>>v>>>v<<<>>>v>>>^>>vv>^v^^>v<<<^>v^>^>v<>>>^>>^vvv>v^vv><^^v^^^^<>^>^>>^>vv<<^^>^v>>^<>v>^v^^^v<<<^<<^^>vv>^<>^^^<^<<>^^><>>><<>vvvv>vvvv>^<><<<v^<><^v^<^>>v>^<^<^v<^<^>v<^><^^^^^v^>^^><>><><>v><<^v< +>>><>^^<^vv><v^<>^v^^v<<>v^v><<<^^<<^<^>><v>^><>^^v^^v^>v>v^^^><^v>>v>vv<>>^^<<^><^^v>^vv>v^>v^v><^vv<^>><vvv>><<>>^<^>^^^^v><><><>^>vv^v>vvv<>^<^>^<<^^vv^^vv><^^<^v>^vv^v><^^><vv><<^<<>v^>>v>^vvv><^>><>^>>vv^v>vv^<>v<^<<<><><><^vvvv<>><><>>>><<>vvv>>^^>^<^>^<^>vv<^v>v^<^v>>v^^>>>vv>v^^>><>>v>vv<<<^<<<>v^<>>vv>^<<>^>^^>>^v>^><>^<^^vv<<^^<><^<<^^^^^v>^^^vv^v<>><<<>>v>>vv>>v^<^^vv^^>>vv^<v<><^v^>^><>>^>>^vv^<<><^>^>v>>^v^><>v<^^v<^><<^^><^^><<>>v>>>><<^v^^^vv>^>v><^<^>>><<<>v<^>v<^<<<>^^><^v^^>^^<^>><vv>^>>vv>^<^vv>v<^>>>>^^^>vv^^<^vvv^>^>>^><>>v<>vv>^^v><^<^v<<>><<<^vv><^^vv^>v<^v>^<><^>^><><^<>vv>vv^^<>>>v<v^^>vvv>vvvv^<<>>v><<>v><><<>^^<<>><>^^>v<>><^^vvv<^<v^<<^vvv^vv^v^>>>v^v^v<<^v^>^v^vv^<>^<><>^<<^><>^^^^><>>vv<^v><^^<^vv>v^^>vv^>^>^>>v>^<<^^<<^>>^>v>v<<>^^^v^^>^^>vvv^><><>^><>>^^<>>><^^>><^>v^<^>>v^^^>><^>^<^^v<<^^v>vv>^^^>><>v<<>v><>^>vv>>>v<^><>v>v>^v<^><^>v>^^vv^^>>v<><>>>>^v^^v>^><>vv<^>^^v>>v^<<^^v^>^^v^v>><<>v<^^^^><<<>^<>>v>vv^^^>^v^v^>><>>v>^v>vvv>^>v<<^^>v><<^^>v>^<^v>^><><><>>>^>>>>v^^^^v>vvv^^v^>v>><>^v<^^<<><^>v<><>vvv>v<>>vv<^vv>vv^^>>^<^<<>vv<<>^^vvvv^<<<>^^^<^^<<<>v^vvvvv<>v^><^^v^<<v>vv>>v^>^^v^v^v^vv^<>^>>vv>^>v^^^>v^<<><<^vvv>^v>>>^v^>>>vv^vv><^^>v>>^>><^<>^><^>><^v<^<<<^^>v>v>vv<^^<^v>vv>>>vv^<>^vv^<<^v^>^>><<<^><><>>v>>>v>^^^^vv>vv^>>v<^>>>>v<^<^^^vv>v>>>^^^<>>v^v^<<>><>>^^>>^<<><^>^<^^<><<^v>^>>^>>^>>^^^>><v^<>>vv>vv^<>^^ +^<><<<><>^vv<^^>^>^^^^^<>>v^<>v^<<^>>^><^><>^^<^<^^v^>v<^v<><^<^><<^<<><<>v^v^v><>>>v><>^><>>vv>v^v<>>^<><^<<<<^^>^^<<^v>><^v^^^<>^^>^>^^><<^>^^^^<^<^v^>^v^v<>^>v^vv>^v<^<><><<<>>^^^v<^v^<>v^^>^v<^^^v>vv^<>vvv<^<<^>^<>^^<>^^<>v<>vv^>vv<<<>><<<<^>>>v>v>vv^^>>v^>>>><<^>>vv^><>^<<^^^v<<^v^^<^<^v>^^>>v^vv^<^>>>^>v><>v<^>>v<^>v>v>>^^<^>^v^>v^v>vv^^<^vv<><^><<>^<^v^<>>^>v>^^>>>^^><>vvv<^vv^v>v^<<><<><^^<^>^^><<<^v<^^vv^^>>v^v>^^<<^^<^>><^^<<^v^^>^^^^<^v>v<><<v^^^<<^>v>v>v<>v^v>vv^<>v^<>v>v>^<>>vv><<^^<^^vvv>>>>>^>v>^v<>^>>>>v^v<^>v>v^>>><<^><<>^<^<<^>><>>>^v<<>v^^>v^^vv^>^<^^v><<<^^vv<^>>^><<^vv<>>vv^<>v^><>vv>^<>>v>^><<>v<^^<^v>v>>^^^<^>><>^<^v^><<^v<^^v^vv>>>v><^>v><>v^^<<<>^^>>^v^^<^v>>>^vvv^> +<<^>^<<>^^><>^v>vv<>vv^v^^>>^v^>v^<<^v^>v^>vv>v^<^<><^^v<>>>^<<<^v^vvv<<<^>vv^v><>>>v><^v>v<<>^^^v<^v>>v^v>^^vvv>>vv><^v>^<^v<>>><^<<>v^><<v>^v>^<<^vv^<^v<^^^^^vv^v<>>v^v<><^vv><^^^v<>>>^<<^>^v^<>v^vv^^<><<<><<^>><^><^vvv^^>>v>v>^<>>v^>v<>v<<<>vv<<>>>v><><><>^^^<>^<^^vv>v<>^^^v>v^^<^v^v<^>^v^^>>^^v>>^>>v^vv^v^><>^>>v^<^^><<<^<<<>>^>>^v>^v>v>^<>>>^v<<^^<^v^^><^>>v^><>>v<<<>>>v><<^^^<^><>v>^<^>>v<^^<^<>v><>vv^v><<^><^>>vvv^>>>vv>v<>^<>v>^>>v<>>v<<<vv^>>^>><^^^vv^>^>><<><^<><<<><<^><<>>><^<<>vvv^v><^^v><^>^>vv<>^^><><^>>^>>v^<>v^^^<>^>^><<^^<>>v<<^^>v^><^<<^><<^>^<<<><<>>^<<<><>^><<<^>v<^<<^vvv^>vv^v>vv^>^>vvv><^vv^^v<^>v>^^>v^^^^^v<<<<^^^>^^^>^^<^>^^<<^<<<>^>v><v<<^vv^v^<>^<^^><<^<>>^^vvv^<<^<<><<>v^>>>v^v<>>^>>>vvv<^v><^v>^v^><<^^v>v>^<<^>^v diff --git a/2024/day15/test.txt b/2024/day15/test.txt new file mode 100755 index 0000000..84cf1fb --- /dev/null +++ b/2024/day15/test.txt @@ -0,0 +1,21 @@ +########## +#..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^<<^