24 lines
498 B
Nim
24 lines
498 B
Nim
iterator inplacePermutations[T](xs: var seq[T]): var seq[T] =
|
|
assert xs.len <= 24, "permutation of array longer than 24 is not supported"
|
|
|
|
let n = xs.len - 1
|
|
var
|
|
c: array[24, int8]
|
|
i: int = 0
|
|
|
|
for i in 0 .. n: c[i] = int8(i+1)
|
|
|
|
while true:
|
|
yield xs
|
|
if i >= n: break
|
|
|
|
c[i] -= 1
|
|
let j = if (i and 1) == 1: 0 else: int(c[i])
|
|
swap(xs[i+1], xs[j])
|
|
|
|
i = 0
|
|
while c[i] == 0:
|
|
let t = i+1
|
|
c[i] = int8(t)
|
|
i = t
|