-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlife_engine.tex
105 lines (100 loc) · 2.94 KB
/
life_engine.tex
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
% !TEX root = life.tex
%% ## The Game of Life Engine. ##
%% Display board.
\def\lb@print{\l@input@header@make\lb@loop{\csname lc@\the\i;\the\j\endcsname}{\endgraf}\vfill\eject}
\def\lb@print@next{%
\advance\lb@iter1
\lb@diff=0
\lb@loop{%
\expandafter\ifx\csname lc@\the\i;\the\j\expandafter\endcsname\csname lc@next@\the\i;\the\j\endcsname
\else
\global\advance\lb@diff1
\fi
\global\expandafter\let\csname lc@\the\i;\the\j\expandafter\endcsname\csname lc@next@\the\i;\the\j\endcsname
}{}%
\ifnum\lb@diff=0
\lb@stop
\fi
\lb@print
}
%% ## Update processing. ##
\def\lb@tick{\lb@loop{\lc@update}{}}
\def\lc@update{%
\expandafter\ifx\csname lc@\the\i;\the\j\endcsname\lc@alive
\lc@update@alive
\else
\lc@update@dead
\fi
}
%% Offset the "cursor" by specified coordinates, checking if an alive cell exists.
\def\lc@check@numalive@peek#1#2{%
\begingroup
\l@modadvance{\i}{\lb@size@y}{#1}\l@modadvance{\j}{\lb@size@x}{#2}
%\advance\i#1 \advance\j#2
\expandafter\ifx\csname lc@\the\i;\the\j\endcsname\lc@alive
\global\advance\k1\relax
\fi
\endgroup
}
%% Count the number of neighbours alive.
\def\lc@check@numalive{%
\k=0\relax
\lc@check@numalive@peek{1}{0}%
\lc@check@numalive@peek{1}{1}%
\lc@check@numalive@peek{0}{1}%
\lc@check@numalive@peek{-1}{1}%
\lc@check@numalive@peek{-1}{0}%
\lc@check@numalive@peek{-1}{-1}%
\lc@check@numalive@peek{0}{-1}%
\lc@check@numalive@peek{1}{-1}%
}
\def\lc@update@alive{%
\lc@check@numalive
\ifcase\k
\csname lc@update@alive@hook@0\endcsname
\or
\csname lc@update@alive@hook@1\endcsname
\or
\csname lc@update@alive@hook@2\endcsname
\or
\csname lc@update@alive@hook@3\endcsname
\or
\csname lc@update@alive@hook@4\endcsname
\or
\csname lc@update@alive@hook@5\endcsname
\or
\csname lc@update@alive@hook@6\endcsname
\or
\csname lc@update@alive@hook@7\endcsname
\or
\csname lc@update@alive@hook@8\endcsname
\else
\errmessage{Undefined behavior!}
\fi
}
\def\lc@update@dead{%
\lc@check@numalive
\ifcase\k
\csname lc@update@dead@hook@0\endcsname
\or
\csname lc@update@dead@hook@1\endcsname
\or
\csname lc@update@dead@hook@2\endcsname
\or
\csname lc@update@dead@hook@3\endcsname
\or
\csname lc@update@dead@hook@4\endcsname
\or
\csname lc@update@dead@hook@5\endcsname
\or
\csname lc@update@dead@hook@6\endcsname
\or
\csname lc@update@dead@hook@7\endcsname
\or
\csname lc@update@dead@hook@8\endcsname
\else
\errmessage{Undefined behavior!}
\fi
}
\def\lc@update@to@dead{\global\expandafter\let\csname lc@next@\the\i;\the\j\endcsname\lc@dead}
\def\lc@update@to@alive{\global\expandafter\let\csname lc@next@\the\i;\the\j\endcsname\lc@alive}