mid-kid
6 years ago
4 changed files with 1440 additions and 0 deletions
@ -0,0 +1,12 @@ |
|||||
|
CFLAGS := -Wall -Wextra -std=c17 -D_GNU_SOURCE |
||||
|
|
||||
|
LIBS := glib-2.0 |
||||
|
CFLAGS += $(shell pkg-config --cflags $(LIBS)) |
||||
|
LDLIBS := $(shell pkg-config --libs $(LIBS)) |
||||
|
|
||||
|
.PHONY: all |
||||
|
all: main |
||||
|
|
||||
|
.PHONY: clean |
||||
|
clean: |
||||
|
rm -f main |
File diff suppressed because it is too large
Binary file not shown.
@ -0,0 +1,97 @@ |
|||||
|
#include <stdio.h> |
||||
|
|
||||
|
#include <glib.h> |
||||
|
|
||||
|
struct claim { |
||||
|
unsigned id; |
||||
|
unsigned x; |
||||
|
unsigned y; |
||||
|
unsigned w; |
||||
|
unsigned h; |
||||
|
}; |
||||
|
|
||||
|
struct claim *parseclaims(unsigned *len, const char *fname) |
||||
|
{ |
||||
|
FILE *f = fopen(fname, "r"); |
||||
|
if (!f) { |
||||
|
perror(fname); |
||||
|
return NULL; |
||||
|
} |
||||
|
|
||||
|
GArray *array = g_array_new(FALSE, FALSE, sizeof(struct claim)); |
||||
|
*len = 0; |
||||
|
|
||||
|
char *line = NULL; |
||||
|
size_t line_len = 0; |
||||
|
while (getline(&line, &line_len, f) != -1) { |
||||
|
struct claim claim = {0}; |
||||
|
|
||||
|
// Haha what is proper parsing
|
||||
|
sscanf(line, "#%u @ %u,%u: %ux%u", |
||||
|
&claim.id, |
||||
|
&claim.x, |
||||
|
&claim.y, |
||||
|
&claim.w, |
||||
|
&claim.h |
||||
|
); |
||||
|
|
||||
|
// Basic sanity check
|
||||
|
if (claim.y > 1000 || |
||||
|
claim.y + claim.h > 1000 || |
||||
|
claim.x > 1000 || |
||||
|
claim.x + claim.w > 1000) { |
||||
|
fprintf(stderr, "Warning: Ignoring out-of-bounds claim: " |
||||
|
"#%u @ %u,%u: %ux%u\n", |
||||
|
claim.id, |
||||
|
claim.x, |
||||
|
claim.y, |
||||
|
claim.w, |
||||
|
claim.h |
||||
|
); |
||||
|
continue; |
||||
|
} |
||||
|
|
||||
|
g_array_append_val(array, claim); |
||||
|
(*len)++; |
||||
|
} |
||||
|
|
||||
|
free(line); |
||||
|
fclose(f); |
||||
|
struct claim *res = (struct claim *)g_array_free(array, FALSE); |
||||
|
return res; |
||||
|
} |
||||
|
|
||||
|
int main() |
||||
|
{ |
||||
|
unsigned claims_len; |
||||
|
struct claim *claims = parseclaims(&claims_len, "input"); |
||||
|
if (!claims) return 1; |
||||
|
|
||||
|
char (*tilemap)[1000] = g_malloc0(sizeof(char[1000][1000])); |
||||
|
|
||||
|
for (struct claim *claim = claims; |
||||
|
claim < claims + claims_len; claim++) { |
||||
|
for (unsigned y = claim->y; y < claim->y + claim->h; y++) { |
||||
|
for (unsigned x = claim->x; x < claim->x + claim->w; x++) { |
||||
|
if (tilemap[y][x] >= 2) continue; |
||||
|
tilemap[y][x]++; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
for (struct claim *claim = claims; |
||||
|
claim < claims + claims_len; claim++) { |
||||
|
gboolean overlap = FALSE; |
||||
|
for (unsigned y = claim->y; y < claim->y + claim->h && !overlap; y++) { |
||||
|
for (unsigned x = claim->x; x < claim->x + claim->w && !overlap; x++) { |
||||
|
overlap = (tilemap[y][x] >= 2); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
if (!overlap) printf("%u\n", claim->id); |
||||
|
} |
||||
|
|
||||
|
g_free(claims); |
||||
|
g_free(tilemap); |
||||
|
return 0; |
||||
|
} |
Loading…
Reference in new issue