#include #include #include typedef struct { int number; int x; int y; int w; int h; } Claim; bool read_claim(FILE *input, Claim *claim) { return fscanf(input, "#%d @ %d,%d: %dx%d\n", &claim->number, &claim->x, &claim->y, &claim->w, &claim->h) > 0; } typedef int Fabric[1000][1000]; bool overlapped(Claim *claim, Fabric *fabric) { for(int x = claim->x; x < (claim->x + claim->w); x++) { for(int y = claim->y; y < (claim->y + claim->h); y++) { if ((*fabric)[x][y] > 1) return true; } } return false; } void apply_claim(const Claim *claim, Fabric *fabric) { for(int x = claim->x; x < (claim->x + claim->w); x++) { for(int y = claim->y; y < (claim->y + claim->h); y++) { int *col = (*fabric)[x]; col[y]++; } } } int part_1(FILE *input) { rewind(input); Fabric fabric = {0}; Claim claim = {0}; while(read_claim(input, &claim)) apply_claim(&claim, &fabric); int double_claimed = 0; for(int x = 0; x < 1000; x++) { for(int y = 0; y < 1000; y++) { if (fabric[x][y] > 1) double_claimed++; } } return double_claimed; } int part_2(FILE *input) { rewind(input); Fabric fabric = {0}; Claim claims[1401] = {0}; Claim *claim = claims; while(read_claim(input, claim)) { apply_claim(claim, &fabric); claim++; } for(int i = 0; i < 1401; i++) { if(!overlapped(&(claims[i]), &fabric)) { return claims[i].number; } } return -1; } int main() { char *input_file_path = "../data/2018/3/input.txt"; FILE *input = fopen(input_file_path, "r"); if (input == NULL) { printf("Can't open file %s\n", input_file_path); return 1; } printf("Part 1: %d\n", part_1(input)); printf("Part 2: %d\n", part_2(input)); fclose(input); }