Two bullet roulette: Difference between revisions

Line 635:
load, load, spin, fire, spin, fire produces 55.725% deaths.
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}}==
Anonymous user