RosettaCodeData/Task/Permutations/Langur/permutations.langur

40 lines
975 B
Text
Raw Permalink Normal View History

2026-04-30 12:34:36 -04:00
val factorial = fn(x) { if(x < 2: 1; x * fn((x - 1))) }
2023-07-01 11:58:00 -04:00
2024-07-13 15:19:22 -07:00
val permute = fn(plist) {
if plist is not list: throw "expected list"
2023-07-01 11:58:00 -04:00
2024-07-13 15:19:22 -07:00
val limit = 10
if len(plist) > limit: throw "permutation limit exceeded (currently {{limit}})"
2023-07-01 11:58:00 -04:00
2024-07-13 15:19:22 -07:00
var elements = plist
2025-02-27 18:35:13 -05:00
var ordinals = series(len(elements))
2023-07-01 11:58:00 -04:00
2024-07-13 15:19:22 -07:00
val n = len(ordinals)
var i, j
2023-07-01 11:58:00 -04:00
2024-07-13 15:19:22 -07:00
for[p=[plist]] of factorial(len(plist))-1 {
i = n - 1
j = n
while ordinals[i] > ordinals[i+1] {
i -= 1
2023-07-01 11:58:00 -04:00
}
2024-07-13 15:19:22 -07:00
while ordinals[j] < ordinals[i] {
j -= 1
2023-07-01 11:58:00 -04:00
}
2024-07-13 15:19:22 -07:00
ordinals[i], ordinals[j] = ordinals[j], ordinals[i]
elements[i], elements[j] = elements[j], elements[i]
2023-07-01 11:58:00 -04:00
2024-07-13 15:19:22 -07:00
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]
2023-07-01 11:58:00 -04:00
}
2024-07-13 15:19:22 -07:00
p = more(p, elements)
2023-07-01 11:58:00 -04:00
}
}
2024-07-13 15:19:22 -07:00
for e in permute([1, 3.14, 7]) {
writeln e
2023-07-01 11:58:00 -04:00
}