day 25 optimize and improve heuristics
[aoc_eblake.git] / 2017 / advent19.c
blob18e851db32245dcd7154e0d732b924a80c1bf9af
1 #define _GNU_SOURCE 1
2 #include <stdio.h>
3 #include <string.h>
4 #include <stdlib.h>
5 #include <unistd.h>
6 #include <stdbool.h>
7 #include <ctype.h>
9 #define MAX 202 // cheat by pre-inspecting input with wc
10 char grid[MAX][MAX + 1];
12 enum dir {
19 int
20 main (int argc, char **argv)
22 int rows = 0;
23 char out[11]; // cheat by pre-inspecting 'tr -d -c A-Z < day19.input'
24 char *p = out;
25 while (fgets (grid[rows], MAX + 1, stdin) && grid[rows][0])
26 rows++;
27 int width = strchr (grid[0], '\n') - grid[0];
28 printf ("read %d rows, width %d\n", rows, width);
29 int r = 0, c;
30 enum dir d = D;
31 c = strchr (grid[0], '|') - grid[0];
32 bool done = false;
33 int steps = 0;
34 while (!done) {
35 if (getenv ("DEBUG"))
36 printf ("at grid[%d][%d]='%c', direction %d\n", r, c, grid[r][c], d);
37 steps++;
38 if (isalpha (grid[r][c]))
39 *p++ = grid[r][c];
40 switch (d) {
41 case U:
42 if (r && grid[r - 1][c] != ' ')
43 r--;
44 else if (c < width - 1 && grid[r][c + 1] != ' ') {
45 d = R;
46 c++;
47 } else if (c && grid[r][c - 1] != ' ') {
48 d = L;
49 c--;
50 } else
51 done = true;
52 break;
53 case D:
54 if (r < rows - 1 && grid[r + 1][c] != ' ')
55 r++;
56 else if (c < width - 1 && grid[r][c + 1] != ' ') {
57 d = R;
58 c++;
59 } else if (c && grid[r][c - 1] != ' ') {
60 d = L;
61 c--;
62 } else
63 done = true;
64 break;
65 case L:
66 if (c && grid[r][c - 1] != ' ')
67 c--;
68 else if (r < rows - 1 && grid[r + 1][c] != ' ') {
69 d = D;
70 r++;
71 } else if (r && grid[r - 1][c] != ' ') {
72 d = U;
73 r--;
74 } else
75 done = true;
76 break;
77 case R:
78 if (c < width - 1 && grid[r][c + 1] != ' ')
79 c++;
80 else if (r < rows - 1 && grid[r + 1][c] != ' ') {
81 d = D;
82 r++;
83 } else if (r && grid[r - 1][c] != ' ') {
84 d = U;
85 r--;
86 } else
87 done = true;
88 break;
91 printf ("encountered %s after %d steps\n", out, steps);
92 return 0;