RosettaCodeData/Task/100-prisoners/EasyLang/100-prisoners.easy
2026-04-30 12:34:36 -04:00

51 lines
954 B
Text

global drawer[] sampler[] .
proc init .
for i = 1 to 100
drawer[] &= i
sampler[] &= i
.
.
init
proc shuffle_drawer .
for i = len drawer[] downto 2
r = random 1 i
swap drawer[r] drawer[i]
.
.
func play_random .
shuffle_drawer
for prisoner = 1 to 100
for i = 1 to 50
r = random 1 (100 - i + 1)
card = drawer[sampler[r]]
swap sampler[r] sampler[100 - i + 1]
if card = prisoner : break 1
.
if i > 50 : return 0
.
return 1
.
func play_optimal .
shuffle_drawer
for prisoner = 1 to 100
reveal = prisoner
for i = 1 to 50
card = drawer[reveal]
if card = prisoner : break 1
reveal = card
.
if i > 50 : return 0
.
return 1
.
n = 100000
for i to n
win += play_random
.
print "random: " & 100.0 * win / n & "%"
#
win = 0
for i to n
win += play_optimal
.
print "optimal: " & 100.0 * win / n & "%"