Day23
This commit is contained in:
BIN
day23/ants
Executable file
BIN
day23/ants
Executable file
Binary file not shown.
228
day23/ants.c
Normal file
228
day23/ants.c
Normal file
@@ -0,0 +1,228 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#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);
|
||||
}
|
||||
75
day23/input.txt
Normal file
75
day23/input.txt
Normal file
@@ -0,0 +1,75 @@
|
||||
..###.#####....####.......###.####.#.....##..#.##.....#.##..#.#.........#.#
|
||||
.##...#.##...#.##.######.######.#######.#####.#..##...#..#....#.#.#.#...#..
|
||||
#.#.#......#.#..#...#..###..###.#####..#####.#.....##.#.#...##.#.###..#..##
|
||||
#..##...#####..##...#.##.#.##..##..#...#.###.###..##..####.####.#..#...##..
|
||||
#.#...#..#.#####..#####..##.##...#....#.###.....##.#..###....#.#.##..#####.
|
||||
#.#..#.#.#..#....#...#..##.#.##...#####.#..###..#.#.#.##...#.##.#.##..#..#.
|
||||
#.####..#...####..........##.#.#....#.#.#...###.#......#.######.#..##.###..
|
||||
######...#.#.######.........#.##..####.##..#.#.##....##.#.##.#.#..##.##...#
|
||||
.##.#.#.###..#.#.##.#..###..##..##.#.###...#..###..#..###.####...###.##.#..
|
||||
#.#..#.....##.#.#..##...##..####.####...##..#....##.##.#....#.#..#.#.#..###
|
||||
..#.###..#..######.##..#.#..#.#..#.#####.##.####...##.#....#.####....##.##.
|
||||
.......#.###..#.##.#.##....#....#.#...##....####..#.#.#...###.##..#.#.#.###
|
||||
.####.####..#..##...##...##.####.#.#.#.#.####..##..###.##...##.##....##..#.
|
||||
###..##.###..###...###....###....####...#..#######....#.#.#.#....###..##..#
|
||||
##.###..######....#.##..####..#...##..#.#...#..#..#.#.#.#..#.###.###.######
|
||||
#....#.#....#.#...####...#.#..##...##.#..#..#.#############....#.###....#..
|
||||
#..##.#######.#..###...##...#...####.#.####.....#.....#...##.#.####.##.#.##
|
||||
#.#.#..###.######.#.###.#.#####.........##....###.#####..###.#.####.#..###.
|
||||
####.#.#..#.####....#######...###.#.#####.#..#.....###.#.###..#.#..###..###
|
||||
##..#.#..#.....###.####..###.#...##.#....#..#..#.##....#..#.#...#.#.###..#.
|
||||
########..#.....##.##.####..#####....##.#.####.###.....#.......###.##....#.
|
||||
#..#.#######..#...###..#.###..###...##..#.###.##..###..#......##.###..##..#
|
||||
##..###.#..#.###...##..##.#.#...#.###.##.###.#..#..#...###..#.#####..##....
|
||||
##.#.#...#.#..#.#.###....#.#.#.#..#..#.###..#..#.#..##.#####.#..##.######..
|
||||
##..#####..........##.##...#.....#..##.#####..##.##.#..#..#####....##...###
|
||||
#..###.#.##.##..##...######..#.###..#.#.#..###.###.####.##.##.#...##..####.
|
||||
#.###..###..##.#####..####.....##.#.....#..#.#...#..####.#.######.##.#.#..#
|
||||
.##....#.#.##...#.#.#...##..#.....#...##..##..####.#..####.##.#.#.#..#.###.
|
||||
########..#.#.#...#...##...##....##..#.....#.......##..#.#######.##.#....##
|
||||
.#..#...##.#.##..##.#..#..#.#####.#.#.#..#.....##.##.....##.#.##.##.#.#.###
|
||||
#..####.##.###..#...#..#.##.#########.#######...#...#..##..#.....###..#..##
|
||||
##....###..#.#....##...##.####.######..####....###....########..##...###..#
|
||||
.##...##.#.#.##..###.##.###..#.#..#......#######..#..##....#....###.##..#..
|
||||
##..###...###..#.###.#.##.###.#...#.#.#.####.#.####..#.#..###..#####...####
|
||||
#####...######.#.#..##.#.###.#.#.#...###......#.#..##..#..##...##.#########
|
||||
#..#.##.....#.#####.##.....#.#..#.###.#..##.##..##..##..##..#.#..#..##.####
|
||||
..###.#...#.##...##.#.....#.#####..#.#..#...#.####...#.#####.#######..#.###
|
||||
..#.##..#.#..#.###.##..#...#.#....##.....#..#.#...#.##..###.###.##..###..#.
|
||||
..#.#.#..#....#.#..##..#......#..#...#####.##.....#.##..##.#####.#.#...#...
|
||||
.#..#.....########......##.####..#..#...##.#.###...#.#...##..#####.#..##...
|
||||
#..#.#.##.#......##.#......#..####.###....#.#.##..##.....#.#.##.#####..##.#
|
||||
...#...###...####..#.#.#......#.#..#..##.##..###.#...#.###..#..#...###.###.
|
||||
##.##.#.........#..#..#....#..#......##.#.######.#..#.#...##.#.##..#..#..#.
|
||||
.#.##..####.#..##.##....#....###...##..#.#..#.#.##.####...##..#..####....#.
|
||||
.....##.#..##.#.###.....####..###.##.###.....##..##...#.#..#.##..#.##.#.#.#
|
||||
##.##.#.#..........#..#.####.#..##.#..#.#.###....###.###.#.##.###.#.....#..
|
||||
#..#.#.##.##..##.###..###..#.#..#..##.....#......#####.#..###.#.#.....####.
|
||||
.##....###..##...#..#.######.####..#.##....#..##.#..####..##....#.....#.##.
|
||||
..#.#.##....#...#.#..#.....#...###.#.#.#####...####.###.##...###.###.#.##..
|
||||
#..###.#...##.#.#.#.#..#.#..#.##...#######....#.####.####.##.#######..#####
|
||||
..#..#.####...#....#...#......#...#..##.#...#...#######..#..#.#####.###..##
|
||||
.#.#.###...##.###....#.....####.##.####...#...........###..##...####.#..##.
|
||||
.###.####.#..#....###.#.##.#.#####..#.#######.#..##.#.###...#.#..####.#.#..
|
||||
..###.#....###.#.....###.#####.#.##.#..###.####.....#..#..#..##.....##.#.##
|
||||
##.##.##...#....##..###.##.#...#......#.....##.#....#.#...##..##...#..####.
|
||||
.###.....#....##..#####.##..#.#.....#..###..#####.#.#...##..##....#.###.#..
|
||||
.##..####..#....##.#####.#.#..#.#.#.##.#..#.#....###.##.###..#....######.#.
|
||||
#.###..#...##.##...####..##....#.##..###.....#.....#..##.#...###..###.....#
|
||||
..#.#.##...##.##.##..#.#.##.##...##..#.###.#...######.....#.....#.....#.##.
|
||||
#.#.#.##.#.#.##.###...####...####..#.....###.#..###.....#..##.#...#.###..##
|
||||
#..###.##.#####..#.##...#..###.#.#.#.#....##...###.#..#####.#......##..#.#.
|
||||
##.#.##...##.#####...#...#.#...#..##.##.#...#.###..##...##..##.#..##.#.###.
|
||||
....####....##..#....##.#...##.#.....##.####.#..#......#.##.##....#.#..#.##
|
||||
#.#.#####.##...#..#.#....#.####..#####....#.###..######..##....####..#.####
|
||||
.##.#...##..####.#....##..##....#....##.#.#....#....#.##......##....#...#.#
|
||||
####..#..#.#.#.#.#..###.###.##..##..#..#.####...##.#..####.........#..#.#..
|
||||
.##...#..###.#.#.#.#.###.#.#.#########........###.#.#..#.....####..#..#.#.#
|
||||
##..###..#.##......#.#.....#....#....#..#####.#.####..###.#.###....#.##.#..
|
||||
#.#.#.##...#.....#.#..###.#..######.#..##.#.###..#.####..###.#....##.####..
|
||||
.##...#..#..###.###.........##....##...#.###..#..#.#.#.#.#.###......##..##.
|
||||
.##.##.##..#.######..#.##..##.#...#.##.#..###.#....#..#####.##..#..#.###...
|
||||
..####.##.#..#..##..##...####.######.##.#.....##.#....#....###.##.##....###
|
||||
.##......#.....#.#..#.#.##....#.#.#.####...#...##...##...#.##.#.#.#.##...##
|
||||
.##.#######..#.#..#.#..##..#.#....##...#####...##..#.......##...##..##..#.#
|
||||
#...#.#..#.###.#.##....##..#...#.#..##.###.......##.#.....######..#########
|
||||
Reference in New Issue
Block a user