100 prisoners: Difference between revisions
Content added Content deleted
(Added True BASIC) |
(Add Ecstasy example) |
||
Line 2,217: | Line 2,217: | ||
=={{header|Delphi}}== |
=={{header|Delphi}}== |
||
See [[#Pascal]]. |
See [[#Pascal]]. |
||
=={{header|EasyLang}}== |
=={{header|EasyLang}}== |
||
<syntaxhighlight> |
<syntaxhighlight> |
||
Line 2,284: | Line 2,285: | ||
random: 0.000% |
random: 0.000% |
||
optimal: 30.800% |
optimal: 30.800% |
||
</pre> |
|||
=={{header|Ecstasy}}== |
|||
<syntaxhighlight lang="ecstasy"> |
|||
module OneHundredPrisoners { |
|||
@Inject Console console; |
|||
void run() { |
|||
console.print($"# of executions: {attempts}"); |
|||
console.print($"Optimal play success rate: {simulate(tryOpt)}%"); |
|||
console.print($" Random play success rate: {simulate(tryRnd)}%"); |
|||
} |
|||
Int attempts = 10000; |
|||
Dec simulate(function Boolean(Int[]) allFoundNumber) { |
|||
Int[] drawers = new Int[100](i->i); |
|||
Int pardoned = 0; |
|||
for (Int i : 1..attempts) { |
|||
if (allFoundNumber(drawers.shuffled())) { |
|||
++pardoned; |
|||
} |
|||
} |
|||
return (pardoned * 1000000 / attempts).toDec() / 10000; |
|||
} |
|||
Boolean tryRnd(Int[] drawers) { |
|||
Inmates: for (Int inmate : 0..<100) { |
|||
Int[] choices = drawers.shuffled(); |
|||
for (Int attempt : 0..<50) { |
|||
if (drawers[choices[attempt]] == inmate) { |
|||
continue Inmates; |
|||
} |
|||
} |
|||
return False; |
|||
} |
|||
return True; |
|||
} |
|||
Boolean tryOpt(Int[] drawers) { |
|||
Inmates: for (Int inmate : 0..<100) { |
|||
Int choice = inmate; |
|||
for (Int attempt : 0..<50) { |
|||
if (drawers[choice] == inmate) { |
|||
continue Inmates; |
|||
} |
|||
choice = drawers[choice]; |
|||
} |
|||
return False; |
|||
} |
|||
return True; |
|||
} |
|||
} |
|||
</syntaxhighlight> |
|||
{{out}} |
|||
<pre> |
|||
# of executions: 10000 |
|||
Optimal play success rate: 30.1% |
|||
Random play success rate: 0% |
|||
</pre> |
</pre> |
||