From d07adb1b15e8f03180d4be18723e2366f1baa495 Mon Sep 17 00:00:00 2001 From: dobiadi <50926840+dobiadi@users.noreply.github.com> Date: Tue, 19 Dec 2023 19:21:17 +0100 Subject: [PATCH] Day16 C --- day16/c/day16 | Bin 0 -> 16384 bytes day16/c/day16.c | 208 +++++++++++++++++++++++++++++++++++++++++++++++ day16/input.txt | 110 +++++++++++++++++++++++++ day16/sample.txt | 10 +++ 4 files changed, 328 insertions(+) create mode 100755 day16/c/day16 create mode 100644 day16/c/day16.c create mode 100644 day16/input.txt create mode 100644 day16/sample.txt diff --git a/day16/c/day16 b/day16/c/day16 new file mode 100755 index 0000000000000000000000000000000000000000..a2eb06983f8228772f3b2ae3bf9011f010e8e80e GIT binary patch literal 16384 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 +#include +#include + +#define LINE_MAX_LENGTH 256 + +typedef enum tile_type { + EMPTY, + MIRROR_LEFT_TO_UP, + MIRROR_LEFT_TO_DOWN, + SPLITTER_VERTICAL, + SPLITTER_HORIZONTAL, +} tile_type_t; + +typedef enum light_direction { + LEFT_TO_RIGHT, + RIGHT_TO_LEFT, + UP_TO_DOWN, + DOWN_TO_UP, +} light_direction_t; + +typedef struct tile { + tile_type_t type; + light_direction_t lights[4]; + int lights_num; +} tile_t; + +void traverse_light(tile_t map[LINE_MAX_LENGTH][LINE_MAX_LENGTH], int x, int y, int entry_x, int entry_y, int dir[2]); +int has_light(tile_t map[LINE_MAX_LENGTH][LINE_MAX_LENGTH], int x, int y, light_direction_t direction, int max_x, int max_y); +light_direction_t dir_to_direction(int dir[2]); +int count_energized(tile_t map[LINE_MAX_LENGTH][LINE_MAX_LENGTH], int x, int y); + +int main() { + char *p, *buf, c; + + buf = (char *)malloc(LINE_MAX_LENGTH); + memset(buf, 0, LINE_MAX_LENGTH); + p = buf; + + tile_t map[LINE_MAX_LENGTH][LINE_MAX_LENGTH]; + memset(map, 0, LINE_MAX_LENGTH * LINE_MAX_LENGTH * sizeof(tile_t)); + int x = 0, y = 0; + + while ((c = getchar()) != EOF) { + *p++ = c; + if (c == '\n') { + p = buf; + x = 0; + + while (*p != '\n') { + switch (*p) { + case '.': + map[x][y].type = EMPTY; + break; + case '/': + map[x][y].type = MIRROR_LEFT_TO_UP; + break; + case '\\': + map[x][y].type = MIRROR_LEFT_TO_DOWN; + break; + case '|': + map[x][y].type = SPLITTER_VERTICAL; + break; + case '-': + map[x][y].type = SPLITTER_HORIZONTAL; + break; + } + x++; + p++; + } + y++; + memset(buf, 0, LINE_MAX_LENGTH); + p = buf; + } + } + + tile_t map_cpy[LINE_MAX_LENGTH][LINE_MAX_LENGTH]; + memcpy(map_cpy, map, LINE_MAX_LENGTH * LINE_MAX_LENGTH * sizeof(tile_t)); + + int dir[2] = {1, 0}; + traverse_light(map_cpy, x, y, -1, 0, dir); + int part1 = count_energized(map_cpy, x, y); + + int max_energized = 0, energized; + // LEFT COLUMN + for (int i = 0; i < y; i++) { + dir[0] = 1; + dir[1] = 0; + memcpy(map_cpy, map, LINE_MAX_LENGTH * LINE_MAX_LENGTH * sizeof(tile_t)); + traverse_light(map_cpy, x, y, -1, i, dir); + energized = count_energized(map_cpy, x, y); + + if (energized > max_energized) { + max_energized = energized; + } + } + // RIGHT COLUMN + for (int i = 0; i < y; i++) { + dir[0] = -1; + dir[1] = 0; + memcpy(map_cpy, map, LINE_MAX_LENGTH * LINE_MAX_LENGTH * sizeof(tile_t)); + traverse_light(map_cpy, x, y, x, i, dir); + energized = count_energized(map_cpy, x, y); + + if (energized > max_energized) { + max_energized = energized; + } + } + // TOP ROW + for (int i = 0; i < x; i++) { + dir[0] = 0; + dir[1] = 1; + memcpy(map_cpy, map, LINE_MAX_LENGTH * LINE_MAX_LENGTH * sizeof(tile_t)); + traverse_light(map_cpy, x, y, i, -1, dir); + energized = count_energized(map_cpy, x, y); + + if (energized > max_energized) { + max_energized = energized; + } + } + // BOTTOM ROW + for (int i = 0; i < x; i++) { + dir[0] = 0; + dir[1] = -1; + memcpy(map_cpy, map, LINE_MAX_LENGTH * LINE_MAX_LENGTH * sizeof(tile_t)); + traverse_light(map_cpy, x, y, i, y, dir); + energized = count_energized(map_cpy, x, y); + + if (energized > max_energized) { + max_energized = energized; + } + } + + printf("%i\n", part1); + printf("%i\n", max_energized); + free(buf); +} + +void traverse_light(tile_t map[LINE_MAX_LENGTH][LINE_MAX_LENGTH], int x, int y, int entry_x, int entry_y, int dir[2]) { + light_direction_t curr_direction = dir_to_direction(dir); + + int curr_x = entry_x, curr_y = entry_y; + + while (!has_light(map, curr_x + dir[0], curr_y + dir[1], curr_direction, x - 1, y - 1)) { + curr_x += dir[0]; + curr_y += dir[1]; + map[curr_x][curr_y].lights[map[curr_x][curr_y].lights_num] = curr_direction; + map[curr_x][curr_y].lights_num++; + + if (map[curr_x][curr_y].type == MIRROR_LEFT_TO_UP) { + int tmp = dir[0]; + dir[0] = -dir[1]; + dir[1] = -tmp; + } else if (map[curr_x][curr_y].type == MIRROR_LEFT_TO_DOWN) { + int tmp = dir[0]; + dir[0] = dir[1]; + dir[1] = tmp; + } else if (map[curr_x][curr_y].type == SPLITTER_HORIZONTAL && dir[1] != 0) { + dir[0] = 1; + dir[1] = 0; + int recurse_dir[2] = {-1, 0}; + traverse_light(map, x, y, curr_x, curr_y, recurse_dir); + } else if (map[curr_x][curr_y].type == SPLITTER_VERTICAL && dir[0] != 0) { + dir[0] = 0; + dir[1] = 1; + int recurse_dir[2] = {0, -1}; + traverse_light(map, x, y, curr_x, curr_y, recurse_dir); + } + curr_direction = dir_to_direction(dir); + } +} + +int has_light(tile_t map[LINE_MAX_LENGTH][LINE_MAX_LENGTH], int x, int y, light_direction_t direction, int max_x, int max_y) { + if (x < 0 || y < 0 || x > max_x || y > max_y) { + return 1; + } + for (int i = 0; i < map[x][y].lights_num; i++) { + if (map[x][y].lights[i] == direction) { + return 1; + } + } + + return 0; +} + +light_direction_t dir_to_direction(int dir[2]) { + if (dir[0] == 1) { + return LEFT_TO_RIGHT; + } else if (dir[0] == -1) { + return RIGHT_TO_LEFT; + } else if (dir[1] == 1) { + return UP_TO_DOWN; + } + return DOWN_TO_UP; +} + +int count_energized(tile_t map[LINE_MAX_LENGTH][LINE_MAX_LENGTH], int x, int y) { + int sum = 0; + for (int i = 0; i < y; i++) { + for (int j = 0; j < x; j++) { + if (map[j][i].lights_num > 0) { + sum++; + } + } + } + + return sum; +} diff --git a/day16/input.txt b/day16/input.txt new file mode 100644 index 0000000..7d09cdb --- /dev/null +++ b/day16/input.txt @@ -0,0 +1,110 @@ +\.............\................\....\..../....\/...............................\...-..........-.\.-....../.... +|\......../|....\..............-\............./...........................-..........-......\........\........ +.......||......../....-./.../-...|.|..-......-.|....../................\............|...................-..|.. +........./......-.............-\......................|.\./.......|........./......-......../..-.........|.... +....../....................-............................................../...../...|......................... +....................\....|/............................./.......-....|......../..........................\.... +.|....../|.........-......|.............\..|..................|......../.................|.|............-.|... +.....-............\\............\................/......-.........\................\..|../.................... +............|..|.......|......../................\.......................|../....../......./.....|............ +.\...........\..\.............../.........-/....|......................./.....-./-.........../-........-...... +|................\.\-.............../..-............./........./.................\.............|...-.....-.... +.........-....|..|......................................\.||...-../..|............../...../.../.........-..... +.....-....-\.................|...........|../.....\...............................|...../../|................. +.\......\......................\....../.../.....-.../.........................../..|...........|..\........... +-............|.........-.-........-.........................|...\...-...........\.|...-....../..........|..... +.........-.......|......\.....\..-...../..../.....\.../............/..........-......./....../...........\.../ +..............\........................|.............................-../......-..-...../..................\.. +.....\......-.......-.......-......../../../........\.......-..........|......./........................../... +.\...\...................|./\|.-..\...............................\..\.....-....|......................./..... +.................-...|....|.../...../.|.||.....-.|............................-..............\................ +........................................../.......................|........\......../.../..............|.....\ +.......\......./............................./........../../..........................-\..................|... +...........-...|..\..........-.........\.................././................|./.......|............../....... +......./..................................\...-.........\........\....../............................\......\- +-.|..-|...............|..........................\..........|.-.........\............-.|.............\.....|.. +.............................../..............-.....-.......-........................|.......-................ +.........\.........-.........|...../......../......./....-...\...................\........\................... +..........\.........\........../...|.................|./...\.......\..........-............................... +./...................|........../\......../....................|..-...........\...\...........|..............| +.....|...........\-.\.......-..........................-....-...................|....|.|...............-...... +.|.././......................|.......|.......|..............\...../.................../.\...-................. +...........-........./....|.................|..-.....-............./...................................-..../. +...................\/..|.....-............../-......-..........|........................./...\....-|....|-.... +........................./..-..|.\-...............-......-/...../.......\..|................-...\.|.....\..... +\...../.........................../....................-..........|........../..-..-.......\........../.././|. +........................../...\|..................................................../...|.-........-.....|..\. +....\.............................|./.....|...../....\.............\...../.......-...............\..-..../.... +.........-.........................|................|........\/.\-...................\..-......./../.......... +...-.../............/.................-..........\....../............../...../..........|..................... +..........\...\..................|...-......\\......./...-.............-\.................|...../......\...... +/..\/.............\....\.............\.......................................|.....\....-............\........ +....../..\.|................................\.........../.......-.......-/.....|...................-.....-.... +........-....|.............................|....../...............\.......................--.................. +................/......|.........-....................-..............|.......................................| +.........\........|...........................\.............|.............................../................. +...|..\....-......../.\...-............................................................/....-...../........... +.............\\\.../...../.../..........\..............\...........\........................|....../.........\ +......-..............|..-..|....-\..\..-...-............\.................\...-.\/.....\......-.\....--.../... +........./...................../...../..|...\.\/.........\.../........................................\.../-.. +........\.......|.......|\..|........../..../\........../........\..../..............././..../.............-.\ +........................|-............|............................./.-.|...|............../....-\............ +../........-.../....................|....................-/.............../.....-...........-....\......||.... +.....\..|.....-|../....|./....-|.......-...../..-..\..............\...................../.................|... +...-......../.\...........\.........\../.....|............\..................../.........\................/.\/ +...../...|............-..\.../............/............-..............--.-..........././............-........| +.....|...........\.....-...\..../.....-........-.....\.|..............\....-............./...../.............. +....\.....-.|....\..../..............\|../.........../......|....\/.......................|............|....-. +........|..--..............|..............-........|.......|.-.........\.............-...........\............ +./.||....\......./....\./........../...........././....\.................../..................\...../......... +.......|..\...-.\..\..|.........../..................................-....|........\......|....|.............. +...|..........|.........-...............|...............................-.......|...........-..\.......\...... +.\.........../../............................-..|...\.....-.........../......-|.../.....|.................-... +........|....../..\..\|..|......|.........|...............................\../.....\....-/........-........... +.................................................\.......|........|.\.-....../.......|.......|............\... +.......|.......\.......|.........|......-......|...|...\.............\.............|/......................... +..........|....................|..........\..........-......./................................................ +...../.......|....................|......................././................................................. +........\.............|........--..........\.............../......|...................../............|..\..... +....-............|.........|....|.-.\../-...\....-...-................\|..\-.......|........-............../.. +................/........\.....\.....././....|....................-...............\...........-......\........ +.\.....|......|...|\......\.\/....\.............-............\.....\.......-...-........-....//..../.....|..-. +..................|..|.-.................../\...........|..../..........\|.....-..|.../....................... +-......-......./........./../.............../..................-..\.......\............|...../../....../...... +....../............/...........\.............\............./.........../.......\......|....|.........../...... +...\........|..................|............-............-.....-..\..-................/........../........||.. +......../..|..-../..../......................../.........\./.-................../...................-......... +.../....|....\.......-..\..........-....\.............|\........../...............-........|.................. +..............\.............\|.........-......................-........\|......./.......-.................|... +/..../...-||\-...|\...............................\.......................\.............-................-.... +.......-..-....|..................|..............................................................///...-.../.| +......|.......-/........-.-......|....\..-...|...........\...........\.....................-..../.........../. +......-...........|-..\.......|...|.\|.................-....\...................\.\........\.\./.........\.... +....../............../.........|...|.......|..../............................................................. +.........../...................-./...\..........\-............./...........\.../.....|......................-. +/..../..../........................................|.\......-/......./....\.........................-......|.. +.\./.|.-..........................|...|...........|....../....-....../|...............\..............\...-.... +....|...\..........|......-..................|........../..|.-...\........./........|................|........ +...\....\........../........../.........\..............-...........................-.|...../..........\....... +...|...........-...........................\........-.........................\...-..-.....\.......|........-. +......\|...........................\.....................................-............/....\...........|...... +................../............-........................\.................................................-... +.../....|...............|....................../\.........|....................\....|............\.........|-. +.......................................|....-.........../....\-........|......./............-..|.............\ +/.........\..\.........|...............\.......\........./................\....................|.....|........ +..................................|.....|.-..|.../......................../-\......|.......................... +.................|.....................................................-............|.....|..../.\/..........| +.......\....\....-........|.|..../......-......\...../....................-...........\............-.......... +....-.................................-..........-......-................................../.........-\...|... +.....................|......................|.........-............../.../.....-........\..................... +.\./..........-.\...\||................./../........\.........|...\........\....\.\...............-|......|... +..\......//.........../.\........\......|......|........\......\.....-..........|.-..|...../|................. +/.....................\.................-........|...................\.....-..............-/.....\..|../../... +...|..-.../............./.|.................../............/..\...........-....|-............\.......--....... +..............\..\/.....\.........|.\.........................|............|........./................./-..|-. +...........................-.................../...................|\..........\/..|.-........................ +.....-.............................../....................\.........|......................|.................. +..................\.........../...........\..\/.........|...........|..-........|....\..........-...../.|..... +..........|.......\..\...........\.../......................-...........-.....-........../\|.................. +....../.......-........................\|...//...\..-......\.......|..\....................-..........\..-.... +|./....|........-./........../.\...\.....|../..../.......-........../.\.....-................................. diff --git a/day16/sample.txt b/day16/sample.txt new file mode 100644 index 0000000..d6805ce --- /dev/null +++ b/day16/sample.txt @@ -0,0 +1,10 @@ +.|...\.... +|.-.\..... +.....|-... +........|. +.......... +.........\ +..../.\\.. +.-.-/..|.. +.|....-|.\ +..//.|....