92 lines
1.9 KiB
Plaintext
92 lines
1.9 KiB
Plaintext
MODULE PerfectShuffle;
|
|
FROM FormatString IMPORT FormatString;
|
|
FROM Storage IMPORT ALLOCATE,DEALLOCATE;
|
|
FROM SYSTEM IMPORT ADDRESS,TSIZE;
|
|
FROM Terminal IMPORT WriteString,WriteLn,ReadChar;
|
|
|
|
PROCEDURE WriteCard(c : CARDINAL);
|
|
VAR buf : ARRAY[0..15] OF CHAR;
|
|
BEGIN
|
|
FormatString("%c", buf, c);
|
|
WriteString(buf)
|
|
END WriteCard;
|
|
|
|
PROCEDURE Init(VAR arr : ARRAY OF INTEGER);
|
|
VAR i : CARDINAL;
|
|
BEGIN
|
|
FOR i:=0 TO HIGH(arr) DO
|
|
arr[i] := i + 1
|
|
END
|
|
END Init;
|
|
|
|
PROCEDURE PerfectShuffle(VAR arr : ARRAY OF INTEGER);
|
|
PROCEDURE Inner(ti : CARDINAL);
|
|
VAR
|
|
tv : INTEGER;
|
|
tp,tn,n : CARDINAL;
|
|
BEGIN
|
|
n := HIGH(arr);
|
|
tn := ti;
|
|
tv := arr[ti];
|
|
REPEAT
|
|
tp := tn;
|
|
IF tp MOD 2 = 0 THEN
|
|
tn := tp / 2
|
|
ELSE
|
|
tn := (n+1)/2+tp/2
|
|
END;
|
|
arr[tp] := arr[tn];
|
|
UNTIL tn = ti;
|
|
arr[tp] := tv
|
|
END Inner;
|
|
VAR
|
|
done : BOOLEAN;
|
|
i,c : CARDINAL;
|
|
BEGIN
|
|
c := 0;
|
|
Init(arr);
|
|
|
|
REPEAT
|
|
i := 1;
|
|
WHILE i <= (HIGH(arr)/2) DO
|
|
Inner(i);
|
|
INC(i,2)
|
|
END;
|
|
INC(c);
|
|
|
|
done := TRUE;
|
|
FOR i:=0 TO HIGH(arr) DO
|
|
IF arr[i] # INT(i+1) THEN
|
|
done := FALSE;
|
|
BREAK
|
|
END
|
|
END
|
|
UNTIL done;
|
|
|
|
WriteCard(HIGH(arr)+1);
|
|
WriteString(": ");
|
|
WriteCard(c);
|
|
WriteLn
|
|
END PerfectShuffle;
|
|
|
|
(* Main *)
|
|
VAR
|
|
v8 : ARRAY[1..8] OF INTEGER;
|
|
v24 : ARRAY[1..24] OF INTEGER;
|
|
v52 : ARRAY[1..52] OF INTEGER;
|
|
v100 : ARRAY[1..100] OF INTEGER;
|
|
v1020 : ARRAY[1..1020] OF INTEGER;
|
|
v1024 : ARRAY[1..1024] OF INTEGER;
|
|
v10000 : ARRAY[1..10000] OF INTEGER;
|
|
BEGIN
|
|
PerfectShuffle(v8);
|
|
PerfectShuffle(v24);
|
|
PerfectShuffle(v52);
|
|
PerfectShuffle(v100);
|
|
PerfectShuffle(v1020);
|
|
PerfectShuffle(v1024);
|
|
PerfectShuffle(v10000);
|
|
|
|
ReadChar
|
|
END PerfectShuffle.
|