84 lines
1.7 KiB
C
84 lines
1.7 KiB
C
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdbool.h>
|
|
|
|
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);
|
|
}
|