52 lines
901 B
Text
52 lines
901 B
Text
include xpllib; \for Print and StrLen
|
|
|
|
define Maxx = 12;
|
|
char Super;
|
|
int Pos, Cnt(Maxx);
|
|
|
|
func FactSum(N); \1! + 2! + ... + n!
|
|
int N, S, X, F;
|
|
[S:= 0; X:= 0; F:= 1;
|
|
while X < N do
|
|
[X:= X+1;
|
|
F:= F*X;
|
|
S:= S+F;
|
|
];
|
|
return S;
|
|
];
|
|
|
|
func R(N);
|
|
int N, C;
|
|
[if N = 0 then return false;
|
|
C:= Super(Pos - N);
|
|
Cnt(N):= Cnt(N)-1;
|
|
if Cnt(N) = 0 then
|
|
[Cnt(N):= N;
|
|
if R(N-1) = 0 then return false;
|
|
];
|
|
Super(Pos):= C; Pos:= Pos+1;
|
|
return true;
|
|
];
|
|
|
|
proc Superperm(N);
|
|
int N, I, Len;
|
|
[Pos:= N;
|
|
Len:= FactSum(N);
|
|
Super:= ReallocMem(Super, Len+1);
|
|
Super(Len):= 0;
|
|
for I:= 0 to N do Cnt(I):= I;
|
|
for I:= 1 to N do Super(I-1):= I+^0;
|
|
while R(N) do [];
|
|
];
|
|
|
|
int N;
|
|
[Super:= 0;
|
|
for N:= 0 to Maxx-1 do
|
|
[Print("Superperm(%d) ", N);
|
|
Superperm(N);
|
|
Print("len = %d", StrLen(Super));
|
|
\Uncomment next line to see the string itself
|
|
\Print(": %s", Super);
|
|
CrLf(0);
|
|
];
|
|
]
|