MODULE ABCBlocks; IMPORT Object, Out; VAR blocks: ARRAY 20 OF STRING; PROCEDURE CanMakeWord(w: STRING): BOOLEAN; VAR used: ARRAY 20 OF LONGINT; wChars: Object.CharsLatin1; i,j: LONGINT; PROCEDURE IsUsed(i: LONGINT): BOOLEAN; VAR b: LONGINT; BEGIN b := 0; WHILE (b < LEN(used) - 1) & (used[b] # -1) DO IF used[b] = i THEN RETURN TRUE END; INC(b) END; RETURN FALSE END IsUsed; PROCEDURE GetBlockFor(blocks: ARRAY OF STRING; c: CHAR): LONGINT; VAR i: LONGINT; BEGIN i := 0; WHILE (i < LEN(blocks)) DO IF (blocks[i].IndexOf(c,0) >= 0) & (~IsUsed(i)) THEN RETURN i END; INC(i) END; RETURN -1; END GetBlockFor; BEGIN FOR i := 0 TO LEN(used) - 1 DO used[i] := -1 END; wChars := w(Object.String8).CharsLatin1(); i := 0; WHILE (i < LEN(wChars^) - 1) DO j := GetBlockFor(blocks,CAP(wChars[i])); IF j < 0 THEN RETURN FALSE END; used[i] := j; INC(i) END; RETURN TRUE 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"; Out.String("A: ");Out.Bool(CanMakeWord("A"));Out.Ln; Out.String("BARK: ");Out.Bool(CanMakeWord("BARK"));Out.Ln; Out.String("BOOK: ");Out.Bool(CanMakeWord("BOOK"));Out.Ln; Out.String("TREAT: ");Out.Bool(CanMakeWord("TREAT"));Out.Ln; Out.String("COMMON: ");Out.Bool(CanMakeWord("COMMON"));Out.Ln; Out.String("SQAD: ");Out.Bool(CanMakeWord("SQUAD"));Out.Ln; Out.String("confuse: ");Out.Bool(CanMakeWord("confuse"));Out.Ln; END ABCBlocks.