-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathlife2.bas
73 lines (64 loc) · 2.15 KB
/
life2.bas
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
100 REM CONWAY'S GAME OF LIFE
102 REM G IS NUMBER OF GENERATIONS,
104 REM M IS MATRIX SIZE (M X M)
106 REM L(SELF, NEIGHBORS_ALIVE) IS 1 IFF CELL WITH THOSE COUNTS LIVES
108 REM A(X, Y) STORES THE HISTORY OF THE CELL AT (X, Y); 1 MEANS LIVE,
110 REM BUT WE STORE SEVERAL GENERATIONS: A(X, Y) = 100 MEANS THE CELL
112 REM IS DEAD IN THE CURRENT AND PREVIOUS GENERATION (00), BUT LIVE IN THE
114 REM GENERATION BEFORE THAT (1). WE STORE MULTIPLE GENERATIONS SO THAT
116 REM WE CAN PRINT THEM OUT ON ONE LINE, SAVING SPACE/PAPER.
120 READ G, M, L(0,3), L(1,3), L(1,2)
122 DATA 11, 10, 1, 1, 1
124 READ A(3,4), A(3,5), A(3,6), A(6,5), A(6,6), A(7,5), A(7,6)
126 DATA 1, 1, 1, 1, 1, 1, 1
130 REM FNA(N) = THE PREVIOUS GENERATION'S VALUE
132 DEF FNA(N) = INT(N / 10) % 10
134 REM FNC(N) = THE GENERATION IN COLUMN C; FNC(123) = C FOR EACH C IN 1..3
136 DEF FNC(N) = FNA(N / (10 ^ (2 - C)))
150 REM MAIN LOOP: DO 3 UPDATES (2 FIRST TIME), THEN PRINT AND SHIFT
160 FOR I = 1 TO G
170 GOSUB 300
175 IF I % 3 <> 2 THEN 200
180 GOSUB 700
190 GOSUB 800
200 NEXT I
210 STOP
300 REM ========== UPDATE A: SHIFT OLD GENS LEFT; ADD IN NEW GEN
310 FOR Y = 1 TO M
320 FOR X = 1 TO M
330 LET A(X, Y) = 10 * A(X, Y)
340 NEXT X
350 NEXT Y
360 FOR Y = 1 TO M
370 FOR X = 1 TO M
380 LET N1 = FNA(A(X+1,Y-1)) + FNA(A(X+1,Y)) + FNA(A(X+1,Y+1)) + FNA(A(X,Y-1))
390 LET N2 = FNA(A(X-1,Y-1)) + FNA(A(X-1,Y)) + FNA(A(X-1,Y+1)) + FNA(A(X,Y+1))
400 LET S = FNA(A(X, Y))
410 LET A(X, Y) = A(X, Y) + L(S, N1 + N2)
420 NEXT X
430 NEXT Y
440 RETURN
700 REM ========== PRINT A (3 GENERATIONS ACROSS THE PAGE)
705 PRINT "GEN " I-2, " ", " GEN " I-1, " ", " GEN " I
710 FOR Y = 1 TO M
715 FOR C = 1 TO 3
720 FOR X = 1 TO M
730 IF FNC(A(X, Y)) = 1 THEN 760
740 PRINT ".";
750 GOTO 770
760 PRINT "O";
770 NEXT X
772 IF C = 3 THEN 777
775 PRINT "|";
777 NEXT C
780 PRINT
790 NEXT Y
795 RETURN
800 REM ========== FORGET ALL BUT THE MOST RECENT GENERATION IN A
810 FOR Y = 1 TO M
820 FOR X = 1 TO M
830 LET A(X, Y) = A(X, Y) % 10
840 NEXT X
850 NEXT Y
860 RETURN
999 END