Permutations: Difference between revisions

Line 5,691:
This follows the Go language non-recursive example, but is not limited to integers, or even to numbers.
 
<syntaxhighlight lang="langur">val .factorial = fn .x: if(.x < 2: 1; .x * self(.x - 1))
val factorial = fn x:if(x < 2: 1; x * self(x - 1))
 
val .permute = fn(.listplist) {
if .listplist is not list: throw "expected list"
 
val .limit = 10
if len(.listplist) > .limit: throw "permutation limit exceeded (currently {{.limit}})"
 
var .elements = .listplist
var .ordinals = pseries (len .(elements))
 
val .n = len(.ordinals)
var .i, .j
 
for[.p=[.listplist]] of .factorial(len .list(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
}
</syntaxhighlight>
1,007

edits