40 lines
970 B
Plaintext
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
|
|
}
|