42 lines
1.0 KiB
Lua
42 lines
1.0 KiB
Lua
#!/usr/bin/env luajit
|
|
-- Iterative version
|
|
local function ipermgen(a,b)
|
|
if a==0 then return end
|
|
local taken = {} local slots = {}
|
|
for i=1,a do slots[i]=0 end
|
|
for i=1,b do taken[i]=false end
|
|
local index = 1
|
|
while index > 0 do repeat
|
|
repeat slots[index] = slots[index] + 1
|
|
until slots[index] > b or not taken[slots[index]]
|
|
if slots[index] > b then
|
|
slots[index] = 0
|
|
index = index - 1
|
|
if index > 0 then
|
|
taken[slots[index]] = false
|
|
end
|
|
break
|
|
else
|
|
taken[slots[index]] = true
|
|
end
|
|
if index == a then
|
|
coroutine.yield(slots)
|
|
taken[slots[index]] = false
|
|
break
|
|
end
|
|
index = index + 1
|
|
until true end
|
|
end
|
|
local function iperm(a)
|
|
local co=coroutine.create(function() ipermgen(a,a) end)
|
|
return function()
|
|
local code,res=coroutine.resume(co)
|
|
return res
|
|
end
|
|
end
|
|
|
|
local a=arg[1] and tonumber(arg[1]) or 3
|
|
for p in iperm(a) do
|
|
print(table.concat(p, " "))
|
|
end
|