RosettaCodeData/Task/Permutations/Nim/permutations-2.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