48 lines
1.2 KiB
Plaintext
48 lines
1.2 KiB
Plaintext
MODULE Brackets;
|
|
IMPORT IO, Lib;
|
|
|
|
CONST MaxN = 4;
|
|
|
|
PROCEDURE DoTest( N : CARDINAL);
|
|
VAR
|
|
brStr : ARRAY [0..2*MaxN] OF CHAR; (* string of brackets *)
|
|
verdict : ARRAY [0..2] OF CHAR;
|
|
br : CHAR;
|
|
k, nL, nR, randNum : CARDINAL;
|
|
count : INTEGER;
|
|
BEGIN
|
|
k := 0; (* index into brStr *)
|
|
nL := N; nR := N; (* number of left/right brackets remaining *)
|
|
WHILE (nL > 0) AND (nR > 0) DO
|
|
randNum := Lib.RANDOM( nL + nR);
|
|
IF (randNum < nL) THEN brStr[k] := '['; DEC(nL);
|
|
ELSE brStr[k] := ']'; DEC(nR); END;
|
|
INC(k);
|
|
END;
|
|
(* Here when only one kind of bracket is possible *)
|
|
IF (nL = 0) THEN br := ']' ELSE br := '['; END;
|
|
WHILE (k < 2*N) DO brStr[k] := br; INC(k); END;
|
|
brStr[k] := 0C; (* null to mark end of string *)
|
|
|
|
(* Test for balance *)
|
|
count := 0;
|
|
k := 0;
|
|
REPEAT
|
|
IF brStr[k] = '[' THEN INC( count) ELSE DEC( count) END;
|
|
INC( k);
|
|
UNTIL (count < 0) OR (k = 2*N);
|
|
IF (count < 0) THEN verdict := 'no' ELSE verdict := 'yes' END;
|
|
IO.WrStr( brStr); IO.WrStr(' '); IO.WrStr( verdict);
|
|
IO.WrLn;
|
|
END DoTest;
|
|
|
|
(* Main routine *)
|
|
VAR
|
|
j : CARDINAL;
|
|
BEGIN
|
|
Lib.RANDOMIZE;
|
|
FOR j := 1 TO 10 DO
|
|
DoTest( Lib.RANDOM(MaxN) + 1);
|
|
END;
|
|
END Brackets.
|