RosettaCodeData/Task/Balanced-brackets/Modula-2/balanced-brackets.mod2

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.