RosettaCodeData/Task/100-prisoners/Red/100-prisoners.red
2023-07-01 13:44:08 -04:00

42 lines
1.7 KiB
Text

Red []
K_runs: 100000
repeat n 100 [append rand_arr: [] n] ;; define array/series with numbers 1..100
;;-------------------------------
strat_optimal: function [pris ][
;;-------------------------------
locker: pris ;; start with locker equal to prisoner number
loop 50 [
if Board/:locker = pris [ return true ] ;; locker with prisoner number found
locker: Board/:locker
]
false ;; number not found - fail
]
;;-------------------------------
strat_rand: function [pris ][
;;-------------------------------
random rand_arr ;; define set of random lockers
repeat n 50 [ if Board/(rand_arr/:n) = pris [ return true ] ] ;; try first 50, found ? then return success
false
]
;;------------------------------
check_board: function [ strat][
;;------------------------------
repeat pris 100 [ ;; for each prisoner
either strat = 'optimal [ unless strat_optimal pris [return false ] ]
[ unless strat_rand pris [return false ] ]
]
true ;; all 100 prisoners passed test
]
saved: saved_rand: 0 ;; count all saved runs per strategy
loop K_runs [
Board: random copy rand_arr ;; new board for every run
if check_board 'optimal [saved: saved + 1] ;; optimal stategy
if check_board 'rand [saved_rand: saved_rand + 1] ;; random strategy
]
print ["runs" k_runs newline "Percent saved opt.strategy:" saved * 100.0 / k_runs ]
print ["Percent saved random strategy:" saved_rand * 100.0 / k_runs ]