Solves the fours problem eoredson Programmer Elite Offline This member has written at least 239 posts and created at least 60 threads on this forum since joining inNov 2017. 12-08-2017, 02:10 PM Code to solve the fours problem: Code:```Fours v1.3a documentation. QB64. Fours calculates the 'fours problem'. The fours problem is a solution using four 4s with any mathematical symbols to calculate the solutions for 1 to 24. Precedence for division/multiplication is greater than addition/ subtraction: 4-4/4+4 is 7. Power is next greater precedence: 4+(4/û4)^4 is 20. Single unary parser for negate is highest precedence: 4-4-4-!4 is 1. Parenthesis implies recursive precedence: 4*(4-4+4) is 16. The û is a square root symbol in ascii. Not all editors display it as a square root symbol. The negation of 4 is equal to -5 because !4 is twos-complement calculated. Version v1.2a features:  Upgrade to solve only first 24 solutions then   quit, also lists each fours number in order of solution. Version v1.3a features:  Entry for number of solutions to search for,   also adds negation parser. Adds debug mode for number of errors, and   number of solutions not found. -end-``` This is the program: Code:```REM Fours v1.3a expression parser. Calculates fours problem. QB64. COMMON SHARED Token AS INTEGER, Token.Index AS INTEGER COMMON SHARED Out2 AS STRING, Nul AS STRING, Strng AS STRING COMMON SHARED Solutions AS DOUBLE, Out3 AS STRING, Counter AS INTEGER COMMON SHARED Debug AS INTEGER, Num.Fours AS INTEGER, D() AS STRING COMMON SHARED Token.List AS STRING ON ERROR GOTO Error.Routine Token.List\$ = "-+*/^()!" Nul = "": Solutions = 0: Debug = -1 COLOR 15, 0 CLS PRINT "Fours v1.3a: Calculates fours problem;" start.loop: PRINT "Enter fours solutions to calculate( for default)"; INPUT Num.Fours IF Num.Fours < 0 THEN GOTO start.loop IF Num.Fours = 0 THEN Num.Fours = 24 REDIM D(1 TO Num.Fours) AS STRING PRINT "Calculating: "; a\$ = "-+/*^" ' token list FOR l = 1 TO 5     FOR m = 1 TO 5         FOR N = 1 TO 5             FOR p = 1 TO 7                 SELECT CASE p                     CASE 1 ' 4/4/4/4                         FOR q1 = 1 TO 4                             FOR q2 = 1 TO 4                                 FOR q3 = 1 TO 4                                     FOR q4 = 1 TO 4                                         SELECT CASE q1                                             CASE 1                                                 q1\$ = "4": r1\$ = "4"                                             CASE 2                                                 q1\$ = "sqr(4)": r1\$ = CHR\$(251) + "4"                                             CASE 3                                                 q1\$ = "fct(4)": r1\$ = "4!"                                             CASE 4                                                 q1\$ = "!4": r1\$ = "!4"                                         END SELECT                                         SELECT CASE q2                                             CASE 1                                                 q2\$ = "4": r2\$ = "4"                                             CASE 2                                                 q2\$ = "sqr(4)": r2\$ = CHR\$(251) + "4"                                             CASE 3                                                 q2\$ = "fct(4)": r2\$ = "4!"                                             CASE 4                                                 q2\$ = "!4": r2\$ = "!4"                                         END SELECT                                         SELECT CASE q3                                             CASE 1                                                 q3\$ = "4": r3\$ = "4"                                             CASE 2                                                 q3\$ = "sqr(4)": r3\$ = CHR\$(251) + "4"                                             CASE 3                                                 q3\$ = "fct(4)": r3\$ = "4!"                                             CASE 4                                                 q3\$ = "!4": r3\$ = "!4"                                         END SELECT                                         SELECT CASE q4                                             CASE 1                                                 q4\$ = "4": r4\$ = "4"                                             CASE 2                                                 q4\$ = "sqr(4)": r4\$ = CHR\$(251) + "4"                                             CASE 3                                                 q4\$ = "fct(4)": r4\$ = "4!"                                             CASE 4                                                 q4\$ = "!4": r4\$ = "!4"                                         END SELECT                                         Out2 = q1\$ + MID\$(a\$, l, 1) + q2\$ + MID\$(a\$, m, 1) + q3\$ + MID\$(a\$, N, 1) + q4\$                                         Out3 = r1\$ + MID\$(a\$, l, 1) + r2\$ + MID\$(a\$, m, 1) + r3\$ + MID\$(a\$, N, 1) + r4\$                                         CALL Equate: IF Counter = Num.Fours THEN GOTO End.Program                                     NEXT                                 NEXT                             NEXT                         NEXT                     CASE 2 ' (4/4)+4/4                         FOR q1 = 1 TO 4                             FOR q2 = 1 TO 4                                 FOR q3 = 1 TO 4                                     FOR q4 = 1 TO 4                                         SELECT CASE q1                                             CASE 1                                                 q1\$ = "4": r1\$ = "4"                                             CASE 2                                                 q1\$ = "sqr(4)": r1\$ = CHR\$(251) + "4"                                             CASE 3                                                 q1\$ = "fct(4)": r1\$ = "4!"                                             CASE 4                                                 q1\$ = "!4": r1\$ = "!4"                                         END SELECT                                         SELECT CASE q2                                             CASE 1                                                 q2\$ = "4": r2\$ = "4"                                             CASE 2                                                 q2\$ = "sqr(4)": r2\$ = CHR\$(251) + "4"                                             CASE 3                                                 q2\$ = "fct(4)": r2\$ = "4!"                                             CASE 4                                                 q2\$ = "!4": r2\$ = "!4"                                         END SELECT                                         SELECT CASE q3                                             CASE 1                                                 q3\$ = "4": r3\$ = "4"                                             CASE 2                                                 q3\$ = "sqr(4)": r3\$ = CHR\$(251) + "4"                                             CASE 3                                                 q3\$ = "fct(4)": r3\$ = "4!"                                             CASE 4                                                 q4\$ = "!4": r4\$ = "!4"                                         END SELECT                                         SELECT CASE q4                                             CASE 1                                                 q4\$ = "4": r4\$ = "4"                                             CASE 2                                                 q4\$ = "sqr(4)": r4\$ = CHR\$(251) + "4"                                             CASE 3                                                 q4\$ = "fct(4)": r4\$ = "4!"                                             CASE 4                                                 q4\$ = "!4": r4\$ = "!4"                                         END SELECT                                         Out2 = "(" + q1\$ + MID\$(a\$, l, 1) + q2\$ + ")" + MID\$(a\$, m, 1) + q3\$ + MID\$(a\$, N, 1) + q4\$                                         Out3 = "(" + r1\$ + MID\$(a\$, l, 1) + r2\$ + ")" + MID\$(a\$, m, 1) + r3\$ + MID\$(a\$, N, 1) + r4\$                                         CALL Equate: IF Counter = Num.Fours THEN GOTO End.Program                                     NEXT                                 NEXT                             NEXT                         NEXT                     CASE 3 ' 4/(4/4)/4                         FOR q1 = 1 TO 4                             FOR q2 = 1 TO 4                                 FOR q3 = 1 TO 4                                     FOR q4 = 1 TO 4                                         SELECT CASE q1                                             CASE 1                                                 q1\$ = "4": r1\$ = "4"                                             CASE 2                                                 q1\$ = "sqr(4)": r1\$ = CHR\$(251) + "4"                                             CASE 3                                                 q1\$ = "fct(4)": r1\$ = "4!"                                             CASE 4                                                 q1\$ = "!4": r1\$ = "!4"                                         END SELECT                                         SELECT CASE q2                                             CASE 1                                                 q2\$ = "4": r2\$ = "4"                                             CASE 2                                                 q2\$ = "sqr(4)": r2\$ = CHR\$(251) + "4"                                             CASE 3                                                 q2\$ = "fct(4)": r2\$ = "4!"                                             CASE 4                                                 q2\$ = "!4": r2\$ = "!4"                                         END SELECT                                         SELECT CASE q3                                             CASE 1                                                 q3\$ = "4": r3\$ = "4"                                             CASE 2                                                 q3\$ = "sqr(4)": r3\$ = CHR\$(251) + "4"                                             CASE 3                                                 q3\$ = "fct(4)": r3\$ = "4!"                                             CASE 4                                                 q3\$ = "!4": r3\$ = "!4"                                         END SELECT                                         SELECT CASE q4                                             CASE 1                                                 q4\$ = "4": r4\$ = "4"                                             CASE 2                                                 q4\$ = "sqr(4)": r4\$ = CHR\$(251) + "4"                                             CASE 3                                                 q4\$ = "fct(4)": r4\$ = "4!"                                             CASE 4                                                 q4\$ = "!4": r4\$ = "!4"                                         END SELECT                                         Out2 = q1\$ + MID\$(a\$, l, 1) + "(" + q2\$ + MID\$(a\$, m, 1) + q3\$ + ")" + MID\$(a\$, N, 1) + q4\$                                         Out3 = r1\$ + MID\$(a\$, l, 1) + "(" + r2\$ + MID\$(a\$, m, 1) + r3\$ + ")" + MID\$(a\$, N, 1) + r4\$                                         CALL Equate: IF Counter = Num.Fours THEN GOTO End.Program                                     NEXT                                 NEXT                             NEXT                         NEXT                     CASE 4 ' 4/4/(4/4)                         FOR q1 = 1 TO 4                             FOR q2 = 1 TO 4                                 FOR q3 = 1 TO 4                                     FOR q4 = 1 TO 4                                         SELECT CASE q1                                             CASE 1                                                 q1\$ = "4": r1\$ = "4"                                             CASE 2                                                 q1\$ = "sqr(4)": r1\$ = CHR\$(251) + "4"                                             CASE 3                                                 q1\$ = "fct(4)": r1\$ = "4!"                                             CASE 4                                                 q1\$ = "!4": r1\$ = "!4"                                         END SELECT                                         SELECT CASE q2                                             CASE 1                                                 q2\$ = "4": r2\$ = "4"                                             CASE 2                                                 q2\$ = "sqr(4)": r2\$ = CHR\$(251) + "4"                                             CASE 3                                                 q2\$ = "fct(4)": r2\$ = "4!"                                             CASE 4                                                 q2\$ = "!4": r2\$ = "!4"                                         END SELECT                                         SELECT CASE q3                                             CASE 1                                                 q3\$ = "4": r3\$ = "4"                                             CASE 2                                                 q3\$ = "sqr(4)": r3\$ = CHR\$(251) + "4"                                             CASE 3                                                 q3\$ = "fct(4)": r3\$ = "4!"                                             CASE 4                                                 q3\$ = "!4": r3\$ = "!4"                                         END SELECT                                         SELECT CASE q4                                             CASE 1                                                 q4\$ = "4": r4\$ = "4"                                             CASE 2                                                 q4\$ = "sqr(4)": r4\$ = CHR\$(251) + "4"                                             CASE 3                                                 q4\$ = "fct(4)": r4\$ = "4!"                                             CASE 4                                                 q4\$ = "!4": r4\$ = "!4"                                         END SELECT                                         Out2 = q1\$ + MID\$(a\$, l, 1) + q2\$ + MID\$(a\$, m, 1) + "(" + q3\$ + MID\$(a\$, N, 1) + q4\$ + ")"                                         Out3 = r1\$ + MID\$(a\$, l, 1) + r2\$ + MID\$(a\$, m, 1) + "(" + r3\$ + MID\$(a\$, N, 1) + r4\$ + ")"                                         CALL Equate: IF Counter = Num.Fours THEN GOTO End.Program                                     NEXT                                 NEXT                             NEXT                         NEXT                     CASE 5 ' (4/4)/(4/4)                         FOR q1 = 1 TO 4                             FOR q2 = 1 TO 4                                 FOR q3 = 1 TO 4                                     FOR q4 = 1 TO 4                                         SELECT CASE q1                                             CASE 1                                                 q1\$ = "4": r1\$ = "4"                                             CASE 2                                                 q1\$ = "sqr(4)": r1\$ = CHR\$(251) + "4"                                             CASE 3                                                 q1\$ = "fct(4)": r1\$ = "4!"                                             CASE 4                                                 q1\$ = "!4": r1\$ = "!4"                                         END SELECT                                         SELECT CASE q2                                             CASE 1                                                 q2\$ = "4": r2\$ = "4"                                             CASE 2                                                 q2\$ = "sqr(4)": r2\$ = CHR\$(251) + "4"                                             CASE 3                                                 q2\$ = "fct(4)": r2\$ = "4!"                                             CASE 4                                                 q2\$ = "!4": r2\$ = "!4"                                         END SELECT                                         SELECT CASE q3                                             CASE 1                                                 q3\$ = "4": r3\$ = "4"                                             CASE 2                                                 q3\$ = "sqr(4)": r3\$ = CHR\$(251) + "4"                                             CASE 3                                                 q3\$ = "fct(4)": r3\$ = "4!"                                             CASE 4                                                 q3\$ = "!4": r3\$ = "!4"                                         END SELECT                                         SELECT CASE q4                                             CASE 1                                                 q4\$ = "4": r4\$ = "4"                                             CASE 2                                                 q4\$ = "sqr(4)": r4\$ = CHR\$(251) + "4"                                             CASE 3                                                 q4\$ = "fct(4)": r4\$ = "4!"                                             CASE 4                                                 q4\$ = "!4": r4\$ = "!4"                                         END SELECT                                         Out2 = "(" + q1\$ + MID\$(a\$, l, 1) + q2\$ + ")" + MID\$(a\$, m, 1) + "(" + q3\$ + MID\$(a\$, N, 1) + q4\$ + ")"                                         Out3 = "(" + r1\$ + MID\$(a\$, l, 1) + r2\$ + ")" + MID\$(a\$, m, 1) + "(" + r3\$ + MID\$(a\$, N, 1) + r4\$ + ")"                                         CALL Equate: IF Counter = Num.Fours THEN GOTO End.Program                                     NEXT                                 NEXT                             NEXT                         NEXT                     CASE 6 ' (4/4/4)/4                         FOR q1 = 1 TO 4                             FOR q2 = 1 TO 4                                 FOR q3 = 1 TO 4                                     FOR q4 = 1 TO 4                                         SELECT CASE q1                                             CASE 1                                                 q1\$ = "4": r1\$ = "4"                                             CASE 2                                                 q1\$ = "sqr(4)": r1\$ = CHR\$(251) + "4"                                             CASE 3                                                 q1\$ = "fct(4)": r1\$ = "4!"                                             CASE 4                                                 q1\$ = "!4": r1\$ = "!4"                                         END SELECT                                         SELECT CASE q2                                             CASE 1                                                 q2\$ = "4": r2\$ = "4"                                             CASE 2                                                 q2\$ = "sqr(4)": r2\$ = CHR\$(251) + "4"                                             CASE 3                                                 q2\$ = "fct(4)": r2\$ = "4!"                                             CASE 4                                                 q2\$ = "!4": r2\$ = "!4"                                         END SELECT                                         SELECT CASE q3                                             CASE 1                                                 q3\$ = "4": r3\$ = "4"                                             CASE 2                                                 q3\$ = "sqr(4)": r3\$ = CHR\$(251) + "4"                                             CASE 3                                                 q3\$ = "fct(4)": r3\$ = "4!"                                             CASE 4                                                 q4\$ = "!4": r4\$ = "!4"                                         END SELECT                                         SELECT CASE q4                                             CASE 1                                                 q4\$ = "4": r4\$ = "4"                                             CASE 2                                                 q4\$ = "sqr(4)": r4\$ = CHR\$(251) + "4"                                             CASE 3                                                 q4\$ = "fct(4)": r4\$ = "4!"                                             CASE 4                                                 q4\$ = "!4": r4\$ = "!4"                                         END SELECT                                         Out2 = "(" + q1\$ + MID\$(a\$, l, 1) + q2\$ + MID\$(a\$, m, 1) + q3\$ + ")" + MID\$(a\$, N, 1) + q4\$                                         Out3 = "(" + r1\$ + MID\$(a\$, l, 1) + r2\$ + MID\$(a\$, m, 1) + r3\$ + ")" + MID\$(a\$, N, 1) + r4\$                                         CALL Equate: IF Counter = Num.Fours THEN GOTO End.Program                                     NEXT                                 NEXT                             NEXT                         NEXT                     CASE 7 ' 4/(4/4/4)                         FOR q1 = 1 TO 4                             FOR q2 = 1 TO 4                                 FOR q3 = 1 TO 4                                     FOR q4 = 1 TO 4                                         SELECT CASE q1                                             CASE 1                                                 q1\$ = "4": r1\$ = "4"                                             CASE 2                                                 q1\$ = "sqr(4)": r1\$ = CHR\$(251) + "4"                                             CASE 3                                                 q1\$ = "fct(4)": r1\$ = "4!"                                             CASE 4                                                 q1\$ = "!4": r1\$ = "!4"                                         END SELECT                                         SELECT CASE q2                                             CASE 1                                                 q2\$ = "4": r2\$ = "4"                                             CASE 2                                                 q2\$ = "sqr(4)": r2\$ = CHR\$(251) + "4"                                             CASE 3                                                 q2\$ = "fct(4)": r2\$ = "4!"                                             CASE 4                                                 q2\$ = "!4": r2\$ = "!4"                                         END SELECT                                         SELECT CASE q3                                             CASE 1                                                 q3\$ = "4": r3\$ = "4"                                             CASE 2                                                 q3\$ = "sqr(4)": r3\$ = CHR\$(251) + "4"                                             CASE 3                                                 q3\$ = "fct(4)": r3\$ = "4!"                                             CASE 4                                                 q3\$ = "!4": r3\$ = "!4"                                         END SELECT                                         SELECT CASE q4                                             CASE 1                                                 q4\$ = "4": r4\$ = "4"                                             CASE 2                                                 q4\$ = "sqr(4)": r4\$ = CHR\$(251) + "4"                                             CASE 3                                                 q4\$ = "fct(4)": r4\$ = "4!"                                             CASE 4                                                 q4\$ = "!4": r4\$ = "!4"                                         END SELECT                                         Out2 = q1\$ + MID\$(a\$, l, 1) + "(" + q2\$ + MID\$(a\$, m, 1) + q3\$ + MID\$(a\$, N, 1) + q4\$ + ")"                                         Out3 = r1\$ + MID\$(a\$, l, 1) + "(" + r2\$ + MID\$(a\$, m, 1) + r3\$ + MID\$(a\$, N, 1) + r4\$ + ")"                                         CALL Equate: IF Counter = Num.Fours THEN GOTO End.Program                                     NEXT                                 NEXT                             NEXT                         NEXT                 END SELECT             NEXT         NEXT     NEXT NEXT End.Program: OPEN "fours.txt" FOR OUTPUT AS #1 FOR l = 1 TO Num.Fours     x\$ = RTRIM\$(D(l))     IF x\$ = "" THEN         Num.Found = Num.Found + 1         PRINT #1, x\$; "="; l; "("; MID\$(STR\$(Num.Found), 2); ")"     ELSE         PRINT #1, x\$; "="; l     END IF NEXT CLOSE PRINT COLOR 14, 0 PRINT "Calculations complete:"; Solutions IF Debug THEN     PRINT "Errors trapped: "; Num.Errors     IF Num.Found = 0 THEN         PRINT "All solutions found."     ELSE         PRINT "Solutions not found:"; Num.Found     END IF END IF PRINT "Solutions written to fours.txt" COLOR 7, 0 END Error.Routine: ' illegal function call IF ERR = 5 THEN     Num.Errors = Num.Errors + 1     RESUME NEXT END IF ' overflow IF ERR = 6 THEN     Num.Errors = Num.Errors + 1     RESUME NEXT END IF ' division by zero IF ERR = 11 THEN     Num.Errors = Num.Errors + 1     RESUME NEXT END IF PRINT "Fatal error "; ERR END ' routine accepts an operation and performs on two values SUB Arith (Token.Parsed\$, Temp#, Temp2#)     ON ERROR GOTO Error.Routine     SELECT CASE Token.Parsed\$         CASE "-"             Temp# = Temp# - Temp2#         CASE "+"             Temp# = Temp# + Temp2#         CASE "/"             Temp# = Temp# / Temp2#         CASE "*"             Temp# = Temp# * Temp2#         CASE "^"             Temp# = Temp# ^ Temp2#     END SELECT END SUB ' entry to expression parser SUB Equate     ON ERROR GOTO Error.Routine     Out2 = UCASE\$(Out2)     Solutions = Solutions + 1     Temp# = False ' reset result     Token.Index = 1 ' reset pointer to expression token     CALL Get.Token ' read next token     CALL Parse1(Temp#) ' entry to parse the expression     IF INT(Temp#) = Temp# THEN         IF Temp# >= 1 AND Temp# <= Num.Fours THEN             IF RTRIM\$(D(Temp#)) = Nul THEN                 D(Temp#) = Out3                 Counter = Counter + 1                 PRINT Temp#;             END IF         END IF     END IF END SUB SUB Get.Token     ON ERROR GOTO Error.Routine     Strng = Nul ' reset token     Token = 0 ' reset token type     IF Token.Index > LEN(Out2) THEN ' compare pointer at end of expression         EXIT SUB     END IF     ' locate expression symbol     IF INSTR(Token.List\$, MID\$(Out2, Token.Index, 1)) THEN         Token = 1 ' store token type         Strng = MID\$(Out2, Token.Index, 1) ' store token         Token.Index = Token.Index + 1 ' increment pointer         EXIT SUB     END IF     ' locate expression is number     IF MID\$(Out2, Token.Index, 1) >= "0" AND MID\$(Out2, Token.Index, 1) <= "9" THEN         ' increment token until token is other than number         WHILE INSTR(Token.List\$, MID\$(Out2, Token.Index, 1)) = False             Strng = Strng + MID\$(Out2, Token.Index, 1)             Token.Index = Token.Index + 1         WEND         Token = 2 ' store token type         EXIT SUB     END IF     ' locate expression is alphabetic     IF MID\$(Out2, Token.Index, 1) >= "A" AND MID\$(Out2, Token.Index, 1) <= "Z" THEN         ' increment token until token is other than alphabetic         WHILE INSTR(Token.List\$, MID\$(Out2, Token.Index, 1)) = False             Strng = Strng + MID\$(Out2, Token.Index, 1)             Token.Index = Token.Index + 1         WEND         Token = 3 ' store token type         EXIT SUB     END IF END SUB ' addition/subtraction parser SUB Parse1 (Temp#)     ON ERROR GOTO Error.Routine     CALL Parse2(Temp#) ' get next operator precedence     Token.Parsed\$ = Strng ' store token     ' process token     WHILE Token.Parsed\$ = "+" OR Token.Parsed\$ = "-"         CALL Get.Token ' read next token         CALL Parse2(Temp2#) ' get next operator         CALL Arith(Token.Parsed\$, Temp#, Temp2#) ' calculate expression         Token.Parsed\$ = Strng ' store next token     WEND END SUB ' multiplication/division parser SUB Parse2 (Temp#)     ON ERROR GOTO Error.Routine     CALL Parse3(Temp#) ' get next operator precedence     Token.Parsed\$ = Strng ' store token     ' process token     WHILE Token.Parsed\$ = "*" OR Token.Parsed\$ = "/"         CALL Get.Token ' read next token         CALL Parse3(Temp2#) ' get next operator         CALL Arith(Token.Parsed\$, Temp#, Temp2#) ' calculate expression         Token.Parsed\$ = Strng ' store next token     WEND END SUB ' power parser SUB Parse3 (Temp#)     ON ERROR GOTO Error.Routine     CALL Parse3a(Temp#) ' get next operator precedence     Token.Parsed\$ = Strng ' store token     ' process token     WHILE Token.Parsed\$ = "^"         CALL Get.Token ' read next token         CALL Parse3a(Temp2#) ' get next operator         CALL Arith(Token.Parsed\$, Temp#, Temp2#) ' calculate expression         Token.Parsed\$ = Strng ' store next token     WEND END SUB ' negate parser SUB Parse3a (Temp#)     ON ERROR GOTO Error.Routine     CALL Parse4(Temp#) ' get next operator precedence     Token.Parsed\$ = Strng ' store token     ' process token     WHILE Token.Parsed\$ = "!"         CALL Get.Token ' read next token         CALL Parse4(Temp2#) ' get next operator         Temp# = NOT (Temp2#)         Token.Parsed\$ = Strng ' store next token     WEND END SUB SUB Parse4 (Temp#)     ON ERROR GOTO Error.Routine     SELECT CASE Token ' determine token type         CASE 1 ' token is symbol             SELECT CASE Strng ' determine token                 CASE "(" ' calculate opening parenthesis                     CALL Get.Token ' read next token value inside parenthesis                     DO ' calculate value                         CALL Parse1(Temp#) ' call parse entry                     LOOP UNTIL Strng = ")" OR Token = 0 ' check closing parenthesis                     CALL Get.Token ' read next token after parenthesis                 CASE ")" ' check token is closing parenthesis                     CALL Get.Token ' read next token after parenthesis                     EXIT SUB             END SELECT         CASE 2 ' token is numeric value             Temp# = VAL(Strng) ' calculate value             CALL Get.Token ' read next token after number         CASE 3 ' token type is alphabetic             SELECT CASE Strng                 CASE "SQR" ' compare token                     CALL Get.Token ' read next parenthesis                     CALL Get.Token ' read next parse value                     CALL Parse1(Temp#) ' recursively calculate imbedded value in expression                     Temp# = SQR(Temp#) ' return token calculation                 CASE "FCT" ' calculate xth factorial                     CALL Get.Token                     CALL Get.Token                     CALL Parse1(Temp#)                     Factorial# = 1 ' reset factorial                     Factorial.Count# = INT(Temp#)                     IF Factorial.Count# >= 1 THEN ' check xth value                         FOR Factorial.Count# = 1 TO Temp# ' compute xth value                             Factorial# = Factorial# * Factorial.Count# ' compute value                         NEXT                     END IF                     Temp# = Factorial# ' assign result             END SELECT             CALL Get.Token ' read next token     END SELECT END SUB``` dndbbs project: Links to my MUD: (strictly 16-bit); AKA XP: Dndbbs executables http://www.filegate.net/pdn/pdnbasic/dnd50a1e.zip Dndbbs source http://www.filegate.net/pdn/pdnbasic/dnd50a1s.zip Dndbbs upgrade http://www.filegate.net/pdn/pdnbasic/dnd50a1u.zip DNDDOOR - DUNGEON - https://bit.ly/EriksDungeon Interpreter - Hex Editor - Utilities -  QB45 files: - https://bit.ly/EriksQB45 QB64shell - https://bit.ly/QB64shell Some old QB64 versions: - « Next Oldest | Next Newest »