RosettaCodeData/Task/Permutations/Langur/permutations.langur

40 lines
1.0 KiB
Plaintext

val .factorial = fn(.x) if(.x < 2: 1; .x * self(.x - 1))
val .permute = fn(.list) {
if .list is not list: throw "expected list"
val .limit = 10
if len(.list) > .limit: throw $"permutation limit exceeded (currently \.limit;)"
var .elements = .list
var .ordinals = pseries len .elements
val .n = len(.ordinals)
var .i, .j
for[.p=[.list]] of .factorial(len .list)-1 {
.i = .n - 1
.j = .n
while .ordinals[.i] > .ordinals[.i+1] {
.i -= 1
}
while .ordinals[.j] < .ordinals[.i] {
.j -= 1
}
.ordinals[.i], .ordinals[.j] = .ordinals[.j], .ordinals[.i]
.elements[.i], .elements[.j] = .elements[.j], .elements[.i]
.i += 1
for .j = .n; .i < .j ; .i, .j = .i+1, .j-1 {
.ordinals[.i], .ordinals[.j] = .ordinals[.j], .ordinals[.i]
.elements[.i], .elements[.j] = .elements[.j], .elements[.i]
}
.p = more .p, .elements
}
}
for .e in .permute([1, 3.14, 7]) {
writeln .e
}