Two bullet roulette: Difference between revisions
Content added Content deleted
Line 635: | Line 635: | ||
load, load, spin, fire, spin, fire produces 55.725% deaths. |
load, load, spin, fire, spin, fire produces 55.725% deaths. |
||
load, load, spin, fire, fire produces 49.875% deaths.</pre> |
load, load, spin, fire, fire produces 49.875% deaths.</pre> |
||
=={{header|Nim}}== |
|||
<lang Nim>import algorithm, random, sequtils, strformat, strutils, tables |
|||
type |
|||
Revolver = array[6, bool] |
|||
Action {.pure.} = enum Load, Spin, Fire, Error |
|||
const Actions = {'L': Load, 'S': Spin, 'F': Fire}.toTable |
|||
func spin(revolver: var Revolver; count: Positive) = |
|||
revolver.rotateLeft(-count) |
|||
func load(revolver: var Revolver) = |
|||
while revolver[1]: |
|||
revolver.spin(1) |
|||
revolver[1] = true |
|||
revolver.spin(1) |
|||
func fire(revolver: var Revolver): bool = |
|||
result = revolver[0] |
|||
revolver.spin(1) |
|||
proc test(scenario: string) = |
|||
let actions = scenario.mapIt(Actions.getOrDefault(it, Error)) |
|||
var deaths = 0 |
|||
var count = 100_000 |
|||
for _ in 1..count: |
|||
var revolver: Revolver |
|||
for action in actions: |
|||
case action |
|||
of Load: |
|||
revolver.load() |
|||
of Spin: |
|||
revolver.spin(rand(1..6)) |
|||
of Fire: |
|||
if revolver.fire(): |
|||
inc deaths |
|||
break |
|||
of Error: |
|||
raise newException(ValueError, "encountered an unknown action.") |
|||
echo &"""{100 * deaths / count:5.2f}% deaths for scenario {actions.join(", ")}.""" |
|||
randomize() |
|||
for scenario in ["LSLSFSF", "LSLSFF", "LLSFSF", "LLSFF"]: |
|||
test(scenario)</lang> |
|||
{{out}} |
|||
<pre>55.73% deaths for scenario Load, Spin, Load, Spin, Fire, Spin, Fire. |
|||
58.09% deaths for scenario Load, Spin, Load, Spin, Fire, Fire. |
|||
55.74% deaths for scenario Load, Load, Spin, Fire, Spin, Fire. |
|||
50.14% deaths for scenario Load, Load, Spin, Fire, Fire.</pre> |
|||
=={{header|Perl}}== |
=={{header|Perl}}== |