From 4db23f212c690d910f275cd1dfa7c0094af877ec Mon Sep 17 00:00:00 2001 From: dobiadi Date: Sat, 24 Dec 2022 20:39:09 +0100 Subject: [PATCH] Day24 --- day24/blizzard | Bin 0 -> 25088 bytes day24/blizzard.c | 390 +++++++++++++++++++++++++++++++++++++++++++++++ day24/input.txt | 27 ++++ 3 files changed, 417 insertions(+) create mode 100755 day24/blizzard create mode 100644 day24/blizzard.c create mode 100644 day24/input.txt diff --git a/day24/blizzard b/day24/blizzard new file mode 100755 index 0000000000000000000000000000000000000000..f07040888c03a736f5283f659968451b2a042f46 GIT binary patch literal 25088 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 n^GV0QGSKwgLou6PY%z=B0_BD6^RcR!{3Zr=q +#include +#include + +#define BUFFER_SIZE 256 +#define MAX_MAP_SIZE 1024 +#define MAX_BLIZZARDS 4096 +#define MAX_BLIZZARDS_HISTORY 4096 +#define FIFO_MAX 32*1024*1024 + +enum direction { + RIGHT, + DOWN, + LEFT, + UP +}; + +typedef struct blizzard { + int startPos[2]; + enum direction dir; +} BLIZZARD; + +int moves[5][2] = { + {1,0}, + {0,1}, + {-1,0}, + {0,-1}, + {0,0} +}; + +int dist(int [2], int [2]); + +int main() { + char buf[BUFFER_SIZE], *p, c; + memset(buf, 0, BUFFER_SIZE); + p = buf; + int y = 0, x = 0; + int map[MAX_MAP_SIZE][MAX_MAP_SIZE]; + int startPos[2], endPos[2]; + BLIZZARD blizzards[MAX_BLIZZARDS]; + int blizzard_count = 0; + + while ((c = getchar()) != EOF) { + *p++ = c; + if (c == '\n') { + p = buf; + while (*p != '\n') { + if (p-buf+1 > x) x = p - buf + 1; + if (*p == '#') { + map[p-buf][y] = 1; + } else if (*p == '.') { + map[p-buf][y] = 0; + if (y == 0) { + startPos[0] = p - buf; + startPos[1] = y; + } + } else { + blizzards[blizzard_count].startPos[0] = p - buf; + blizzards[blizzard_count].startPos[1] = y; + switch (*p) { + case '>': + blizzards[blizzard_count].dir = RIGHT; + break; + case 'v': + blizzards[blizzard_count].dir = DOWN; + break; + case '<': + blizzards[blizzard_count].dir = LEFT; + break; + case '^': + blizzards[blizzard_count].dir = UP; + break; + } + blizzard_count++; + } + p++; + } + y++; + memset(buf, 0, BUFFER_SIZE); + p = buf; + } + } + + + // Get exit point + for (int i = 0; i < x; i++) { + if (map[i][y-1] == 0) { + endPos[0] = i; + endPos[1] = y - 1; + break; + } + } + + int times[3]; + int (*fifo)[3], fifo_count; + fifo = (int(*)[3])malloc(FIFO_MAX * sizeof(int[3])); + + fifo[0][0] = startPos[0]; + fifo[0][1] = startPos[1]; + fifo[0][2] = 0; + fifo_count++; + + // We will calculate the blizzardmap at each timepoint + int ***blizzardMap = (int***)malloc(MAX_BLIZZARDS_HISTORY * sizeof(int**)); + for (int i = 0; i < MAX_BLIZZARDS_HISTORY; i++) { + blizzardMap[i] = (int**)malloc(x * sizeof(int*)); + for (int j = 0; j < x; j++) { + blizzardMap[i][j] = (int*)malloc(y * sizeof(int)); + memset(blizzardMap[i][j], 0, y * sizeof(int)); + } + } + int blizzard_history_count = 0; + for (;;) { + if (fifo_count == 0) { + printf("PROBLEM\n"); + break; + } + // Pop next element from FIFO + int currPos[2], currTime; + currPos[0] = fifo[0][0]; + currPos[1] = fifo[0][1]; + currTime = fifo[0][2]; + + fifo_count--; + if (currPos[0] == endPos[0] && currPos[1] == endPos[1]) { + times[0] = currTime; + break; + } + + // Shift back elements + for (int i = 0; i < fifo_count; i++) { + fifo[i][0] = fifo[i+1][0]; + fifo[i][1] = fifo[i+1][1]; + fifo[i][2] = fifo[i+1][2]; + } + + // Calculate each blizzard's position at currTime + 1 + if (blizzard_history_count < currTime + 1) { + for (int j = 0; j < blizzard_count; j++) { + int newX, newY; + if (moves[blizzards[j].dir][0] >= 0) { + newX = 1 + ((blizzards[j].startPos[0] + (currTime+1) * (moves[blizzards[j].dir][0]) - 1) % (x-2)); + } else { + newX = (x-2) - (((x-2) - blizzards[j].startPos[0] + (currTime+1) * abs(moves[blizzards[j].dir][0])) % (x-2)); + } + if (moves[blizzards[j].dir][1] >= 0) { + newY = 1 + ((blizzards[j].startPos[1] + (currTime+1) * (moves[blizzards[j].dir][1]) - 1) % (y-2)); + } else { + newY = (y-2) - (((y-2) - blizzards[j].startPos[1] + (currTime+1) * abs(moves[blizzards[j].dir][1])) % (y-2)); + } + blizzardMap[currTime+1][newX][newY] = 1; + } + blizzard_history_count++; + } + + // Check each direction from position + for (int i = 0; i < 5; i++) { + int xp = currPos[0] + moves[i][0]; + int yp = currPos[1] + moves[i][1]; + + // Hitting a wall or walking off the map is not healthy + if (yp < 0 || map[xp][yp] == 1) { + continue; + } + + // We cannot step on a tile where there will be a blizzard + // the next round + if (blizzardMap[currTime+1][xp][yp]) { + continue; + } + + // Stepping back to the entry point is pointless + if (xp == startPos[0] && yp == startPos[1] && i != 4) { + continue; + } + + // There's no need to check the same position twice in the same round + int inFifo = 0; + for (int j = 0; j < fifo_count; j++) { + if (fifo[j][0] == xp && fifo[j][1] == yp && fifo[j][2] == currTime + 1) { + inFifo = 1; + break; + } + } + if (inFifo) { + continue; + } + + fifo[fifo_count][0] = xp; + fifo[fifo_count][1] = yp; + fifo[fifo_count][2] = currTime + 1; + fifo_count++; + } + } + printf("To the end: %i\n", times[0]); + + // Reset FIFO + fifo_count = 0; + + fifo[0][0] = endPos[0]; + fifo[0][1] = endPos[1]; + fifo[0][2] = times[0]; + fifo_count++; + + for (;;) { + if (fifo_count == 0) { + printf("PROBLEM\n"); + break; + } + // Pop next element from FIFO + int currPos[2], currTime; + currPos[0] = fifo[0][0]; + currPos[1] = fifo[0][1]; + currTime = fifo[0][2]; + + fifo_count--; + if (currPos[0] == startPos[0] && currPos[1] == startPos[1]) { + times[1] = currTime; + break; + } + + // Shift back elements + for (int i = 0; i < fifo_count; i++) { + fifo[i][0] = fifo[i+1][0]; + fifo[i][1] = fifo[i+1][1]; + fifo[i][2] = fifo[i+1][2]; + } + + // Calculate each blizzard's position at currTime + 1 + if (blizzard_history_count < currTime + 1) { + for (int j = 0; j < blizzard_count; j++) { + int newX, newY; + if (moves[blizzards[j].dir][0] >= 0) { + newX = 1 + ((blizzards[j].startPos[0] + (currTime+1) * (moves[blizzards[j].dir][0]) - 1) % (x-2)); + } else { + newX = (x-2) - (((x-2) - blizzards[j].startPos[0] + (currTime+1) * abs(moves[blizzards[j].dir][0])) % (x-2)); + } + if (moves[blizzards[j].dir][1] >= 0) { + newY = 1 + ((blizzards[j].startPos[1] + (currTime+1) * (moves[blizzards[j].dir][1]) - 1) % (y-2)); + } else { + newY = (y-2) - (((y-2) - blizzards[j].startPos[1] + (currTime+1) * abs(moves[blizzards[j].dir][1])) % (y-2)); + } + blizzardMap[currTime+1][newX][newY] = 1; + } + blizzard_history_count++; + } + + // Check each direction from position + for (int i = 0; i < 5; i++) { + int xp = currPos[0] + moves[i][0]; + int yp = currPos[1] + moves[i][1]; + + // Hitting a wall or walking off the map is not healthy + if (yp == y || map[xp][yp] == 1) { + continue; + } + + // We cannot step on a tile where there will be a blizzard + // the next round + if (blizzardMap[currTime+1][xp][yp]) { + continue; + } + + // Stepping back to the entry point is pointless + if (xp == endPos[0] && yp == endPos[1] && i != 4) { + continue; + } + + // There's no need to check the same position twice in the same round + int inFifo = 0; + for (int j = 0; j < fifo_count; j++) { + if (fifo[j][0] == xp && fifo[j][1] == yp && fifo[j][2] == currTime + 1) { + inFifo = 1; + break; + } + } + if (inFifo) { + continue; + } + + fifo[fifo_count][0] = xp; + fifo[fifo_count][1] = yp; + fifo[fifo_count][2] = currTime + 1; + fifo_count++; + } + } + printf("To the start: %i\n", times[1]); + + fifo_count = 0; + + fifo[0][0] = startPos[0]; + fifo[0][1] = startPos[1]; + fifo[0][2] = times[1]; + fifo_count++; + for (;;) { + if (fifo_count == 0) { + printf("PROBLEM\n"); + break; + } + // Pop next element from FIFO + int currPos[2], currTime; + currPos[0] = fifo[0][0]; + currPos[1] = fifo[0][1]; + currTime = fifo[0][2]; + + fifo_count--; + if (currPos[0] == endPos[0] && currPos[1] == endPos[1]) { + times[2] = currTime; + break; + } + + // Shift back elements + for (int i = 0; i < fifo_count; i++) { + fifo[i][0] = fifo[i+1][0]; + fifo[i][1] = fifo[i+1][1]; + fifo[i][2] = fifo[i+1][2]; + } + + // Calculate each blizzard's position at currTime + 1 + if (blizzard_history_count < currTime + 1) { + for (int j = 0; j < blizzard_count; j++) { + int newX, newY; + if (moves[blizzards[j].dir][0] >= 0) { + newX = 1 + ((blizzards[j].startPos[0] + (currTime+1) * (moves[blizzards[j].dir][0]) - 1) % (x-2)); + } else { + newX = (x-2) - (((x-2) - blizzards[j].startPos[0] + (currTime+1) * abs(moves[blizzards[j].dir][0])) % (x-2)); + } + if (moves[blizzards[j].dir][1] >= 0) { + newY = 1 + ((blizzards[j].startPos[1] + (currTime+1) * (moves[blizzards[j].dir][1]) - 1) % (y-2)); + } else { + newY = (y-2) - (((y-2) - blizzards[j].startPos[1] + (currTime+1) * abs(moves[blizzards[j].dir][1])) % (y-2)); + } + blizzardMap[currTime+1][newX][newY] = 1; + } + blizzard_history_count++; + } + + // Check each direction from position + for (int i = 0; i < 5; i++) { + int xp = currPos[0] + moves[i][0]; + int yp = currPos[1] + moves[i][1]; + + // Hitting a wall or walking off the map is not healthy + if (yp < 0 || map[xp][yp] == 1) { + continue; + } + + // We cannot step on a tile where there will be a blizzard + // the next round + if (blizzardMap[currTime+1][xp][yp]) { + continue; + } + + // Stepping back to the entry point is pointless + if (xp == startPos[0] && yp == startPos[1] && i != 4) { + continue; + } + + // There's no need to check the same position twice in the same round + int inFifo = 0; + for (int j = 0; j < fifo_count; j++) { + if (fifo[j][0] == xp && fifo[j][1] == yp && fifo[j][2] == currTime + 1) { + inFifo = 1; + break; + } + } + if (inFifo) { + continue; + } + + fifo[fifo_count][0] = xp; + fifo[fifo_count][1] = yp; + fifo[fifo_count][2] = currTime + 1; + fifo_count++; + } + } + printf("Back to the end: %i\n", times[2]); + for (int i = 0; i < MAX_BLIZZARDS_HISTORY; i++) { + for (int j = 0; j < x; j++) { + free(blizzardMap[i][j]); + } + free(blizzardMap[i]); + } + free(blizzardMap); + free(fifo); +} + +int dist(int one[2], int two[2]) { + return abs(one[0] - two[0]) + abs(one[1] - two[1]); +} diff --git a/day24/input.txt b/day24/input.txt new file mode 100644 index 0000000..825f663 --- /dev/null +++ b/day24/input.txt @@ -0,0 +1,27 @@ +#.######################################################################################################################## +#<..<^>vv^.>>>^.>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>^^>>^v><<<<<^<^v><.v<.>..<>.>^v^^^.>^^><^v^^v<<....>^>v><<>v>^>^>v^^v><# +#<^>^>v>.<^<.v<<<>^>vv^<vvv<^vv^v^<>vv^<><<>v<>v.vvv.>>v^>><<<>^^v><^^v^^v^^v>>v><<.>^vv.^<# +#>>^><>.>>><><.<>v><<><>vvvv>^><>vv^>^<>^<>^^>><^^>.vvv^<^><^.>vvvv>^.vv<^><^.^vvv<<# +#<>^.v.<^.v<>^^^^^>><^<..v<^v<>>.>>^><^v<^^v^>v^<.<^<.><^^<>^v^><.<>..^>v^.v>.^<><>^.^v><>>>>^.<# +#><^>^<^.^<^.vv>.>v^<.>.<>.v<>>v^><><<<<^vv<<.v^<>><.^<^..^^>.v^<<<>^.v^<>^<.^<<>><# +#<>vvv.v.<^<>^v.v><^^.>^>^<^v.v>>v<^^^<^<^^v.^.><<<>.<<>>^>>^<>.^>v<^.v.vv^v^^^..>.v<.vv<>.>>>>.^><><# +#<>v.^><<<<>>.<<^v>.>v^<>^v>^>>.v.>>^.v^^^><^<<<^^.^v^^>^vv<<>>>.><.^^<<^^<<.<<><^<^^.v><# +#>>><v>^v<^^v^vv><^.v..v.v.>vv><<^...><^v>>^<><>^>>^>^^<>>>.<^^>.v^^^.><>v<>.<# +#><^^^v<><<<^v>^^>^<<>>.<^^vvv<<>^v^<.<>^v^..v>v<.<^^v><^<<<^v.><>vv><^vvv>^v^.^<.>vvvvv<>><># +#>^<>^v^^v<^vvvvv^v.<<>v>>>^<^^<..>^<^<^.>v<>^>^>><>v.vvv.^^v.^^>^<>>^^v<>v<<<^^.>>^>>^>.>>><><>^^^>>^>><<^^^>>v<>>>>^v<^^>.><<^>^^^<.<>v<^><><>>>v>.>.>vv>.v<.<^^>>vv^v>>vv># +#>>.>.vv>^>><^>^.^v>^v<>..<>^^.>..vv<^v>>^.vvv>>^^^vv^^v>^<^.><<v^<<>><^v>>^>^^.v^<^^<>><># +#<^>^>v<^.v^vv^^v>^^v>v^^vv^v^vv>^.><.v<.<><>v^<><<<<>.v^v^<<>^<<>>>>>><.^^^<><<>^v^^# +#.<^^>>v<^^<^>>>>.vvv^>^^><^><.<>v^^vv^v<^>>^<.>^>><^<^><<..v># +#<.>>^.v^.^.v^v<>v>v>v^vv^^<^<<>^^><<><.v<>>^>vv^^>>v<><^^<>^v<vv.vvv>v<.^v^.^><>v>>vvv># +#<>^.v<^v>>>v>v<>^>v^vv<^<.^v.vv^>.v..>>.>vv>>>v^.^^>>^>>><><><>v>>..<^.>^v<^^v^<>>>.^^<^<.v>^>vvv># +#<^.v^<><<..^^vv>>>^vv.>^<>v^v^v^.>^<^<.>>^v><^^v>>^<<<..v<^>v>^vv>^vv^>^v.>>^<<^^>.>>^>^>^^vv.<^v^>>>.>>><^>>v^^^.vv.<<^v^.>v>><^>v.v><^<<>v>v^vv.v<.><><>.^v>.>>>^<>.^>^>v.^v^>v^<><.<<<^<^><^^^<# +#>^<>v>v>.>><>.><..vvvv<>vv<<^^v<>v><^<><<^v>^v<<.<<^^<.v>.<<<>vvv.v>>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>>vv>^.v<>^># +#.>^.v<.>>^<><^>v><.<>>^^vv^.<.>.v>>v.>^><<..v<>v>v>>v><>v^^<^>^<<>^.<<^>v.>v^>vv<>># +#<><.^^^^<>>.<^v.>^<<>v>.>>vv^^<>v^v<^.<.v^v>>>>^><^vvv.>>>v<<<.^^.v.^v.><<.v<>>>^.^v>^vvv.<>v^<^v^<^v<^<><^^^v^<# +########################################################################################################################.#