5 struct point
{int x
; int y
; int gen
; };
14 void add_point(struct entry
**board
, int x
, int y
, int gen
, char c
)
16 struct entry
*e
= calloc(1, sizeof(struct entry
));
17 e
->p
= (struct point
){.x
=x
, .y
=y
, .gen
=gen
};
19 HASH_ADD(hh
, *board
, p
, sizeof(struct point
), e
);
22 char get_point(struct entry
**board
, int x
, int y
, int gen
)
26 memset(&p
, 0, sizeof(p
));
30 HASH_FIND(hh
, *board
, &p
, sizeof(struct point
), e
);
33 return gen
% 2 == 0 ? '.' : '#';
40 char evolve(struct entry
**board
, int px
, int py
, int gen
)
43 for (int y
= py
-1; y
<=py
+1; y
++)
44 for (int x
= px
-1; x
<=px
+1; x
++)
45 r
= r
*2 + (get_point(board
, x
, y
, gen
) == '#' ? 1 : 0);
52 if (getline(&key
, &len
, stdin
) == -1)
54 if (getchar() != '\n')
57 struct entry
*board
= NULL
;
58 int x
= 0, minx
= 0, maxx
= 0;
59 int y
= 0, miny
= 0, maxy
= 0;
62 while ((c
= getchar()) != EOF
) {
69 add_point(&board
, x
++, y
, 0, c
);
75 for (; gen
<= 2; gen
++) {
81 for (y
= miny
; y
<maxy
; y
++)
82 for (x
= minx
; x
<maxx
; x
++)
83 add_point(&board
, x
, y
, gen
,
84 evolve(&board
, x
, y
, gen
-1));
88 for (y
= miny
; y
<maxy
; y
++)
89 for (x
= minx
; x
<maxx
; x
++)
90 if (get_point(&board
, x
, y
, gen
-1) == '#')