-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlife.ps
More file actions
159 lines (141 loc) · 3.34 KB
/
life.ps
File metadata and controls
159 lines (141 loc) · 3.34 KB
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
%!PS
% Copyright (C) 2003 Evan Danaher
%
% This program is free software; you can redistribute it and/or
% modify it under the terms of the GNU General Public License
% as published by the Free Software Foundation; either version 2
% of the License, or (at your option) any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this program; if not, write to the Free Software
% Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
/Times-Roman findfont 12 scalefont setfont
/size 70 def
/cellsize 5 def
/numgens 10 def
/get2 {
3 1 roll get exch get
} def
/put2 {
/val exch def /c exch def /r exch def /tmpar2 exch def
/tmpar tmpar2 r get def
tmpar c val put
tmpar2 r tmpar put
} def
/ar
size {
0 size 1 sub { dup } repeat
size array astore
} repeat
size array astore
def
/ar2
size {
0 size 1 sub { dup } repeat
size array astore
} repeat
size array astore
def
/diffs
size {
0 size 1 sub { dup } repeat
size array astore
} repeat
size array astore
def
/arcpy {
/dest exch def /src exch def
0 1 size 1 sub {
/i exch def
0 1 size 1 sub {
/j exch def
dest i j src i j get2 put2
} for
} for
} def
/disp {
0 1 size 1 sub { /i exch def
0 1 size 1 sub { /j exch def
diffs i j get2 dup 0 ne {
1 eq { 1 } { 0 } ifelse
setgray
newpath
100 cellsize j mul add 500 cellsize i mul sub moveto
0 cellsize rlineto
cellsize 0 rlineto
0 cellsize neg rlineto
closepath
fill
} { pop } ifelse
} for
} for
} def
/dispPage {
0 1 size 1 sub { /i exch def
0 1 size 1 sub { /j exch def
ar i j get2 dup 0 ne {
0
setgray
newpath
100 cellsize j mul add 500 cellsize i mul sub moveto
0 cellsize rlineto
cellsize 0 rlineto
0 cellsize neg rlineto
closepath
fill
} { pop } ifelse
} for
} for
showpage
} def
/Wrap {
size add size mod
} def
/DoGen {
/diffs
size {
0 size 1 sub { dup } repeat
size array astore
} repeat
size array astore
def
0 1 size 1 sub {
/i exch def
0 1 size 1 sub {
/j exch def
/neighbors 0 def
-1 1 1 {
/di exch def
-1 1 1 {
/dj exch def
di 0 ne dj 0 ne or {
ar i di add Wrap j dj add Wrap get2 1 eq {
/neighbors neighbors 1 add def
} if
} if
} for
} for
ar i j get2 1 eq
{ neighbors 2 eq neighbors 3 eq or not {ar2 i j 0 put2 diffs i j 1 put2} if }
{ neighbors 3 eq {ar2 i j 1 put2 diffs i j -1 put2} if }
ifelse
} for
} for
ar2 ar arcpy
} def
/setcell {
1 3 copy ar 4 1 roll put2 diffs 4 1 roll put2
} def
size size mul 4 div cvi {
rand size mod rand size mod setcell
} repeat
ar ar2 arcpy
disp
% numgens { disp DoGen } repeat
% disp
showpage