RosettaCodeData/Task/Balanced-brackets/XBasic/balanced-brackets.basic

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