day 22 part 1
[aoc_eblake.git] / 2016 / advent13.c
blobd516c47f21b5b1ba85c5e932c7dcd8cc41d49271
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 75
10 int grid[MAX][MAX];
12 int main(int argc, char **argv)
14 int seed = 1350;
15 if (argc == 2)
16 seed = atoi (argv[1]);
17 int i, j;
18 for (i = 0; i < MAX; i++)
19 for (j = 0; j < MAX; j++)
20 grid[i][j] = (~__builtin_popcount (j*j + 3*j + 2*i*j + i + i*i
21 + seed) & 1) - 1;
22 int gen = 1;
23 grid[1][1] = gen;
24 int set = 1;
25 bool change = true;
26 while (change) {
27 change = false;
28 for (i = 0; i < MAX; i++)
29 for (j = 0; j < MAX; j++)
30 if (grid[i][j] == gen) {
31 if (i && !grid[i - 1][j]) {
32 change = true;
33 if (gen < 51)
34 set++;
35 grid[i - 1][j] = gen + 1;
37 if (i + 1 < MAX && !grid[i + 1][j]) {
38 change = true;
39 if (gen < 51)
40 set++;
41 grid[i + 1][j] = gen + 1;
43 if (j && !grid[i][j - 1]) {
44 change = true;
45 if (gen < 51)
46 set++;
47 grid[i][j - 1] = gen + 1;
49 if (j + 1 < MAX && !grid[i][j + 1]) {
50 change = true;
51 if (gen < 51)
52 set++;
53 grid[i][j + 1] = gen + 1;
56 gen++;
58 if (getenv ("DEBUG"))
59 for (i = 0; i < MAX; i++) {
60 for (j = 0; j < MAX; j++)
61 putchar (grid[i][j] > 0 ? 'O' : grid[i][j] ? '#' : '.');
62 putchar ('\n');
64 printf ("steps to x=31,y=39 is %d\n", grid[39][31] - 1);
65 printf ("%d places reachable within 50 steps\n", set);
66 return 0;