100 lines
2.3 KiB
Plaintext
100 lines
2.3 KiB
Plaintext
' Balanced brackets
|
|
PROGRAM "balancedbrackets"
|
|
VERSION "0.001"
|
|
|
|
IMPORT "xst"
|
|
|
|
DECLARE FUNCTION Entry()
|
|
INTERNAL FUNCTION IsStringBalanced(str$)
|
|
INTERNAL FUNCTION Generate$(n%%)
|
|
|
|
' Pseudo-random number generator
|
|
' Based on the rand, srand functions from Kernighan & Ritchie's book
|
|
' 'The C Programming Language'
|
|
DECLARE FUNCTION Rand()
|
|
DECLARE FUNCTION SRand(seed%%)
|
|
|
|
FUNCTION Entry()
|
|
PRINT "Supplied examples"
|
|
DIM tests$[6]
|
|
tests$[0] = ""
|
|
tests$[1] = "[]"
|
|
tests$[2] = "]["
|
|
tests$[3] = "[][]"
|
|
tests$[4] = "][]["
|
|
tests$[5] = "[[][]]"
|
|
tests$[6] = "[]][[]"
|
|
FOR example@@ = 0 TO UBOUND(tests$[])
|
|
test$ = tests$[example@@]
|
|
PRINT "The string '"; test$; "' is ";
|
|
IFT IsStringBalanced(test$) THEN
|
|
PRINT "OK."
|
|
ELSE
|
|
PRINT "not OK."
|
|
END IF
|
|
NEXT example@@
|
|
PRINT
|
|
PRINT "Random generated examples"
|
|
XstGetSystemTime (@msec)
|
|
SRand(INT(msec) MOD 32768)
|
|
FOR example@@ = 1 TO 10
|
|
test$ = Generate$(INT(Rand() / 32768.0 * 10.0) + 1)
|
|
PRINT "The string '"; test$; "' is ";
|
|
IFT IsStringBalanced(test$) THEN
|
|
PRINT "OK."
|
|
ELSE
|
|
PRINT "not OK."
|
|
END IF
|
|
NEXT example@@
|
|
END FUNCTION
|
|
|
|
FUNCTION IsStringBalanced(s$)
|
|
paired& = 0
|
|
i%% = 1
|
|
DO WHILE i%% <= LEN(s$) && paired& >= 0
|
|
c$ = MID$(s$, i%%, 1)
|
|
SELECT CASE c$
|
|
CASE "[":
|
|
INC paired&
|
|
CASE "]":
|
|
DEC paired&
|
|
END SELECT
|
|
INC i%%
|
|
LOOP
|
|
END FUNCTION (paired& = 0)
|
|
|
|
FUNCTION Generate$(n%%)
|
|
opensCount%% = 0
|
|
closesCount%% = 0
|
|
' Choose at random until n%% of one type generated
|
|
generated$ = ""
|
|
DO WHILE opensCount%% < n%% && closesCount%% < n%%
|
|
SELECT CASE (INT(Rand() / 32768.0 * 2.0) + 1)
|
|
CASE 1:
|
|
INC opensCount%%
|
|
generated$ = generated$ + "["
|
|
CASE 2:
|
|
INC closesCount%%
|
|
generated$ = generated$ + "]"
|
|
END SELECT
|
|
LOOP
|
|
' Now pad with the remaining other brackets
|
|
IF opensCount%% = n%% THEN
|
|
generated$ = generated$ + CHR$(']', n%% - closesCount%%)
|
|
ELSE
|
|
generated$ = generated$ + CHR$('[', n%% - opensCount%%)
|
|
END IF
|
|
END FUNCTION generated$
|
|
|
|
' Return pseudo-random integer on 0..32767
|
|
FUNCTION Rand()
|
|
#next&& = #next&& * 1103515245 + 12345
|
|
END FUNCTION USHORT(#next&& / 65536) MOD 32768
|
|
|
|
' Set seed for Rand()
|
|
FUNCTION SRand(seed%%)
|
|
#next&& = seed%%
|
|
END FUNCTION
|
|
|
|
END PROGRAM
|