RosettaCodeData/Task/Permutations/Modula-2/permutations.mod2

61 lines
997 B
Plaintext

MODULE Permute;
FROM Terminal
IMPORT Read, Write, WriteLn;
FROM Terminal2
IMPORT WriteString;
CONST MAXIDX = 6;
MINIDX = 1;
TYPE TInpCh = ['a'..'z'];
TChr = SET OF TInpCh;
VAR n,
nl: INTEGER;
ch: CHAR;
a: ARRAY[MINIDX..MAXIDX] OF CHAR;
kt: TChr = TChr{'a'..'f'};
PROCEDURE output;
VAR i: INTEGER;
BEGIN
FOR i := MINIDX TO n DO Write(a[i]) END;
WriteString(" | ");
END output;
PROCEDURE exchange(VAR x, y : CHAR);
VAR z: CHAR;
BEGIN z := x; x := y; y := z
END exchange;
PROCEDURE permute(k: INTEGER);
VAR i: INTEGER;
BEGIN
IF k = 1 THEN
output;
INC(nl);
IF (nl MOD 8 = 1) THEN WriteLn END;
ELSE
permute(k-1);
FOR i := MINIDX TO k-1 DO
exchange(a[i], a[k]);
permute(k-1);
exchange(a[i], a[k]);
END
END
END permute;
BEGIN
n := 0; nl := 1; WriteString("Input {a,b,c,d,e,f} >");
REPEAT
Read(ch);
IF ch IN kt THEN INC(n); a[n] := ch; Write(ch) END
UNTIL (ch <= " ") OR (n > MAXIDX);
WriteLn;
IF n > 0 THEN permute(n) END;
(*Wait*)
END Permute.