#include #include #include #include #include #include #include #include char input[] = { #embed "input.txt" ,'\0' // null terminator ,'\0' }; int width = 0; int height = 0; uint64_t power(uint64_t base, uint64_t exp) { uint64_t i, result = 1; for (i = 0; i < exp; i++) result *= base; return result; } void print_field(uint8_t* surrounds){ for(int x = 0; x < height; x++){ for(int y = 0; y < width; y++){ if((surrounds[(x)*(width+2)+(y)]&0x80) == 0x80){ printf("%d", surrounds[(x)*(width+2)+(y)]-0x80); }else{ //printf("%c", input[(x)*(width+1)+(y)]); printf("."); } } printf("\n"); } printf("==============================================\n"); } int main(int argc, char *argv[]){ clock_t start, end; start = clock(); while(input[width] != '\n'){ width++; } //printf("width: %d\n", width); while(input[height*(width+1)+1] != 0){ height++; } //printf("height: %d\n", height); uint8_t* surrounds = calloc((height+2)*(width+2), sizeof(uint8_t))+width+1; for(int x = 0; x < height; x++){ for(int y = 0; y< width; y++){ if(input[(x)*(width+1)+(y)] == '@'){ surrounds[(x-1)*(width+2)+(y-1)] += 1; surrounds[(x-1)*(width+2)+(y)] += 1; surrounds[(x-1)*(width+2)+(y+1)] += 1; surrounds[(x)*(width+2)+(y-1)] += 1; surrounds[(x)*(width+2)+(y)] += 0x80; surrounds[(x)*(width+2)+(y+1)] += 1; surrounds[(x+1)*(width+2)+(y-1)] += 1; surrounds[(x+1)*(width+2)+(y)] += 1; surrounds[(x+1)*(width+2)+(y+1)] += 1; } //if(surrounds[(x)*width+(y)] < 8 && input[(x)*(width+1)+(y)] == '@'){ // printf("%d", surrounds[(x)*(width+2)+(y)]); //}else{ // printf("%c", input[(x)*(width+1)+(y)]); //} } //printf("\n"); } //print_field(surrounds); uint64_t count = 0; uint64_t count_2 = 0; bool cont = true; int* removes = calloc((height)*(width)*2, sizeof(int)); while (cont){ count_2 = 0; for(int x = 0; x < height; x++){ for(int y = 0; y < width; y++){ if((surrounds[(x)*(width+2)+(y)]&0x7f) < 4 && (surrounds[(x)*(width+2)+(y)]&0x80) == 0x80){ removes[count_2*2] = x; removes[count_2*2+1] = y; count_2++; //printf("removing %d, %d\n", x, y); //input[(x)*(width+1)+(y)] = 'x'; //printf("%d", surrounds[(x)*width+(y)]); }//if((surrounds[(x)*(width+2)+(y)]&0x7f) > 8 && (surrounds[(x)*(width+2)+(y)]&0x80) == 0x80){ //printf("underflow detechted, aborting\n"); //cont = false; //} } //printf("\n"); } //print_field(surrounds); count += count_2; //printf("count = %lu\n========\n", count); if(count_2 == 0){ cont = false; } //printf("cont: %s\n", cont ? "true" : "false"); //printf("count_2 = %lu\n", count_2); //printf("count = %lu\n", count); for(int i = 0; i < count_2; i++){ int x = removes[i*2]; int y = removes[i*2+1]; surrounds[(x-1)*(width+2)+(y-1)] -= 1; surrounds[(x-1)*(width+2)+(y)] -= 1; surrounds[(x-1)*(width+2)+(y+1)] -= 1; surrounds[(x)*(width+2)+(y-1)] -= 1; surrounds[(x)*(width+2)+(y)] -= 0x80; surrounds[(x)*(width+2)+(y+1)] -= 1; surrounds[(x+1)*(width+2)+(y-1)] -= 1; surrounds[(x+1)*(width+2)+(y)] -= 1; surrounds[(x+1)*(width+2)+(y+1)] -= 1; } //print_field(surrounds); //sleep(1); } //free(removes); //free(surrounds-width-1); end = clock(); printf("count: %lu\n", count); clock_t ticks_taken = end - start; double time_taken = ((double)ticks_taken)/CLOCKS_PER_SEC; printf("time take: %f ticks\n", time_taken); printf("CLOCKS_PER_SEC: %ld\n", CLOCKS_PER_SEC); exit(1); }