mirror of
https://github.com/peter-tanner/advent-of-code-2021.git
synced 2024-11-30 11:10:20 +08:00
Day 11 solutions
This commit is contained in:
parent
74a3cc2f48
commit
00e23a4c93
156
11/11-1and2.c
Normal file
156
11/11-1and2.c
Normal file
|
@ -0,0 +1,156 @@
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "../check_alloc.h"
|
||||||
|
|
||||||
|
#define PART_2
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u_int8_t energy;
|
||||||
|
bool lock; // LOCK STATE WHEN GLOWING
|
||||||
|
} OCTOPUS;
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
#define SPACE_SIZE 10
|
||||||
|
|
||||||
|
typedef OCTOPUS **SPACE;
|
||||||
|
|
||||||
|
#define VALID_VECTOR(i, j) ((i) >= 0 && (j) >= 0 && (i) < (SPACE_SIZE) && (j) < (SPACE_SIZE))
|
||||||
|
#define ITER_SPACE(i, j) \
|
||||||
|
for (int i = 0; (i) < (SPACE_SIZE); (i)++) \
|
||||||
|
for (int j = 0; (j) < (SPACE_SIZE); (j)++)
|
||||||
|
#define ITER_ADJACENT(i, j, x, y) \
|
||||||
|
for (int x = ((i)-1); (x) <= ((i) + 1); (x)++) \
|
||||||
|
for (int y = ((j)-1); (y) <= ((j) + 1); (y)++) \
|
||||||
|
if (((x) != (i) || (y) != (j)) && VALID_VECTOR((x), (y)))
|
||||||
|
|
||||||
|
bool check_sync(SPACE space)
|
||||||
|
{
|
||||||
|
ITER_SPACE(i, j)
|
||||||
|
{
|
||||||
|
if (space[i][j].energy != 0)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t flash(SPACE space)
|
||||||
|
{
|
||||||
|
size_t n_flashes = 0;
|
||||||
|
do // This can be further optimized with a update cache.
|
||||||
|
{
|
||||||
|
n_flashes = 0;
|
||||||
|
ITER_SPACE(i, j)
|
||||||
|
{
|
||||||
|
if (space[i][j].energy > 9)
|
||||||
|
{
|
||||||
|
ITER_ADJACENT(i, j, x, y)
|
||||||
|
{
|
||||||
|
OCTOPUS *p_cell = &space[x][y];
|
||||||
|
if (p_cell->energy > 9)
|
||||||
|
{
|
||||||
|
p_cell->lock = true;
|
||||||
|
}
|
||||||
|
else if (!p_cell->lock)
|
||||||
|
{
|
||||||
|
p_cell->energy++;
|
||||||
|
if (p_cell->energy > 9)
|
||||||
|
n_flashes++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
space[i][j].energy = 0;
|
||||||
|
space[i][j].lock = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (n_flashes > 0);
|
||||||
|
|
||||||
|
ITER_SPACE(i, j)
|
||||||
|
{
|
||||||
|
if (space[i][j].lock)
|
||||||
|
{
|
||||||
|
n_flashes++;
|
||||||
|
space[i][j].lock = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return n_flashes;
|
||||||
|
}
|
||||||
|
|
||||||
|
void increment_energy(SPACE space)
|
||||||
|
{
|
||||||
|
ITER_SPACE(i, j)
|
||||||
|
{
|
||||||
|
space[i][j].energy++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_space(SPACE space)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < SPACE_SIZE; i++)
|
||||||
|
{
|
||||||
|
for (size_t j = 0; j < SPACE_SIZE; j++)
|
||||||
|
{
|
||||||
|
if (space[i][j].energy)
|
||||||
|
printf("%d ", space[i][j].energy);
|
||||||
|
else
|
||||||
|
printf("* ");
|
||||||
|
}
|
||||||
|
putchar('\n');
|
||||||
|
}
|
||||||
|
putchar('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
SPACE new_space(void)
|
||||||
|
{
|
||||||
|
SPACE space = calloc(SPACE_SIZE, sizeof(OCTOPUS *));
|
||||||
|
CHECK_ALLOC(space);
|
||||||
|
for (size_t i = 0; i < SPACE_SIZE; i++)
|
||||||
|
{
|
||||||
|
space[i] = calloc(SPACE_SIZE, sizeof(OCTOPUS));
|
||||||
|
CHECK_ALLOC(space[i]);
|
||||||
|
}
|
||||||
|
return space;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
SPACE read_file(char *file)
|
||||||
|
{
|
||||||
|
SPACE space = new_space();
|
||||||
|
FILE *p_file = fopen(file, "r");
|
||||||
|
CHECK_ALLOC(p_file);
|
||||||
|
char buf[BUFSIZ];
|
||||||
|
size_t j = 0;
|
||||||
|
while (fgets(buf, sizeof buf, p_file) != NULL)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < SPACE_SIZE; i++)
|
||||||
|
{
|
||||||
|
space[j][i].energy = buf[i] - '0';
|
||||||
|
}
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
return space;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
SPACE space = read_file("input");
|
||||||
|
size_t total_flashes = 0;
|
||||||
|
#ifdef PART_2
|
||||||
|
size_t step = 0;
|
||||||
|
for (; !check_sync(space); step++)
|
||||||
|
#else
|
||||||
|
for (size_t i = 0; i < 100; i++)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
increment_energy(space);
|
||||||
|
total_flashes += flash(space);
|
||||||
|
// print_space(space);
|
||||||
|
}
|
||||||
|
#ifdef PART_2
|
||||||
|
printf("SYNC STEP %zu\n", step);
|
||||||
|
#else
|
||||||
|
printf("FLASHES %zu\n", total_flashes);
|
||||||
|
#endif
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user