Online File
Rick Aster: Professional SAS Programming Shortcuts: Contents
FILENAME LIFEINIT CATALOG 'WORK.LIFE.INIT.SOURCE';
DATA _NULL_;
ARRAY L{1:16} $ 32;
ARRAY NEW{1:16} $ 32 _TEMPORARY_;
WINDOW Life ROWS=22 COLUMNS=35 IROW=2 ICOLUMN=10
#1 L1 $CHAR32. PROTECT=YES
#2 L2 $CHAR32. PROTECT=YES
#3 L3 $CHAR32. PROTECT=YES
#4 L4 $CHAR32. PROTECT=YES
#5 L5 $CHAR32. PROTECT=YES
#6 L6 $CHAR32. PROTECT=YES
#7 L7 $CHAR32. PROTECT=YES
#8 L8 $CHAR32. PROTECT=YES
#9 L9 $CHAR32. PROTECT=YES
#10 L10 $CHAR32. PROTECT=YES
#11 L11 $CHAR32. PROTECT=YES
#12 L12 $CHAR32. PROTECT=YES
#13 L13 $CHAR32. PROTECT=YES
#14 L14 $CHAR32. PROTECT=YES
#15 L15 $CHAR32. PROTECT=YES
#16 L16 $CHAR32. PROTECT=YES
#17 'Life' COLOR=BLUE
+5 'Time' COLOR=CYAN +1 TIME F4. COLOR=GREEN PROTECT=YES
+5 'Live' COLOR=CYAN +1 LIVE F4. COLOR=GREEN PROTECT=YES
;
* Read initial grid from file, converting any nonblank character to X;
INFILE LIFEINIT TRUNCOVER;
INPUT (L1-L16) ($CHAR32. /);
DO Y = 1 TO 16;
DO X = 1 TO 32;
IF SUBSTR(L{Y}, X, 1) NE ' ' THEN SUBSTR(L{Y}, X, 1) = 'X';
END;
END;
DO TIME = 0 TO 1000;
* Count live cells.;
LIVE = 0;
DO Y = 1 TO 16;
DO X = 1 TO 32;
LIVE + SUBSTR(L{Y}, X, 1) = 'X';
END;
END;
* Display grid and check for end of game. ;
_MSG_ = 'Press Enter to continue.';
IF STSTATE THEN _MSG_ = 'Steady state. Press Enter to finish.';
IF LIVE = 0 THEN _MSG_ = 'Game over. Press Enter to finish.';
DISPLAY LIFE;
IF STSTATE OR LIVE = 0 THEN STOP;
* Recalculate grid. ;
DO Y = 1 TO 16;
NEW{Y} = L{Y};
DO X = 1 TO 32;
LIVECELL = SUBSTR(L{Y}, X, 1) = 'X';
* Count surrounding cells. ;
COUNT = 0;
DO DX = -1 TO 1;
DO DY = -1 TO 1;
IF DX = 0 AND DY = 0 THEN CONTINUE;
IF 1 <= X + DX <= 32 AND 1 <= Y + DY <= 16 THEN
COUNT = COUNT + (SUBSTR(L{Y + DY}, X + DX, 1) = 'X');
END;
END;
* Change state of cell. ;
IF NOT LIVECELL AND COUNT = 3 THEN
SUBSTR(NEW{Y}, X, 1) = 'X'; * New live cell;
ELSE IF LIVECELL AND COUNT NOTIN (2, 3) THEN
SUBSTR(NEW{Y}, X, 1) = ' '; * New dead cell;
END;
END;
* Activate new grid and check for steady state.;
STSTATE = 1;
DO Y = 1 TO 16;
IF NEW{Y} NE L{Y} THEN STSTATE = 0;
L{Y} = NEW{Y};
END;
END;
STOP;
RUN;