85 lines
1.5 KiB
Plaintext
85 lines
1.5 KiB
Plaintext
MODULE ABCProblem;
|
|
IMPORT
|
|
StdLog, DevCommanders, TextMappers;
|
|
CONST
|
|
notfound = -1;
|
|
TYPE
|
|
String = ARRAY 3 OF CHAR;
|
|
VAR
|
|
blocks : ARRAY 20 OF String;
|
|
|
|
PROCEDURE Check(s: ARRAY OF CHAR): BOOLEAN;
|
|
VAR
|
|
used: SET;
|
|
i,blockIndex: INTEGER;
|
|
|
|
PROCEDURE GetBlockFor(c: CHAR): INTEGER;
|
|
VAR
|
|
i: INTEGER;
|
|
BEGIN
|
|
c := CAP(c);
|
|
i := 0;
|
|
WHILE (i < LEN(blocks)) DO
|
|
IF (c = blocks[i][0]) OR (c = blocks[i][1]) THEN
|
|
IF ~(i IN used) THEN RETURN i END
|
|
END;
|
|
INC(i)
|
|
END;
|
|
RETURN notfound
|
|
END GetBlockFor;
|
|
|
|
BEGIN
|
|
used := {};
|
|
FOR i := 0 TO LEN(s$) - 1 DO
|
|
blockIndex := GetBlockFor(s[i]);
|
|
IF blockIndex = notfound THEN
|
|
RETURN FALSE
|
|
ELSE
|
|
INCL(used,blockIndex)
|
|
END
|
|
END;
|
|
RETURN TRUE
|
|
END Check;
|
|
|
|
PROCEDURE CanMakeWord*;
|
|
VAR
|
|
s: TextMappers.Scanner;
|
|
BEGIN
|
|
s.ConnectTo(DevCommanders.par.text);
|
|
s.SetPos(DevCommanders.par.beg);
|
|
s.Scan;
|
|
WHILE (~s.rider.eot) DO
|
|
IF (s.type = TextMappers.char) & (s.char = '~') THEN
|
|
RETURN
|
|
ELSIF (s.type = TextMappers.string) THEN
|
|
StdLog.String(s.string);StdLog.String(":> ");
|
|
StdLog.Bool(Check(s.string));StdLog.Ln
|
|
END;
|
|
s.Scan
|
|
END
|
|
END CanMakeWord;
|
|
|
|
BEGIN
|
|
blocks[0] := "BO";
|
|
blocks[1] := "XK";
|
|
blocks[2] := "DQ";
|
|
blocks[3] := "CP";
|
|
blocks[4] := "NA";
|
|
blocks[5] := "GT";
|
|
blocks[6] := "RE";
|
|
blocks[7] := "TG";
|
|
blocks[8] := "QD";
|
|
blocks[9] := "FS";
|
|
blocks[10] := "JW";
|
|
blocks[11] := "HU";
|
|
blocks[12] := "VI";
|
|
blocks[13] := "AN";
|
|
blocks[14] := "OB";
|
|
blocks[15] := "ER";
|
|
blocks[16] := "FS";
|
|
blocks[17] := "LY";
|
|
blocks[18] := "PC";
|
|
blocks[19] := "ZM";
|
|
|
|
END ABCProblem.
|