day 25 optimize and improve heuristics
[aoc_eblake.git] / 2019 / day3.c
blobcb8949171e840c879a118480153cdc75affddd4e
1 #define _GNU_SOURCE 1
2 #include <stdio.h>
3 #include <string.h>
4 #include <stdlib.h>
5 #include <stdarg.h>
6 #include <stdbool.h>
7 #include <limits.h>
9 #define LIMIT 20000
10 static int a[LIMIT*2][LIMIT*2];
12 static int do_debug = -1;
13 void debug(const char *fmt, ...) {
14 va_list ap;
15 if (do_debug < 0)
16 do_debug = !!getenv("DEBUG");
17 if (do_debug > 0) {
18 va_start(ap, fmt);
19 vfprintf(stderr, fmt, ap);
20 va_end(ap);
24 enum dir { U, R, D, L };
26 int main(int argc, char **argv) {
27 int i, d, count = 0, line = 0, len = 0;
28 int x = LIMIT, y = LIMIT;
29 int best1 = LIMIT * 2, best2 = INT_MAX;
31 if (argc > 1)
32 if (!(stdin = freopen(argv[1], "r", stdin))) {
33 perror("failure");
34 exit(2);
37 while (line < 2) {
38 count++;
39 switch (getchar()) {
40 case 'U': d = U; break;
41 case 'R': d = R; break;
42 case 'D': d = D; break;
43 case 'L': d = L; break;
44 default:
45 printf("unexpected input at %d\n", count);
46 exit(1);
48 if (scanf("%d", &i) != 1) {
49 printf("unexpected input at %d\n", count);
50 exit(1);
52 while (i--) {
53 len++;
54 switch (d) {
55 case U: x++; break;
56 case R: y++; break;
57 case D: x--; break;
58 case L: y--; break;
60 if (x < 0 || x >= LIMIT*2 || y < 0 || y >= LIMIT*2 || len > INT_MAX) {
61 printf("recompile with larger LIMIT\n");
62 exit(2);
64 if (line) {
65 if (a[x][y]) {
66 debug("intersect at %d,%d time %d+%d=%d\n", x-LIMIT, y-LIMIT,
67 a[x][y], len, a[x][y] + len);
68 if (abs(x-LIMIT) + abs(y-LIMIT) < best1)
69 best1 = abs(x-LIMIT) + abs(y-LIMIT);
70 if (a[x][y] + len < best2)
71 best2 = a[x][y] + len;
73 } else if (!a[x][y]) {
74 a[x][y] = len;
77 switch (getchar()) {
78 case ',': break;
79 case '\n':
80 debug("parsed a line len=%d\n", len);
81 ++line;
82 len = 0;
83 x = y = LIMIT;
84 break;
85 default:
86 printf("unexpected input at %d\n", count);
87 exit(1);
90 printf("after %d segments, best distance %d, best time %d\n", count,
91 best1, best2);
92 return 0;