From cbb5c040cd1ba56020740f94c765bec6f37d458c Mon Sep 17 00:00:00 2001 From: dobiadi Date: Sat, 24 Dec 2022 12:53:46 +0100 Subject: [PATCH] Day23 --- day23/ants | Bin 0 -> 21008 bytes day23/ants.c | 228 ++++++++++++++++++++++++++++++++++++++++++++++++ day23/input.txt | 75 ++++++++++++++++ 3 files changed, 303 insertions(+) create mode 100755 day23/ants create mode 100644 day23/ants.c create mode 100644 day23/input.txt diff --git a/day23/ants b/day23/ants new file mode 100755 index 0000000000000000000000000000000000000000..0a8a284d28146f629f95be0e600ceaaf19c1fbbd GIT binary patch literal 21008 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 AJOBUy literal 0 HcmV?d00001 diff --git a/day23/ants.c b/day23/ants.c new file mode 100644 index 0000000..68e8d0f --- /dev/null +++ b/day23/ants.c @@ -0,0 +1,228 @@ +#include +#include +#include + +#define BUFFER_SIZE 256 +#define MAP_MAX_SIZE 1024 +#define MAX_ELVES 4*1024 +#define ROUNDS 10000 + +typedef struct elf { + int position[2]; + int nextPosition[2]; +} ELF; + +typedef struct linkedDirection { + int (*dir)[2]; + struct linkedDirection *next; + char name[16]; +} LINKEDDIRECTION; + +int directions[4][3][2] = { + {{0, -1}, {1, -1}, {-1, -1}}, + {{0, 1}, {-1, 1}, {1, 1}}, + {{-1, 0}, {-1, -1}, {-1, 1}}, + {{1, 0}, {1, -1}, {1, 1}} +}; + +int main() { + char buf[BUFFER_SIZE], *p, c; + memset(buf, 0, BUFFER_SIZE); + p = buf; + int y = 0, x = 0; + ELF elves[MAX_ELVES]; + int elf_count = 0; + + while ((c = getchar()) != EOF) { + *p++ = c; + if (c == '\n') { + p = buf; + while (*p != '\n' && *p != EOF) { + if ((p-buf+1) > x) x = (p-buf+1); + if (*p == '#') { + elves[elf_count].position[0] = (p-buf); + elves[elf_count].position[1] = y; + elf_count++; + } + p++; + } + y++; + memset(buf, 0, BUFFER_SIZE); + p = buf; + } + } + + // Set up a circular direction list + LINKEDDIRECTION dirs[4]; + dirs[0].dir = directions[0]; + sprintf(dirs[0].name, "NORTH"); + dirs[0].next = &dirs[1]; + dirs[1].dir = directions[1]; + sprintf(dirs[1].name, "SOUTH"); + dirs[1].next = &dirs[2]; + dirs[2].dir = directions[2]; + sprintf(dirs[2].name, "WEST"); + dirs[2].next = &dirs[3]; + dirs[3].dir = directions[3]; + sprintf(dirs[3].name, "EAST"); + dirs[3].next = &dirs[0]; + + LINKEDDIRECTION *curr = &dirs[0]; + + // Put each elf on a map + int **map; + map = (int **)malloc(MAP_MAX_SIZE * sizeof(int*)); + for (int i = 0; i < MAP_MAX_SIZE; i++) { + map[i] = (int*)malloc(MAP_MAX_SIZE * sizeof(int)); + memset(map[i], 0, MAP_MAX_SIZE * sizeof(int)); + } + + int ref[2]; + ref[0] = (MAP_MAX_SIZE - x)/2; + ref[1] = (MAP_MAX_SIZE - y)/2; + for (int i = 0; i < elf_count; i++) { + map[elves[i].position[0]+ref[0]][elves[i].position[1]+ref[1]] = 1; + } + + int izegmozog = 1; + // Simulate 10 rounds + for (int i = 0; i < ROUNDS; i++) { + // DEBUG +// int minX = elves[0].position[0], maxX = elves[0].position[0], minY = elves[0].position[1], maxY = elves[0].position[1]; +// +// for (int i = 0; i < elf_count; i++) { +// if (minX > elves[i].position[0]) { +// minX = elves[i].position[0]; +// } +// if (maxX < elves[i].position[0]) { +// maxX = elves[i].position[0]; +// } +// if (minY > elves[i].position[1]) { +// minY = elves[i].position[1]; +// } +// if (maxY < elves[i].position[1]) { +// maxY = elves[i].position[1]; +// } +// } +// +// printf("%i,%i %i,%i\n", minX, minY, maxX, maxY); +// for (int i = minY - 1; i <= maxY + 1; i++) { +// for (int j = minX - 1; j <= maxX + 1; j++) { +// if (map[j+ref[0]][i+ref[1]] == 1) { +// printf("#"); +// } else { +// printf("."); +// } +// } +// printf("\n"); +// } + // DEBUG END + int **moveMap; + moveMap = (int **)malloc(MAP_MAX_SIZE * sizeof(int*)); + for (int i = 0; i < MAP_MAX_SIZE; i++) { + moveMap[i] = (int*)malloc(MAP_MAX_SIZE * sizeof(int)); + memset(moveMap[i], 0, MAP_MAX_SIZE * sizeof(int)); + } + + // PLANNING PHASE + // Each elf + for (int j = 0; j < elf_count; j++) { + // Scan each direction + LINKEDDIRECTION dirr = *curr; + int openDirections = 0; + int firstOpen[2] = {-9999, -9999}; + for (int k = 0; k < 4; k++) { + int open = 1; + for (int l = 0; l < 3; l++) { + if (map[elves[j].position[0]+ref[0]+dirr.dir[l][0]][elves[j].position[1]+ref[1]+dirr.dir[l][1]] == 1) { + open = 0; + break; + } + } + if (open) { + if (firstOpen[0] == -9999 && firstOpen[1] == -9999) { + firstOpen[0] = elves[j].position[0]+dirr.dir[0][0]; + firstOpen[1] = elves[j].position[1]+dirr.dir[0][1]; + } + openDirections++; + } + dirr = *dirr.next; + } + if (openDirections == 4 || openDirections == 0) { + // No need to move/Can't move + elves[j].nextPosition[0] = elves[j].position[0]; + elves[j].nextPosition[1] = elves[j].position[1]; + } else { + elves[j].nextPosition[0] = firstOpen[0]; + elves[j].nextPosition[1] = firstOpen[1]; + } + moveMap[elves[j].nextPosition[0]+ref[0]][elves[j].nextPosition[1]+ref[1]]++; + } + + izegmozog = 0; + // MOVE PHASE + for (int j = 0; j < elf_count; j++) { + // Should I stay or should I go? + if (moveMap[elves[j].nextPosition[0]+ref[0]][elves[j].nextPosition[1]+ref[1]] != 1) { + continue; + } + + if (elves[j].position[0] != elves[j].nextPosition[0] || elves[j].position[1] != elves[j].nextPosition[1]) { + izegmozog = 1; + } + // Remove from old position on the map + map[elves[j].position[0]+ref[0]][elves[j].position[1]+ref[1]] = 0; + + // Add on new position + map[elves[j].nextPosition[0]+ref[0]][elves[j].nextPosition[1]+ref[1]] = 1; + + // Change elf data + elves[j].position[0] = elves[j].nextPosition[0]; + elves[j].position[1] = elves[j].nextPosition[1]; + } + + for (int j = 0; j < MAP_MAX_SIZE; j++) { + free(moveMap[j]); + } + free(moveMap); + + curr = curr->next; + + if (!izegmozog) { + printf("Rounds to stabilize: %i\n", i+1); + break; + } + } + + int minX = elves[0].position[0], maxX = elves[0].position[0], minY = elves[0].position[1], maxY = elves[0].position[1]; + + for (int i = 0; i < elf_count; i++) { + if (minX > elves[i].position[0]) { + minX = elves[i].position[0]; + } + if (maxX < elves[i].position[0]) { + maxX = elves[i].position[0]; + } + if (minY > elves[i].position[1]) { + minY = elves[i].position[1]; + } + if (maxY < elves[i].position[1]) { + maxY = elves[i].position[1]; + } + } + + int sum = 0; + for (int i = minY; i <= maxY; i++) { + for (int j = minX; j <= maxX; j++) { + if (map[j+ref[0]][i+ref[1]] != 1) { + sum++; + } + } + } + printf("Rectangle empty spaces after round %i: %i\n", ROUNDS, sum); + + for (int i = 0; i < MAP_MAX_SIZE; i++) { + free(map[i]); + } + free(map); +} diff --git a/day23/input.txt b/day23/input.txt new file mode 100644 index 0000000..44cae66 --- /dev/null +++ b/day23/input.txt @@ -0,0 +1,75 @@ +..###.#####....####.......###.####.#.....##..#.##.....#.##..#.#.........#.# +.##...#.##...#.##.######.######.#######.#####.#..##...#..#....#.#.#.#...#.. +#.#.#......#.#..#...#..###..###.#####..#####.#.....##.#.#...##.#.###..#..## +#..##...#####..##...#.##.#.##..##..#...#.###.###..##..####.####.#..#...##.. +#.#...#..#.#####..#####..##.##...#....#.###.....##.#..###....#.#.##..#####. +#.#..#.#.#..#....#...#..##.#.##...#####.#..###..#.#.#.##...#.##.#.##..#..#. +#.####..#...####..........##.#.#....#.#.#...###.#......#.######.#..##.###.. +######...#.#.######.........#.##..####.##..#.#.##....##.#.##.#.#..##.##...# +.##.#.#.###..#.#.##.#..###..##..##.#.###...#..###..#..###.####...###.##.#.. +#.#..#.....##.#.#..##...##..####.####...##..#....##.##.#....#.#..#.#.#..### +..#.###..#..######.##..#.#..#.#..#.#####.##.####...##.#....#.####....##.##. +.......#.###..#.##.#.##....#....#.#...##....####..#.#.#...###.##..#.#.#.### +.####.####..#..##...##...##.####.#.#.#.#.####..##..###.##...##.##....##..#. +###..##.###..###...###....###....####...#..#######....#.#.#.#....###..##..# +##.###..######....#.##..####..#...##..#.#...#..#..#.#.#.#..#.###.###.###### +#....#.#....#.#...####...#.#..##...##.#..#..#.#############....#.###....#.. +#..##.#######.#..###...##...#...####.#.####.....#.....#...##.#.####.##.#.## +#.#.#..###.######.#.###.#.#####.........##....###.#####..###.#.####.#..###. +####.#.#..#.####....#######...###.#.#####.#..#.....###.#.###..#.#..###..### +##..#.#..#.....###.####..###.#...##.#....#..#..#.##....#..#.#...#.#.###..#. +########..#.....##.##.####..#####....##.#.####.###.....#.......###.##....#. +#..#.#######..#...###..#.###..###...##..#.###.##..###..#......##.###..##..# +##..###.#..#.###...##..##.#.#...#.###.##.###.#..#..#...###..#.#####..##.... +##.#.#...#.#..#.#.###....#.#.#.#..#..#.###..#..#.#..##.#####.#..##.######.. +##..#####..........##.##...#.....#..##.#####..##.##.#..#..#####....##...### +#..###.#.##.##..##...######..#.###..#.#.#..###.###.####.##.##.#...##..####. +#.###..###..##.#####..####.....##.#.....#..#.#...#..####.#.######.##.#.#..# +.##....#.#.##...#.#.#...##..#.....#...##..##..####.#..####.##.#.#.#..#.###. +########..#.#.#...#...##...##....##..#.....#.......##..#.#######.##.#....## +.#..#...##.#.##..##.#..#..#.#####.#.#.#..#.....##.##.....##.#.##.##.#.#.### +#..####.##.###..#...#..#.##.#########.#######...#...#..##..#.....###..#..## +##....###..#.#....##...##.####.######..####....###....########..##...###..# +.##...##.#.#.##..###.##.###..#.#..#......#######..#..##....#....###.##..#.. +##..###...###..#.###.#.##.###.#...#.#.#.####.#.####..#.#..###..#####...#### +#####...######.#.#..##.#.###.#.#.#...###......#.#..##..#..##...##.######### +#..#.##.....#.#####.##.....#.#..#.###.#..##.##..##..##..##..#.#..#..##.#### +..###.#...#.##...##.#.....#.#####..#.#..#...#.####...#.#####.#######..#.### +..#.##..#.#..#.###.##..#...#.#....##.....#..#.#...#.##..###.###.##..###..#. +..#.#.#..#....#.#..##..#......#..#...#####.##.....#.##..##.#####.#.#...#... +.#..#.....########......##.####..#..#...##.#.###...#.#...##..#####.#..##... +#..#.#.##.#......##.#......#..####.###....#.#.##..##.....#.#.##.#####..##.# +...#...###...####..#.#.#......#.#..#..##.##..###.#...#.###..#..#...###.###. +##.##.#.........#..#..#....#..#......##.#.######.#..#.#...##.#.##..#..#..#. +.#.##..####.#..##.##....#....###...##..#.#..#.#.##.####...##..#..####....#. +.....##.#..##.#.###.....####..###.##.###.....##..##...#.#..#.##..#.##.#.#.# +##.##.#.#..........#..#.####.#..##.#..#.#.###....###.###.#.##.###.#.....#.. +#..#.#.##.##..##.###..###..#.#..#..##.....#......#####.#..###.#.#.....####. +.##....###..##...#..#.######.####..#.##....#..##.#..####..##....#.....#.##. +..#.#.##....#...#.#..#.....#...###.#.#.#####...####.###.##...###.###.#.##.. +#..###.#...##.#.#.#.#..#.#..#.##...#######....#.####.####.##.#######..##### +..#..#.####...#....#...#......#...#..##.#...#...#######..#..#.#####.###..## +.#.#.###...##.###....#.....####.##.####...#...........###..##...####.#..##. +.###.####.#..#....###.#.##.#.#####..#.#######.#..##.#.###...#.#..####.#.#.. +..###.#....###.#.....###.#####.#.##.#..###.####.....#..#..#..##.....##.#.## +##.##.##...#....##..###.##.#...#......#.....##.#....#.#...##..##...#..####. +.###.....#....##..#####.##..#.#.....#..###..#####.#.#...##..##....#.###.#.. +.##..####..#....##.#####.#.#..#.#.#.##.#..#.#....###.##.###..#....######.#. +#.###..#...##.##...####..##....#.##..###.....#.....#..##.#...###..###.....# +..#.#.##...##.##.##..#.#.##.##...##..#.###.#...######.....#.....#.....#.##. +#.#.#.##.#.#.##.###...####...####..#.....###.#..###.....#..##.#...#.###..## +#..###.##.#####..#.##...#..###.#.#.#.#....##...###.#..#####.#......##..#.#. +##.#.##...##.#####...#...#.#...#..##.##.#...#.###..##...##..##.#..##.#.###. +....####....##..#....##.#...##.#.....##.####.#..#......#.##.##....#.#..#.## +#.#.#####.##...#..#.#....#.####..#####....#.###..######..##....####..#.#### +.##.#...##..####.#....##..##....#....##.#.#....#....#.##......##....#...#.# +####..#..#.#.#.#.#..###.###.##..##..#..#.####...##.#..####.........#..#.#.. +.##...#..###.#.#.#.#.###.#.#.#########........###.#.#..#.....####..#..#.#.# +##..###..#.##......#.#.....#....#....#..#####.#.####..###.#.###....#.##.#.. +#.#.#.##...#.....#.#..###.#..######.#..##.#.###..#.####..###.#....##.####.. +.##...#..#..###.###.........##....##...#.###..#..#.#.#.#.#.###......##..##. +.##.##.##..#.######..#.##..##.#...#.##.#..###.#....#..#####.##..#..#.###... +..####.##.#..#..##..##...####.######.##.#.....##.#....#....###.##.##....### +.##......#.....#.#..#.#.##....#.#.#.####...#...##...##...#.##.#.#.#.##...## +.##.#######..#.#..#.#..##..#.#....##...#####...##..#.......##...##..##..#.# +#...#.#..#.###.#.##....##..#...#.#..##.###.......##.#.....######..#########