From 36ef1c49d0c8d1d55bc7f2bb8d688d4e61f42ba8 Mon Sep 17 00:00:00 2001 From: dobiadi Date: Sun, 15 Dec 2024 14:26:20 +0100 Subject: [PATCH] Day15 --- day15/c/day15 | Bin 0 -> 15664 bytes day15/c/day15.c | 142 ++++++++++++++++++++++ day15/c/day15_part2 | Bin 0 -> 15752 bytes day15/c/day15_part2.c | 265 ++++++++++++++++++++++++++++++++++++++++++ day15/input.txt | 71 +++++++++++ day15/sample.txt | 21 ++++ day15/sample2.txt | 10 ++ day15/sample3.txt | 9 ++ 8 files changed, 518 insertions(+) create mode 100755 day15/c/day15 create mode 100644 day15/c/day15.c create mode 100755 day15/c/day15_part2 create mode 100644 day15/c/day15_part2.c create mode 100644 day15/input.txt create mode 100644 day15/sample.txt create mode 100644 day15/sample2.txt create mode 100644 day15/sample3.txt diff --git a/day15/c/day15 b/day15/c/day15 new file mode 100755 index 0000000000000000000000000000000000000000..a5d22619e49e531badfc5532b842f8e395eccae1 GIT binary patch literal 15664 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 literal 0 HcmV?d00001 diff --git a/day15/c/day15.c b/day15/c/day15.c new file mode 100644 index 0000000..4b64b13 --- /dev/null +++ b/day15/c/day15.c @@ -0,0 +1,142 @@ +#include +#include + +#define MAX_DIMENSION 1024 +#define MAX_MOVES 1024*1024 + +typedef enum tile { + EMPTY, + WALL, + BOX, + ROBOT +} tile_t; + +int try_move(tile_t **map, int rows, int columns, int x, int y, int dir[2]); + +int main() { + char c; + + tile_t **map = calloc(MAX_DIMENSION, sizeof(map[0])); + int rows = 0, columns, i = 0; + map[0] = calloc(MAX_DIMENSION, sizeof(map[0][0])); + + int reading_map = 1; + + int (*moves)[2] = calloc(MAX_MOVES, sizeof(moves[0])); + int move_count = 0; + + int robot_pos[2]; + + while ((c = getchar()) != EOF) { + if (reading_map) { + if (i == 0 && c == '\n') { + reading_map = 0; + continue; + } + + switch (c) { + case '.': + map[rows][i] = EMPTY; + break; + case '#': + map[rows][i] = WALL; + break; + case 'O': + map[rows][i] = BOX; + break; + case '@': + map[rows][i] = ROBOT; + robot_pos[0] = rows; + robot_pos[1] = i; + break; + } + + i++; + if (c != '\n') { + continue; + } + + columns = i - 1; + i = 0; + rows++; + map[rows] = calloc(MAX_DIMENSION, sizeof(map[0][0])); + } else { + switch(c) { + case '>': + moves[move_count][0] = 0; + moves[move_count][1] = 1; + move_count++; + break; + case '<': + moves[move_count][0] = 0; + moves[move_count][1] = -1; + move_count++; + break; + case 'v': + moves[move_count][0] = 1; + moves[move_count][1] = 0; + move_count++; + break; + case '^': + moves[move_count][0] = -1; + moves[move_count][1] = 0; + move_count++; + break; + } + } + } + + for (i = 0; i < move_count; i++) { + if (try_move(map, rows, columns, robot_pos[0], robot_pos[1], moves[i])) { + robot_pos[0] += moves[i][0]; + robot_pos[1] += moves[i][1]; + } + } + + int sum = 0; + for (i = 0; i < rows; i++) { + for (int j = 0; j < columns; j++) { + if (map[i][j] == BOX) { + sum += 100 * i + j; + } + } + } + + for (i = 0; i < rows + 1; i++) { + free(map[i]); + } + free(map); + free(moves); + + printf("%i\n", sum); +} + +int try_move(tile_t **map, int rows, int columns, int x, int y, int dir[2]) { + // Walls cannot move + if (map[x][y] == WALL) { + return 0; + } + + // Empty space can be filled + if (map[x][y] == EMPTY) { + return 1; + } + + // A box/robot can move if the next tile is movable + int next_x = x + dir[0]; + int next_y = y + dir[1]; + // Cannot move out of the map although it should not be possible to reach this + if (next_x < 0 || next_y < 0 || next_x >= rows || next_y >= columns) { + return 0; + } + + int success = try_move(map, rows, columns, next_x, next_y, dir); + + // If successfully moved, update map + if (success) { + map[next_x][next_y] = map[x][y]; + map[x][y] = EMPTY; + } + + return success; +} diff --git a/day15/c/day15_part2 b/day15/c/day15_part2 new file mode 100755 index 0000000000000000000000000000000000000000..05503d952ff36b943799c22aa29a198ccac24feb GIT binary patch literal 15752 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 Gll> +#include + +#define MAX_DIMENSION 1024 +#define MAX_MOVES 1024*1024 + +typedef enum tile { + EMPTY, + WALL, + BOX, + ROBOT +} tile_t; + +typedef struct object { + tile_t type; + int pos[2]; +} object_t; + +int can_move(object_t ***map, int rows, int columns, int x, int y, int dir[2]); +void move(object_t ***map, int rows, int columns, int x, int y, int dir[2]); + +int main() { + char c; + + object_t ***map = calloc(MAX_DIMENSION, sizeof(map[0])); + int rows = 0, columns, i = 0; + map[0] = calloc(MAX_DIMENSION, sizeof(object_t*)); + + int reading_map = 1; + + int (*moves)[2] = calloc(MAX_MOVES, sizeof(moves[0])); + int move_count = 0; + + int robot_pos[2]; + + while ((c = getchar()) != EOF) { + if (reading_map) { + if (i == 0 && c == '\n') { + reading_map = 0; + continue; + } + + switch (c) { + case '.': + { + object_t *obj = calloc(1, sizeof(obj[0])); + obj->type = EMPTY; + obj->pos[0] = rows; + obj->pos[1] = i; + map[rows][i] = obj; + object_t *obj2 = calloc(1, sizeof(obj2[0])); + obj2->type = EMPTY; + obj2->pos[0] = rows; + obj2->pos[1] = ++i; + map[rows][i] = obj2; + } + break; + case '#': + { + object_t *obj = calloc(1, sizeof(obj[0])); + obj->type = WALL; + obj->pos[0] = rows; + obj->pos[1] = i; + map[rows][i] = obj; + map[rows][++i] = obj; + } + break; + case 'O': + { + object_t *obj = calloc(1, sizeof(obj[0])); + obj->type = BOX; + obj->pos[0] = rows; + obj->pos[1] = i; + map[rows][i] = obj; + map[rows][++i] = obj; + } + break; + case '@': + { + object_t *obj = calloc(1, sizeof(obj[0])); + obj->type = ROBOT; + obj->pos[0] = rows; + obj->pos[1] = i; + map[rows][i] = obj; + robot_pos[0] = rows; + robot_pos[1] = i; + object_t *obj2 = calloc(1, sizeof(obj2[0])); + obj2->type = EMPTY; + obj2->pos[0] = rows; + obj2->pos[1] = ++i; + map[rows][i] = obj2; + } + break; + } + + i++; + if (c != '\n') { + continue; + } + + columns = i - 1; + i = 0; + rows++; + map[rows] = calloc(MAX_DIMENSION, sizeof(object_t*)); + } else { + switch(c) { + case '>': + moves[move_count][0] = 0; + moves[move_count][1] = 1; + move_count++; + break; + case '<': + moves[move_count][0] = 0; + moves[move_count][1] = -1; + move_count++; + break; + case 'v': + moves[move_count][0] = 1; + moves[move_count][1] = 0; + move_count++; + break; + case '^': + moves[move_count][0] = -1; + moves[move_count][1] = 0; + move_count++; + break; + } + } + } + + for (i = 0; i < move_count; i++) { + if (can_move(map, rows, columns, robot_pos[0], robot_pos[1], moves[i])) { + move(map, rows, columns, robot_pos[0], robot_pos[1], moves[i]); + robot_pos[0] += moves[i][0]; + robot_pos[1] += moves[i][1]; + } + } + + int sum = 0; + for (i = 0; i < rows; i++) { + for (int j = 0; j < columns; j++) { + if (map[i][j]->type == BOX && map[i][j]->pos[0] == i && map[i][j]->pos[1] == j) { + sum += 100 * i + j; + } + } + } + + for (i = 0; i < rows + 1; i++) { + free(map[i]); + } + free(map); + free(moves); + + printf("%i\n", sum); +} + +int can_move(object_t ***map, int rows, int columns, int x, int y, int dir[2]) { + // Walls cannot move + if (map[x][y]->type == WALL) { + return 0; + } + + // Empty space can be filled + if (map[x][y]->type == EMPTY) { + return 1; + } + + // A box/robot can move if the next tile is movable + int next_x = x + dir[0]; + int next_y = y + dir[1]; + // Cannot move out of the map although it should not be possible to reach this + if (next_x < 0 || next_y < 0 || next_x >= rows || next_y >= columns) { + return 0; + } + + object_t *next_object = map[next_x][next_y]; + + if (next_object->type == WALL) { + return 0; + } + + if (next_object->type == BOX) { + if (next_object->pos[0] != x) { + return can_move(map, rows, columns, next_object->pos[0], next_object->pos[1], dir) && can_move(map, rows, columns, next_object->pos[0], next_object->pos[1] + 1, dir); + } + + int can = 1; + if (map[x][y] != map[next_object->pos[0]][next_object->pos[1]]) { + can &= can_move(map, rows, columns, next_object->pos[0], next_object->pos[1], dir); + } + if (map[x][y] != map[next_object->pos[0]][next_object->pos[1] + 1]) { + can &= can_move(map, rows, columns, next_object->pos[0], next_object->pos[1] + 1, dir); + } + return can; + } + + return 1; +} + +void move(object_t ***map, int rows, int columns, int x, int y, int dir[2]) { + // Walls cannot move + if (map[x][y]->type == WALL) { + return; + } + + // Empty space can be filled + if (map[x][y]->type == EMPTY) { + free(map[x][y]); + return; + } + + if (map[x][y]->type == BOX) { + int current_positions[2][2]; + int next_positions[2][2]; + current_positions[0][0] = map[x][y]->pos[0]; + current_positions[0][1] = map[x][y]->pos[1]; + current_positions[1][0] = map[x][y]->pos[0]; + current_positions[1][1] = map[x][y]->pos[1] + 1; + next_positions[0][0] = current_positions[0][0] + dir[0]; + next_positions[0][1] = current_positions[0][1] + dir[1]; + next_positions[1][0] = current_positions[1][0] + dir[0]; + next_positions[1][1] = current_positions[1][1] + dir[1]; + if (map[x][y] != map[next_positions[0][0]][next_positions[0][1]]) { + move(map, rows, columns, next_positions[0][0], next_positions[0][1], dir); + } + if (map[x][y] != map[next_positions[1][0]][next_positions[1][1]]) { + move(map, rows, columns, next_positions[1][0], next_positions[1][1], dir); + } + // Move current + map[x][y]->pos[0] = next_positions[0][0]; + map[x][y]->pos[1] = next_positions[0][1]; + map[next_positions[0][0]][next_positions[0][1]] = map[x][y]; + map[next_positions[1][0]][next_positions[1][1]] = map[x][y]; + // Free up positions that were left + for (int i = 0; i < 2; i++) { + int left = 1; + for (int j = 0; j < 2; j++) { + if (next_positions[j][0] == current_positions[i][0] && next_positions[j][1] == current_positions[i][1]) { + left = 0; + break; + } + } + if (left) { + object_t *obj = calloc(1, sizeof(obj[0])); + obj->type = EMPTY; + obj->pos[0] = current_positions[i][0]; + obj->pos[1] = current_positions[i][1]; + map[obj->pos[0]][obj->pos[1]] = obj; + } + } + + return; + } + + // Robot is a single unit + int next_x = x + dir[0]; + int next_y = y + dir[1]; + move(map, rows, columns, next_x, next_y, dir); + map[next_x][next_y] = map[x][y]; + object_t *obj = calloc(1, sizeof(obj[0])); + obj->type = EMPTY; + obj->pos[0] = x; + obj->pos[1] = y; + map[obj->pos[0]][obj->pos[1]] = obj; +} diff --git a/day15/input.txt b/day15/input.txt new file mode 100644 index 0000000..1dc0af0 --- /dev/null +++ b/day15/input.txt @@ -0,0 +1,71 @@ +################################################## +#O##.OO.O........OO.#...OO#.......O..O.....O....O# +#OO......O..OOO.O#...O....O#.O#.O##...........OO.# +#....OO##O.O....OO.OO.OO...OO#..O.O.O.#.....#.O#.# +#..#..O.O#..O...OO..O..O.....OOO#.O........O.O#O.# +#O.#.#OO..#.......O.O..OOOO.O.....O.O............# +#........OO...O.#.O..O.....O.O.O.O...O..O....OOOO# +#.#OO..O....#..#.....O....#.OO....#..#.OO..O.O...# +#....OOO....O.......#.#OO.......O......OO..O#O.#O# +#...##.O....O..O.O..#..OO.O...O...O..OO....O#...## +##OO.O....O....O..OO....O....O##O.O..O.....#.OO..# +#..O........O..O...#.OOO.OO...O..#OO....O....O...# +#..........OO..O..#O.............#O.O#.#.O....O.O# +#...O.OO.......OO.........O.OOO...O.OO...OO..OO.O# +#.O..O.OO..#.....................O...O......O..O.# +##OO#.O.#...O.....OO..O.........O#....OO...O#....# +#.O.#..O.OOOO.O...O.O.OOOO..O...#......#O.O..OO.O# +#...OO....OOOO.OO.#.#O..O..OO.........O.O.......O# +#...#...#.O#....O.#O....O.O.O......OO..OO......O.# +#.O#.#O..#O...OO..O......O..O..O.O...O..O...O...O# +#.......O........OOO....O..#O#.....O#............# +#.OOOO......#........#...O..O..#......O..O.O..#..# +#OOO...O...O..OO.O..O.#O.......O....O#..#.O..O...# +#..O...##.O.OO#..O..O..O.....O...................# +##O......OO.O...OO#.O.#.@...O...O...........#..O.# +#O.O..OO.O..O......O.OO......OOO.....#..OOO..O...# +#....O....O.O.......#.O..O....#..#...O..O..O.OO.O# +#.......OO..O.....O..O#.O...OOO.O.O...OO#..O..O..# +#..#.#O.....OO..O.O..O......O#.OOOO...O.O.OO.O#..# +#..O.....O.#O#.....#O..OOO.OO.O.......O.O.O.O....# +#OO#O..##......O.O...O#.OO.....O....O.....O.#..O.# +#..#O....O..O.O#.#..#O.#O.#....#..O...#.O..OO.O..# +#OO.....#O....O.#O..O.OO..O.##O.O..O..O.OO.O.##..# +#O.OO.............O...O..#....O.O.OO....#O.OO...O# +#.....O#......O.O.O..O...O#O..O.#..OO.....#..O.O.# +#.OO..O.O..O....O#...#..OO.O.##.....O..#O..O...O.# +#O..O..#.#..#.....O....O.....O.##.#.......O......# +#O....O.....O..#.#OO.OO.#...........#.#.#O.....O## +#...O.....O..#......O.O.O.OO..O#.O#...OOO.OO..#..# +#....O.O.#O....#.......O.......#....O...O..O.....# +#.......O#....O..OOO.#OO..#...OO#....OO.OOO.....O# +#....#O.O.#OO.OO..O..O...#O.##.#O...O.#...O.O..O.# +#O.O...OOO.OO.#O.....O.........#OO.O....#.O......# +#.O.O.......O....OO......O..O.O.....O...O........# +#O#..#O#......#.O.......OO...............O....O#.# +#..O.OO.....O.O.O#O.O.OO.OO.O.....#O##..#O.#...O## +#..OO#.O..#.O.O.#O..O...O.#.#O..O....O....#O..O..# +#.O...O#.OO.......#.O..O...#.#OO.#..O.O...OO#O.O.# +#.....OO#....O....O.O...O..OOO......O....O#.....O# +################################################## + +^^<>v^v^v>><<^<^<>>v>vv^<>^>^>><^>>>^<^v>^>v<^<<^>^<^v<^^vvv^<^^v^v>^<>vvv<<<^><<^v^^^vv^vv<><><^v<^>>v^vv<>>>>v>vv>v^>><>vv^^<<^^<><<<^v><<^v^vvv^vv^^vv^vv><<<>v<^^<^vv<^^>v^^>^><^^v<^^>v<^^^>>><<>>^^>vv<>^^v>v>v<^^<><<^>^^vv><<<^<<<>>v^^vv>^v>v><>^vv^^<><>^vvv^vv^>^^v^^>>v<>>>^>><><>v>v<<^v^vv^<^vv>v>v^v^>>^>^^>v^v^><><^<>v^<^^^v<>>^v^^v^<>v><^<^v^^vv<>^v^<>vvv<><>><^<^^<^^v>vv>>><<<^^v^v^>vv^>v^v<><>^>^>>><>^^v^^<>v^v>>v^<>v<^>^^v>^>v>v^vv<^>v>v>>^<><^^<^v^<^>^>>vv^<^v^>^^>^><>>^^<^^><<<<<^<^>>>^><>>v^^vv<>>^>><<<<>^>v^vvv^vv<^>^<<<<>>v<>^><^v^vv^v<><^>^v>v<^>vv^v><<^>>v^>v<^><<>>>v<<<<^<><>^<>v>^vv>^<>^^^vv<><^>v<<^><<^v<^v>^v>^>^v<>v<^>><<^<<<<<<^<>^^^<<>>v>v^v<^^v^^^vv^^<>v>v<><>vv<><^>><<><<><^>^v<^>v^<>>v^ +>^<>v<>^^^><^^^^^>^v<^>v^vvv<<<<^v^^<>^vv^<^>v>^^^v^v^<<<><^^v>^v<<>^v><^<>^>^v<<<^<>^<<>>v<^<^^^^v>>>>v^^<^v>vvvv>v<^vv<><<>^^vv<>^^^<^^v>v<<>><^^<<<<>^^v^^>><^^vv^>^v^^<>vv^vv^>^>v><^<<>>vv<>^<^^>v^v^^vvv^>v<<><^^v>>vv<>vv<^^v>^^>v^v^vvv>^^^^^v>^<<>^^>vv><<<>>vvv<^vvvv<>^<^<<<<^<^v<^v^^><<^>^v>v^<>^<<^<>>><>^v>^^<><^>>^<<<><>>^<^v<>>v^^<>>>^v>>v^vvv<>>vv><>v^<<>v<<<<>>>>^v<^<^vv^^^<^<^v^v^^^^>v^v^>vv>v^>^<^>vv>^>^<^v>>v>^v<vv<>v><><^>>>v^v^^vv^vv<>^>v>>^<<v^^vv<<v<^vv>>><^>^^<^^v^>>v>><^<>>>>v>>^^>^<^<>>>^<^^<<><^v^>^>^>^^><>>vvvv^>>vv^><><<<<^vv<>>v>^<<^<>^>v>^<^v^^^v<^<><^>v><>v^v>>vv^<><<>>v><^v<^><<>>^>v^><<^v^>>^>vv^^^^^>>^<>^>v^<<<^^^vv^^v<^>>^<>^>^<>v^^><>>>^^vv +>><>^^^<>v^>v>v^<><^^>^^<^^>^<>^><<>>^v<<<^^>v^<><v^^<^^<><v><^<^^vvv^^>v^>v^^>^v^vvv^v>^>v^><>^><>>^v>>v^<><<<<>>>^v<>^<>^>^^^>^^>^>v<^^^^>>><^<^vvv>v^^>^^^v<^^<><>^vvv^<^^v<^^>>vv^^<<^^^>v>>^v^v^v<>>>^v^<^^v<^>v^^>vv<^vv>^>v^v^^v^v<>^<>>^>^>v^>>>vv<<^^^<<<<^vv^>vvv^^v>v^vvvv>>^^^>^^>>^<^><>>>v^v<<<^^^>^^^v><>^<^<>vv^<><>>^<<>^^>><><>vvv^vvv<^><><^^v^><>^^^>^v>^v<^vv><^^^>v^^<<^^^^^v><^<><<^<^^><<<>v>v^^^^<^^^>^^>v^^^^^>v<>^>><^<><<<>^>^^^vv>v>>>^v<^>v>^><<>><>>>>>>^>^<<<><>>>^^vv^<^v<<<^^<^^v<>^>>>^v^<><<>^>v<<>vv^>>^v><<<^<>>><^<>v>><^<<v>vv^>^^v>v^<>>vv<^v<>>><^><^^v^>>^>>v^v<><<>>vvv^<>^v<^<<^v>vv><^^v<v>^<^>>^>vv>>>><^<>v<<<^v<>>>^>>v^v<<>^^>^<>v>>v<<>v^v^<>>>v>^><>><>v<><<>^^>>vv<^>^^<>^^><^v^>vvv>^<< +^^>^v<><>>>>><^><v<<>v^<^>><>^<^v^><<v>vv<<>>v>v^>^<<^><><^>^<<>v><^v>v>^^^^>>^^^v<>>v<<<<<>^<<>>v>^<>^^<><^<>^^v^^^^v<^^v<^vv^v<^vv>v^v><<<>>^^vvv^^<vvv<<><^v>>>^^^><><^^>^>>v^^<>>v>v^>>><<^v>vvv^^v<^v^v<<>^vv<^v>v>^<>^^>^v>^<^>>^<^>vv>><>^<<^<^^vvv^^>^^v^v<^<>v><<^v^^>v>>>><>vv><<^v^vvv<<>^^>^v<>><>^>^>v^^v^^^<^v<>>^<<<^vv^>>><^<<<^<^^<^v^<^^^<<<<<^v>^<>^<>>^>^><<^><>>>v<>v>^v^v>^>^vv^v^^>>>vv><^<>^^vv^>v<<^v><>^>^v<><<>>v^<<><^v>>>^vv><<>v<><^>>^>^^vv<>v<<>v>^<<>>^^>v^v>>v^v><>>^<>^><<^vv^^>^vv^^v>>v><vv<>^vvvv<<>><>>^><^><<>v^^^v<^>vv^^<^^^>^<>v^^><>v<>^><<>^<><^>^<^v>v^v<<>><^v^<^>>v^^>>^vv^^v><><<^v^v^^>^<<<>>>^>v<^<<v>>vvvv>vv^ +<^^vvv^>vv><>^v<>>^<<^v>>>vv>^<>>v^<<>>><^^>vv>>vvvvv^v^^<^<<^^<>>^^<^>v>v^<>>><<^>>>vvv^<^<><^^vv<<^>>>>>>><^v<^><<<><^^<>vvvv><^>^<^<^^v>v>^^>^<^<v^v^>^vv>v^v^<^vv><^<^>>v>v<<<><>^v>^^v^<<^>>v^^^><<<>>^^<<^v^v^<>^^vv>vvvv<^^^v<<^<>>><^^<<^v^<>vv>v<^>v>>>^>v<>>^>^<^>>>^<>^^^<<><>v^^^>v^v<>>vv<>vv^v>>^vvv^v>^^v^^v>vv<>^^>v>v>>^><^<<>>v^v^>^^^<>>v>>v<>^>v>^^^vvvv>v><>v<<>^v>^^v>><>^>>^<^<^<<^>v>^v^^>^<<^v^<>>^^^v>vvvv^^vvvvv^v<<>>>vv^<<<^^^^v<^>><>^>>>^^^^v^<<>>v>^^v^<>>><<<^>>vv<><<>>^v>v><<^v<>^v<^>>>>>^>>^v^>v^^>^^vv^>^^^<>^^vv<<>^<v<^^vvv<><>>^^<>>>^vv^v^^>><>><^><>^>^^<><^>v^^>v^<>v^v><^<^v>>^<^>>^>vv<v>>^<>v^<^>>>v^^>>v<^^^>^v^<>vvvv<<^>>^^vv^^<>^>>><>v^>v<>>v>^><><<>vv<^<><><^><<>>^<^^^^>^vvv<^>><<^^<>^>> +>^v>>>^<^v^^<^><>vv>>vvv<^<^^v<^>vvv<>v>v<<^^<>^v>v>vvvv<^><^<^^<>vv>v>vv^>v^>>>^^^>><>>^^v><<>vvv<>>^^>>v^^<^>v>v<>^vvv^>>^>>v<^<>v^<>^v<^<>^<<<<^v^v^<>^>v>^<>^^<>v><^v>>^<^>^<^vv^v<><>vv^><^><v><>v^<>>^<<^^^v<^v^<^v^vv<^>^>v>^^>^><<>^>^v^<^^>>v>v<>^v^>v^v^v<><<^^<<<^>v>^>v>^>>>>^^>v<^vvv<<>^v^<><>^^><^v>v>^^^><><^v><><<>>v^^><<>><>v^<^<^><<>v^vvvvv>^v><<^<^><^<^v^<<v<>^^v><^^>>v^<<<>>^vvv<<<<<^^v><<<>vv<^v^v>^>^v<<><<<><<>v<>>>^>>^^>^vv^<^v>vv><>^<<<<>><^vvvvvvv<>vv^^^^vv^<<^<^<^>v^v^^^<>><><<>><^v>^v^vv<><^v<<>^>v>^<<>>><>vvv><^>v><>v>><^<<^><^><<<^>v^>^v^v<<>vvv^^>>v>^^>v>>^<>>><<^^^<^>v>><<>v^^<v^><>^>^^v>v^^<>^^>vv>vv<^<>^^vv^><<><<<<^>^><>>^vv>^v^v^>>^><^^>^^<^^v^vv<><^>v>vv^^^>>>>v +v<<^v>>vv^<><>>v><>vvv<>>v>^>>>^<>^vvv>^>^^>>^^<>vv^>^^<><>>^^>>^>>v>^^v>v<>>><<<<^v^<<^vv<<^>^>v^>^^v<>v<^v^^<>><^>><^<<<^v^^^v<<^<>>v<^>v>^>v^v^^^^v<^<^^v^vv^v>v^^^>v><><^^^v><>^>^>^>><^^^>v<<<<<<<>vv<<<^>v><^><^>v^v^vv>vv<^><^><<^<^<>v>^v^^>><>^v>>^^<^v^>v<><<>>^v^^^v^^vvvv^>v<><^^^^>^<>>vv^^^^v^<>v<^v>>><v>v<<^v^v^>^>^v^^>^<^<><>^v<><^^>^<<^^^<^>^>vv>^^^>^<<>vv^>><<>vv<<<>vvv^v^v<><^^^v<^^>^v^v><<<^>^vv>v^^vv^<^>>^>vv^<>v^>v>>>v>^vv>^^vvv<^>^v<><>v^v><><^>^><<<>^><>>^^<<<^>>><<^v>^^>>>v>^v^v^>v>^^^^<>>>v^v^^^>^^>^>v^vvv>vvvvvv>v^^v>^^>^vvv^<>^vv>^vv<<>^^>>><v^^^v>v>v><^v<>v><v^<>^>v<^>^^>v^vv^><^<^<>^v^<<<<^<>>>><<>>>>v><<>^^<><^>v<<^>^^^<^v>v>v>^^v<>v>>^^>v<>^^^vv>><^>^>vvv>>^><<^v><<^^<^^^^^^v^v>^>^>v^v>^>>v>> +>^><><<>^<>^^<^^^vv><>^^>vvv^>vvv><<^v^^v><<>>^<<<<^^vv<^>>>v^v>>^vvvv>><<^vv^^>^>^<^v>^v><<^^v>>>^v><<>>>>^<^^^^^^>^^<^v^v>>^^^<>^><<>^>v>>vv^^vv<<>v>>^^^v^v^^^><>v<^^^v<><>>vv>^<^^>^^^vv>^^vvvv^<>>>^^^><^v<>v^^v>^>v><><<>>vv<><<>vvvv^>v^v<^^vvv<><<<<^vv>><>v<>><^<<^<^^^vvv^<><<^v>v^><^^><v^>v>>^>v^vv<<<vv^>v<<^v^^^>>>>vv>>>v^>v^v^<^^^v>vv>vv>><<>>>^<^>^<<^<^><>vvv>^^vv<>v>v>v^>>^<^vv>>v>v^^v>>^^<>^><^>>>^><^v<<<<<>^<><<<><^>vv^^>v>^>vvvvv^>>><<^><^<^^>><>v^<^v>^<>v^v^v>>v<<^v><>v>v^v<^v>vv>v>^<><>vvv^<^^^<>vv^><>v^>>^v^<^vv><>v<<^><^>^v>vv>>>>^^^<<>>v>>^^v<>>><<^v><<^>^v^^<^><<><>>>^v^<<>>^>v><>>^^>^^v>>^<>v^<v^^^v>>^v^<>^<^><>^>^<^><>v>vv>v^<>>v^^vv^v><>>>>>>>v>vv^>vv^^><<^<^^<>>v>v<<^<><^>><<^><^>v^<>^ +>^v<^^^^vv<>>v^v>v<<>v^<>vv<<<>^v<<>>v^v^><^>>vv^v><<><^^>^><^^<<>^>^^<<<^>>><>>>^vv>>^v<v^>^<^^^^^vv<><>^^>vvv<>v^^><^<>><>v>v^vv>^v>^>v><>^>v><>>^<>v^^^^>v^^>^>>^>^v<>v<>^^^v^><<<v<<>>v^>v^^>>^>>^^>>>v<>^vv^<><<>v^<v^vv<vv^v^>v><<^>>>^>^v<>v^<^vv<>><^^v<>vv>v<<^>>^v>v^<^v>vv^^^vvvvv><>^v><><^^vv^^>^><>>v>v^<^vvv><vv<^>>>><<vv^>>>v><>>vv^^v>^^^>^^^^>v^^><><<^<^><^v><><<^^><<^vv<>v<>>v^v>><<<^><<^^^v>v>>>v^^<^^v>>>v>>>^<<v^><^>^<<<<^^>^>v^^vv<^^<<<<>^^^^<<>>^^^>vv^vv^><^v<^>><><^v^^>v^^>v<>v>v^><^>>><<<v^v^<v<^v>^<<<><>>^>>v<>>v^v>v>^^vv<>^vv^^v>v<^v<>>^><<<^<><>>vv^^vvv^v^<^v><>^^<<<>vvv<>v>^^>^v^v>^v>>><>^>v<>^>^v>v^^v^^>^<<>>^<<<<><<><<>>v>^v>>>^v>>v^<>vv^>v<>v^^<^v<^<><<><>>v>>^<<^v>^<^vvv^v^>><>><>vv<^<^vvv>>^>v<>^^^v^><<^<^^^<>vv<^>^>^>^><^><<^>><>>v<><>vvv^v^^<<<>^>v>^>^^^>vv<^vv^^^>>><^<>><>><<>v><^vv<<<<^<>^^>^>>^^v>^v^>v^<^>>>v^<^vv>^^>>^<>>>^>v^<<>>>><><<>>>^>>^>>v^<^vv<>>>v><>v^>^<^^>v<>^>>vvvv><>>v<>^v>^^<<>vvv><<<^>><><<>^>^v<<><<<vv^>^vv<^<>><^^>^vv^vv^><>v<<<^^<<^^^^>><>>><>>^v<v<<^><^<>^^<^><v><<^v>>v<^><<>vv>vv<vv^>>v>>><^v^^vv^^<^>v<>vv^>^<>v>^>^>><>>>^>v^v<<^<^^<<^>^<><<>><>^>v<^^<<>^v<^v^^v<<^^>v>>v<^<^>^>^><>vv><<^^vv<>>v^><>><<<>v>vv>>v^>^<<^^><>v^>>><^>>>>v^v^v^v^^<>>vvv>v>^vv>>^v><>vv>v^v<^^><<<^<^>>v^^vv>^v<^^<><>>v><^><>^^<^<><<>>v><^<^><^v>^^v<v<>><<^^v<^v<>v^^>v^^^vvv>>>>><>>v>^v<>>><>>^>^vvv>><>v>vvvv^<> +v<><<<^<>^^^v^<<>v<<><><^>^vv^v<^v<<><^>v><^<^>>>><>^^<^vv>>^<^>^<>>vv^v^>^^<>^>>vv<>><^>vv><^>><^^<<>v>>>^v>>>vv>vv>^v<>^^vv><^v>v<^v^^v^v>^^^>><<<^v<^>v<>>^>v^^>^><><^<>v^^vv>^v>vv><^<>^vv>^<>>>v<^>v>v^<^>^><<<>>^>^<^v>>v<<^>>>v>v^^>vv>>><<<^v^<^^^^^v>^v^>^vv<<<^^^>^v>^>^>^>^v^><<<<>vv>vvv<^v>>^>vv><<v^^^^<^vv^<><<<^v>^>^^<^<>v^><^v>v<<<^<>>^v>v>>v^>><^<<^^^><^>v^v>vv^>v>v^v<<^v<<><^^<^vv^>>v^^v^<^v^<>v<^^v>v^v^^^<^v>>v>><<^>^v^<<<>^v^>^v>v<<<<<<>><<>vv^^vv>vvv^^v<>v>^v>vv<<<^>>v>^><>^^vv>v<>v<^>v^<<^^<^v^vv<<^^<^>><><^<^v>^vv^vvv<>^>>^^^>^>^>^><^><><><^v>v<>^v<<<>v>^>>v^vvvv>vv<^v><^>>^>>>v^^^v^v>^<^<<<>>>v>^>>><>><v^<^<<^^<>v^v>^^^^v<^<<>^<^v^vv^>>^<>v>>>vv><<>><>^v^>v>^^^vv>>^^vv>v>>v^^>v<<><>v<<> +<>><>v^^v<v^^><<^^>^>^^v>><<>v^<^^^><><>v^v<>vv>^<^>^^^v^<<><>vv><^v>>^>^>^^<^>^^^vv>^<><>><<>>^^>^><<^^<<^<<><^vv>^^v>^<>v>^><>v^vv<>>><^vv^^v^vv<<^>vvv>v><^v><^v^^<^<^<>^^>>^v^><<<<>^^<<>><>>>>v<>>^<>>v^>^<^^v>>^>v^^<^>><><><^v^v>v<^^>^>vv^v>v>v^<>>v>><>^<>>v^^vv^<>><<^><^vv>>^><<><<>^^<<<<^^v^<^<>>v>^vvvvv<^v<v^^^>v<>>^^>^v^<^>v<^>v^vv>^><^^<>><^v^<><<<^><>><^<<><^<>v^>><>>vv>>^>vvv>><>>vv<^>^>^v<<^^<<^>^>v^<<^<^><>^v<^<<><^v^<<^>>v<<^><>v^><<>vv<^><<^vv>v<<<^>^>>^>><^vv<<^<><>>^>^^<^<^v^v>^<^vv>v<^><<<><v^<<<^<<^>^vvv^v^v>v^>v^^v>>v>v^<>vv^v^>^v>v^^^v^^v>^><^<^<>v<^>^^<^>>>^<>vvv^><<v^>^><>>><^>v<<^v>><<>^><^^vv>vv^>v<^^<<<>>^v^^>^^<>vv^><^^v>^>^<^^>vv^>vv^><^><<<>v>^^^^>>^<>v>>v>><^^>v^vvvv^^>>vv^>v><>^^^<^^<<>vv^>v<<>v><>>><^vvvv^>^<>v^v< +v^vv<^v>^<<<>^vv^<^>v^>v>>>^^>>^<>v><<^<>><^^>v^v^>>v^>>><><<><<><^v<<<>>vvv><>><>v>^><><>^vvvv>v>v<<><>>>^<>>^>v>>>>^<^^><v^^><>vv>>^^><><><<^v<^<>>>^vv<<>^>^><^^>>v<>v<>v^^>v>^>^>>v>^>v^>v><^vv><<<^^<<^<^^<^vv^<>>v<><>^<<><^^>^>v^vv^^<<<>v>v>^<v>>v^<<>^>v^<^<><<^<>^v^vvv^><>^<^^v>>^v<<>>v<^>^^>^>^<^<>^><<^^>vv<^<^v^v<><^^^v^^<><<^^>v>^<<^>>>>v>v^<>>>vvv>>v^<>^><<<>>v<^^<<>vv^<>vvv<>v><>v^^v>v^>v<>vvv>>><^vv<>^>><<<><^>^^<<^^^>>vvvvv^>^^><<v><^><><>vv^vv^v>vv^v><^><><>v<^^v^v<><>^v^><>^^>>vv<>>vv>vv^^v>^>v^v><>v^<^<^vv>^v<>^^>^>v^<<<^>^^^<>vvv>>v^>><^^^>>>v^^<><>v><>v<<<^^><^vv^^v^>><<^<>>>v^^>^>>vv^<^>vv>^vv^vv<^>>>v>^>^>^vv>>><>v<<^><<^>><>v^v>v<>^v^^>vv><>v>^><<<>v^^<>><^^^vv<>v^vv<>^><^^>^^>^<^>>>vvv<^^^v<<^<<><>^>vv<>^<<>>v>>^>vv>v +^<>v<>v>v^<>v^^^^vvvvv^v>vv^v^v^^v^^^^>v^v^>>v<>v^^<>>^<^^^>v<^>vvv>>^<<>>>^<>^v>^^v^><<<v^<>>v>v^>^>>><^>vv<>v<<>v^>>vv>v>^>><^><^v^><^^<^>>^<^>v^<<>><>>>>vvv<>^v^vvv^v<>^v^^^^>>>vv<>>v^>v>v><<<^^>>>v<^v^<<^v^<<><>^v^^>^vv<>v^>v>^^<^v<^<^vv<>v^vv<<<<>>^v^>v^^>^^^<<<^<>v>^vvv<^^<>>v^>>^^^<>><^^^^v>>>^>v^v^vvv>^v<>^><<>>^v^^>^<<^v<>>v>^vv<^vv^v^><^^^<><<^<>^^>^vv><<<<<^v^<^v<>vvv^v>v^>v>v^v^<>^^<>v>v^v<<><<<>^^v^>^v>v^^<<^v^>>^v<>>>><^^<^^^<>>vv>^^v>^v<^>><>v>^<<vv<^<v<>^v^^<^vv<^>>^vvv<><^<^>v>^vv<<<>^^>v>>^v><^^vv^>^vvvv^v^<^>v<>^><^^^<>>v><><>^v<^v^^>^vv<>vv>>>>><<<<><>>^<^<<<>vvv<<<<>><>v^v>>^<>vv<^v^vv^^^v>>vv>^>^<^<vvvv^vv^^>>^v^>^v><><^<>v<>>v^^>^>><>^^<>>vvv^v^>>^^<<^<<<^<>v^^^^^<<^>^^<>><>>>>^<>>>>>>v^vv<^>>>>v<>^v>>v<<>^^v<>v^^v<^>><>>^^>v^^<^>vvv>vv>v^v^>^>>v^>vv^>v<vvv>v<^>^v>><>v^<<>v^^^>><^><>^<^>>^v>^v^<^><>>>>^v>v<>^>^^<^<<>>^^^^v>^>vvv<<>^>v<<^^^vv>>>v><^^v<>>v^v^>>>^^^><<^^<<>>><<<><<>v<>>^<><<<^>><>><>^v>^v<<<>^^v<<^v>v>>^^^v^^^vv^vv>^v^v^^^v<^>v<<vv<>vv^^>>>>><v>v^v<>>^><<<^<<>>^^<<>^^vv<^>>^>>>>>>v>v>>^>^^^>>^<<^^>>v<<^<<v>^^<><^<><><>^^v<>>><^<^<^<^v<^^v><^<^>v<>^<><^>^>>^^^vvv^^>^>^^^>^>v><^>^>^^v^>^<^><>><v^v<><v<>vvv^^^<<>^^^v^<>>v^<^>^<>^<><>^^<><vv><<v>^^>v^>vv<>^>vv>^>>^>^<^vv>>vvvv>vv^<^>>^vv>vvv>^>v>v<<>><>vv<^<^><^^>^><^v><^>>v<<^>>vv<^>v>><^v^<>v><^^<>^vv<<>>><><<>^>v^^<^^v^>^><^<^><>^<>>>>^>>vv>>vv^<<^vv>v^<^v><<>vvv>v>>vv>^^^<^v<<<>v<><>>vvv^<>>>^^>v<^^ +v>^^>v<<>^<<<^^^^^>v><>^>>^<<<>>v<^><<^<>>>^v>v^^^^v<>^vvv>vvv><>^^vv><<^v>v^>vvv><>><><^^vvv>>>^^><^^^>>><>vv<<>vv<>v^vvv><<^^v^>v<>v>v^^vv^v>>>vv<^vv><^>^^^>>v^<<^vv^>><^vv>v^v<>><<>vv^>v>v^>><^^>v^^^>^v<^^v^>v^^^<^^^^<^><>vv<>^^>vv^v^><^^>^^vvv<>^^>v^v^<^^><>>>^^v^<^^v>vvv>^vvv<^vv>vvv<<><>>^><>^<^>v<<<<><^v>>>v>v^^v><>^vv<<><><<<<<<^^><<^<<<>^v>^><>>vv^>><<>>>vv>vv<^<<^<^>v<<<>^<<^<<<<>>>><^^<^^<^>>v>^^^>v<<^vv<^^vv<v<^><^vv^^>vv^v^<^^^v>>>>vvvv<^v<<<^>v<^<>>^>^<>^<>vv<<><>^><>vv<<>^^^vv>v^<<^v<<<>>>v<><<><><<>>^><><<<>^>>>^<<^<^^v<>>v>>v<<^><><<^^v>v<^<^<<>v^v^v><>>vv<<^v^v<>v><^<<<^vv>^>><^vvv>^<<<^v>^>>v<<<^v<^>^v<<^v^^^^^v^><<>^vv^^^v<>vv>>^<>>^<>v^>>^v^>< +^^>v<^^vv<><^^<>^v<^>><^^<><>^><^<^v^^v<^>^v>v>vv>^^>v>v>^^^^v>v^v^v>^>>^^^>>v<^<>^^vv<^^>><>>^vvv>^vvv>vv<<^v^>>^^^v^<<^>>^^v^^>v^^>^>^^><>v>v<>v^^v^>^<>><>>>^^>><<^>><><<>>>>^^>>^v><^<>^>vv^v<><^^<^>^v><^^>^<<<<<^^v<^>>^><>>v>>>vvv>vvv>^v<<<^vv^^vv^<^^v><^<>^v<^^v^<>v>^^^^>>>v>^>^^v<^<<>^><>^>><>v>v>^<><>^v^<<^<<^<>v<^^^v^<><>>v>v^<<vv>>vv^>>v><<^^>>^^>>^^^v<<^v><>v^^v<^vv^>v<<>v><<<>^v>v<>^^^^>>v>>vv<^v>>v^v<<><>v>v<>^<^v<>>>>^^^<>v<<<<^>vvv^><^v^^>^^>>^>><^vvv>v^^<<>><^vv^vv^<>^>>^<>><^^^>^<>v>^vvv>>>>v^vv><^<<<>v<>>^>>^>v>^^v>^^>^v^^<^>^<><^<<<^^^vv>^>>v^><<><><<<^^>^>^^>vv<^^vvv<<>^>>><^vv<>>v<<><<>><>v>>^>^vv>><^v>v^v>vv><<<<<>^><<<>^<^^v^v<^^>>><<>>^v^>^^vv>^<>><<<^v<<>vv>^vv^v^^>>^^^^<>v<>v>>^>>>>^>>>v^v>><<<<>v<^ +>^>^<^v^<><<<<^><>^^<>>vv^v<^v>v<><<<^><^><^<^^<<>vv^<<v^<^v<^<^vv<^<^^<<>>v>>^>>>^<^^>v>v><<^v>>v>><>^<<>>vv^^^><^<v<^<>v>v>^>>^^<^><><<<^>vv>>>>><>vv<>^>^><<<><v^>>><^v^^^<<<>>v^><^><^>^<<^<<>^^^<v>^>>vv<<<^^^<<>><^^<^vv<><<^<>>^>>^^>^<<^vv<<<>>>^^^vv>v^>>>^v<^^>^>>>^v^vvv^<<>>><>><>v>^v>>v<^^><>><>>><<^^^>v^<><^^<>><v>><^v^>>>^>v^v>^^><>>v<>v>v^>v>>^^v>vv^vv^v>^>vvv<>v>v<^vv>v^^^>^v^>^v<>v>^v>^>><>><^<^>><^v<<><^>^v<>^v>v<^^v<<^v<^^^v<^<<><>v<>v^><>^^v<>^vv^^<^^v<^<><<<^^>>>>^<>vvvv>^>vv^<><><^v>v^^><<><>^^<<^<>^^^^^<<<^><>^v^^<v>><<^>^v^<^^^^v>v<<<^<>v<^v>^>^^>v<^^>v>>><>v<<^^^v>^<>>><<>>^>>^<^^^<<^<<>vv^<^<<^vv^<<v^^v^<>^^^v<>v>vvv>^>^v<<>>^^^vv^>^>v^>>vv<<^>>vvv>>>v<<^v><>^<<<>^v^vv^^vv>^^^v^^<^vv>^>^<>v^>v^<> +^><<^^vvv>v>v<^vvv<<<<>><<^>><<<>>><>v^>v^>>^vv<<>^>>>>^>>^><>^v><<>^^>^v><<^^vv><^^v>v<^v^^^<^<^v>v<>>^>v^^<<>>v>>^^><^<^>^v^>vvvv>^v^vv>>v>v>^<^^>v^^<>>>^>v>^<>^<<^>^>^><><>^><>vv>><<>>>^v^^^<>^>>v^><^vv^^<><<^<>^<^^v>v^v^>>^<^v^><<<<<^>vv>v^^^^<^^^v><>v<>v>vv>>>><<^^<>v<<><>v<^>>v<>>^><<^v>v<>><^v^>^<v^v>><^^^<^<><>v<^^v>^v^<<<<^v<<^^^^v>v>^v^^<^vv^v<<^>^>v<>^^^<<><>^v<><^<^<^>v>^v<>^vv>^^^>vv<><>^v<><<>v^v>><>>^<^^<^^^>^v^vv^vv^^^v>v><^vv^>>vv^<>>^<^v<>>^^^<><^v^<<^^>vv^v><<<^>v^^^<><>v^^v>v><^<^v<^^^^v^^><>v<^^^^<<^v<v>v><>>^><^^vv^vv^v<>vvvvvv><>>v<>^^>^v^>vv^^^^>^<><>^<<<>><>^v^vv<>^^<^^vvv^vv^v^^>><>^vvv><^vv>>>^>^>>>v<^>v^^^v<<>v<^v^<>^<^>>><<<>>vv^v>^v^v<^^>v^^>vv<^>vv^<^^>^^v>>>>v>v^^^^^>^^v<^^>vvv<>^><>^^vv>v<>v^^v>^^^>>v>>><>v>vv^^<^^v^>v^^>v<^v^>>^vv>vv<<^<^vvvv<><>>< +>v^v^^^^<^^v^<>>v^>v<^v<^><^^v>vv<^^>vv>v>vv^><>^<>>v<^^<>^^>v>v^^>vvvv<><>>v<<^><<^<<>>^<^^v^<^^vvv^^>^>^>>v<^^vv>^>^<>^><>v^v<<>>>^v^^vv><^<<<>v>^^>vvvv<<^vv^>^vv>^^>^<<><><>^>^<><><>^<><^^^v^>v<<>vv>v^^v>>>^v<^^v^vv>v>^>>^<>^>v>v<^v^^v>^^<>v>v<^>v>><<vv>^>^<^><>v><<>>^^<^v>v>v^v<<>v^v^<<>>v>>vvv^>vv^v<>v^>v><<>vvvvv^>>><>>v^><^<>>>v^v><^>>>^^>v^>^>v>><<>><<<>vv<^v><>^><^<>v<vvvvvv>>^^<>><>vv>v^v<>>v^^v^>v>><<^>v<^v>>>>^>^vv<^<^v<<v>vv<>>>vv<^>><^>>^<<>v<^>>><><^<><><>>>>>^>>v><^v^<^^^>^>>^^^v<^>^><^>>>><^^^<^>^^v^<<>>^^<^><<^<^<^>^>vv>>vv^^^^^>vvv^vv<^^<^>vv><>v>^<^^^v^><^v><^vvv<^^vv^<>^<vv^v>v<<>>>>^>>^vvv>>^vv><^^><^>^^>>v>^v>v<<<>><^v^>>>^>^><vvv<> diff --git a/day15/sample.txt b/day15/sample.txt new file mode 100644 index 0000000..84cf1fb --- /dev/null +++ b/day15/sample.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^<<^ diff --git a/day15/sample2.txt b/day15/sample2.txt new file mode 100644 index 0000000..8163605 --- /dev/null +++ b/day15/sample2.txt @@ -0,0 +1,10 @@ +######## +#..O.O.# +##@.O..# +#...O..# +#.#.O..# +#...O..# +#......# +######## + +<^^>>>vv>v<< diff --git a/day15/sample3.txt b/day15/sample3.txt new file mode 100644 index 0000000..6ee6098 --- /dev/null +++ b/day15/sample3.txt @@ -0,0 +1,9 @@ +####### +#...#.# +#.....# +#..OO@# +#..O..# +#.....# +####### + +