RosettaCodeData/Task/Josephus-problem/Wren/josephus-problem.wren
2025-08-11 18:05:26 -07:00

32 lines
978 B
Text

var josephus = Fn.new { |n, k, m|
if (k <= 0 || m <= 0 || n <= k || n <= m) Fiber.abort("One or more parameters are invalid.")
var killed = []
var survived = List.filled(n, 0)
for (i in 0...n) survived[i] = i
var start = k - 1
while (true) {
var end = survived.count - 1
var i = start
var deleted = 0
while (i <= end) {
killed.add(survived.removeAt(i-deleted))
if (survived.count == m) return [survived, killed]
deleted = deleted + 1
i = i + k
}
start = i - end - 1
}
return [survived, killed]
}
var triples = [ [5, 2, 1], [41, 3, 1], [41, 3, 3] ]
for (triple in triples) {
var n = triple[0]
var k = triple[1]
var m = triple[2]
System.print("Prisoners = %(n), Step = %(k), Survivors = %(m)")
var sk = josephus.call(n, k, m)
System.print("Survived : %(sk[0])")
System.print("Kill order : %(sk[1])")
System.print()
}