RosettaCodeData/Task/Permutations/Langur/permutations.langur

40 lines
1 KiB
Text
Raw Permalink Normal View History

2024-04-19 16:56:29 -07:00
val .factorial = fn(.x) if(.x < 2: 1; .x * self(.x - 1))
2023-07-01 11:58:00 -04:00
2024-04-19 16:56:29 -07:00
val .permute = fn(.list) {
if .list is not list: throw "expected list"
2023-07-01 11:58:00 -04:00
val .limit = 10
2024-03-06 22:25:12 -08:00
if len(.list) > .limit: throw $"permutation limit exceeded (currently \.limit;)"
2023-07-01 11:58:00 -04:00
2024-03-06 22:25:12 -08:00
var .elements = .list
2023-07-01 11:58:00 -04:00
var .ordinals = pseries len .elements
val .n = len(.ordinals)
var .i, .j
2024-03-06 22:25:12 -08:00
for[.p=[.list]] of .factorial(len .list)-1 {
2023-07-01 11:58:00 -04:00
.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
}