aoc_omni/c/2018/3/problem_03.c
2025-11-30 21:22:21 -05:00

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);
}