summary refs log tree commit diff homepage
path: root/2018/day17.c
blob: d2fd02ca2665a5703aeaf0bf9291579d24ad9b08 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef unsigned uint;

static char map[2048][2048];

static void draw(void) {
	for (uint y = 0; y < 14; ++y) {
		for (uint x = 494; x < 508; ++x) {
			printf("%c", map[y][x]);
		}
		printf("\n");
	}
	printf("\n");
}

int main(void) {
	memset(map, '.', sizeof(map));
	uint minY = 2048, maxY = 0;
	while (!feof(stdin)) {
		char a, b;
		uint fixed, start, end;
		scanf("%c=%u, %c=%u..%u\n", &a, &fixed, &b, &start, &end);
		for (uint i = start; i <= end; ++i) {
			if (a == 'y') {
				map[fixed][i] = '#';
			} else {
				map[i][fixed] = '#';
			}
		}
		if (a == 'y') {
			if (fixed < minY) minY = fixed;
			if (fixed > maxY) maxY = fixed;
		} else {
			if (start < minY) minY = start;
			if (end > maxY) maxY = end;
		}
	}
	map[0][500] = '|';

	bool hot;
	do {
		hot = false;
		for (uint y = 0; y < 2047; ++y) {
			for (uint x = 0; x < 2048; ++x) {
				char *self = &map[y][x];
				char *below = &map[y + 1][x];
				char *left = &map[y][x - 1];
				char *right = &map[y][x + 1];
				if (*self != '|' && *self != '*') continue;
				if (*below == '.') {
					*below = '|';
					hot = true;
				}
				if (*below != '#' && *below != '~') continue;
				if (*left == '.') {
					*left = '|';
					hot = true;
				}
				if (*right == '.') {
					*right = '|';
					hot = true;
				}
				if (*self == '|' && (*left == '#' || *left == '*')) {
					*self = '*';
					hot = true;
				}
				if (*self == '*' && (*right == '#' || *right == '~')) {
					*self = '~';
					hot = true;
				}
			}
		}
	} while (hot);
	draw();

	uint count = 0;
	for (uint y = minY; y <= maxY; ++y) {
		for (uint x = 0; x < 2048; ++x) {
			if (map[y][x] != '.' && map[y][x] != '#') count++;
		}
	}
	printf("%u\n", count);
}