diff --git a/day11/Makefile b/day11/Makefile index dcd6a88..dc3fdbf 100644 --- a/day11/Makefile +++ b/day11/Makefile @@ -20,7 +20,7 @@ all: part1 part2 inpu%-sz.h: inpu% echo "#define input_sz (`head -n 1 $< | wc -m`)" > $@ -inpu%.h: inpu% | input-sz.h +inpu%.h: inpu% | inpu%-sz.h @rm -f $@ while read line; do \ echo "\"$$line\"," >> $@; \ @@ -31,6 +31,9 @@ part1: day11.c | input.h $(CC) $< $(CFLAGS) -o $@ $(LDFLAGS) $(STRIP) $@ +part1-test: day11.c | input-test.h + $(CC) $< -DTEST $(CFLAGS) -o $@ $(LDFLAGS) + $(STRIP) $@ clean: - rm -f input{,-sz}.h - rm -f part{1,2} + rm -f input{,-sz}{,-test}.h + rm -f part{1,2}{,-test} diff --git a/day11/day11.c b/day11/day11.c index 4e1144a..2034d6d 100644 --- a/day11/day11.c +++ b/day11/day11.c @@ -1,14 +1,25 @@ +#include #include +#include #include #include const char* const input[] = { +#ifdef TEST +#include "input-test.h" +#else #include "input.h" +#endif }; // input_sz // +#ifdef TEST +#include "input-test-sz.h" +#else #include "input-sz.h" +#endif + #define INPUT_WIDTH (input_sz-1) #define INPUT_HEIGHT (sizeof(input)/sizeof(char*)) @@ -57,13 +68,100 @@ static inline void gol_set(gol_t* restrict gol, int x,int y, enum gol_state st) gol->arena[GOL_INDEX(x,y)] = st; } +static inline int count_states(const enum gol_state* state, enum gol_state s, size_t n) +{ + register int j=0; + for(register size_t i=0;iarena, s, INPUT_WIDTH*INPUT_HEIGHT); +} + +static inline void neighbours(const gol_t* gol, int x, int y, enum gol_state out[restrict 8]) +{ + out[0] = gol_index(gol, x-1, y-1); + out[1] = gol_index(gol, x, y-1); + out[2] = gol_index(gol, x+1, y-1); + + out[3] = gol_index(gol, x-1, y); + //out[4] = gol_index(gol, x, y); + out[4] = gol_index(gol, x+1, y); + + out[5] = gol_index(gol, x-1, y+1); + out[6] = gol_index(gol, x, y+1); + out[7] = gol_index(gol, x+1, y+1); +} + +static void simulate_ip(const gol_t* source, gol_t* restrict dest) +{ + for(size_t h=0;h=4) next = STATE_EMPTY; + default: break; + } + gol_set(dest, w, h, next); + } +} + +static inline int gol_eq(const gol_t* g1, const gol_t* g2) +{ + return memcmp(g1->arena, g2->arena, sizeof(g1->arena))==0; +} + +gol_t simulate_once(const gol_t* source) +{ + gol_t out = *source; + simulate_ip(source, &out); + + return out; +} + +#ifdef DEBUG +static void print_arena(const gol_t* gol) +{ + for(size_t h=0;h