RosettaCodeData/Task/Permutations/Langur/permutations.langur

40 lines
970 B
Plaintext

val factorial = fn x:if(x < 2: 1; x * fn((x - 1)))
val permute = fn(plist) {
if plist is not list: throw "expected list"
val limit = 10
if len(plist) > limit: throw "permutation limit exceeded (currently {{limit}})"
var elements = plist
var ordinals = series(len(elements))
val n = len(ordinals)
var i, j
for[p=[plist]] of factorial(len(plist))-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
}