(phixonline)-->
with javascript_semantics
function factSum(int n)
integer s = 0, f = 1
for i=1 to n do
f *= i
s += f
end for
return s
end function
procedure superPerm(int n)
atom t0 = time()
string chars = "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[1..n]
integer f = factorial(n)
sequence perms = repeat("",f)
for i=1 to f do
perms[i] = permute(i,chars)
end for
string res = perms[$]
perms = perms[1..$-1]
while length(perms) do
integer best = 0, bi = length(perms)
for i=1 to length(perms) do
string pi = perms[i]
integer m = length(res),
k = find(res[m],pi)
for l=k to 1 by -1 do
if res[m]!=pi[l] then
k = 0
exit
end if
m -= 1
end for
if k>best then
best = k
bi = i
end if
end for
if match(perms[bi],res) then
?9/0 -- (sanity check)
else
res &= perms[bi][best+1..$]
end if
perms[bi] = perms[$]
perms = perms[1..$-1]
end while
integer lr = length(res), fsn = factSum(n)
string op = {"<","=",">"}[compare(lr,fsn)+2]
t0 = time()-t0
string e = iff(t0>1?", "&elapsed(t0):"")
printf(1,"superPerm(%d) len = %d (%s%d%s)\n",{n,lr,op,fsn,e})
end procedure
for n=1 to 7 do -- (note: 8 takes 65x longer than 7)
superPerm(n)
end for