Online File
Rick Aster: Professional SAS Programming Shortcuts: Contents
DATA WORK.RISK2 (KEEP=D_DICE A_DICE OUTCOME COMPRESS=NO); LENGTH D_DICE A_DICE 3 OUTCOME $ 2; DO D_DICE = 1 TO 2; * Number of defending dice; DO A_DICE = 1 TO 3; * Number of attacking dice; RES_A = 0; RES_AA = 0; RES_DD = 0; ARMIES = A_DICE MIN D_DICE; * Number of armies decided; DO ROLL_D1 = 1 TO 6; * Defending dice roll; DO ROLL_D2 = (D_DICE = 2) TO 6*(D_DICE = 2); * 1-6 or 0-0; DEFEND1 = LARGEST(1, OF ROLL_D1-ROLL_D2); *Defending dice, sorted; DEFEND2 = LARGEST(2, OF ROLL_D1-ROLL_D2); DO ROLL_A1 = 1 TO 6; * Attacking dice; DO ROLL_A2 = (A_DICE >= 2) TO 6*(A_DICE >= 2); DO ROLL_A3 = (A_DICE >= 3) TO 6*(A_DICE >= 3); ATTACK1 = LARGEST(1, OF ROLL_A1-ROLL_A3); ATTACK2 = LARGEST(2, OF ROLL_A1-ROLL_A3); * Count results; IF ARMIES = 1 THEN SELECT (ATTACK1 > DEFEND1); WHEN (1) OUTCOME = ' A'; OTHERWISE OUTCOME = ' D'; END; ELSE SELECT ((ATTACK1 > DEFEND1) + (ATTACK2 > DEFEND2)); WHEN (2) OUTCOME = 'AA'; WHEN (1) OUTCOME = 'AD'; OTHERWISE OUTCOME = 'DD'; END; OUTPUT; END; END; END; END; END; END; END; STOP; RUN; PROC TABULATE DATA=WORK.RISK1 FORMCHAR=' '; CLASS D_DICE A_DICE OUTCOME; TABLE D_DICE*A_DICE, OUTCOME*ROWPCTN*F=7.3 / RTSPACE=15 BOX='A=Attacker D=Defender'; KEYLABEL ROWPCTN=' '; RUN;