53 lines
946 B
Plaintext
53 lines
946 B
Plaintext
class
|
|
APPLICATION
|
|
|
|
create
|
|
make
|
|
|
|
feature
|
|
|
|
make
|
|
do
|
|
io.put_string ("Survivor is prisoner: " + execute (12, 4).out)
|
|
end
|
|
|
|
execute (n, k: INTEGER): INTEGER
|
|
-- Survivor of 'n' prisoners, when every 'k'th is executed.
|
|
require
|
|
n_positive: n > 0
|
|
k_positive: k > 0
|
|
n_larger: n > k
|
|
local
|
|
killidx: INTEGER
|
|
prisoners: LINKED_LIST [INTEGER]
|
|
do
|
|
create prisoners.make
|
|
across
|
|
0 |..| (n - 1) as c
|
|
loop
|
|
prisoners.extend (c.item)
|
|
end
|
|
io.put_string ("Prisoners are executed in the order:%N")
|
|
killidx := 1
|
|
from
|
|
until
|
|
prisoners.count <= 1
|
|
loop
|
|
killidx := killidx + k - 1
|
|
from
|
|
until
|
|
killidx <= prisoners.count
|
|
loop
|
|
killidx := killidx - prisoners.count
|
|
end
|
|
io.put_string (prisoners.at (killidx).out + "%N")
|
|
prisoners.go_i_th (killidx)
|
|
prisoners.remove
|
|
end
|
|
Result := prisoners.at (1)
|
|
ensure
|
|
Result_in_range: Result >= 0 and Result < n
|
|
end
|
|
|
|
end
|