40 lines
1.0 KiB
Plaintext
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
|
|
}
|