Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
44
Task/Two-bullet-roulette/Nim/two-bullet-roulette.nim
Normal file
44
Task/Two-bullet-roulette/Nim/two-bullet-roulette.nim
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
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)
|
||||
Loading…
Add table
Add a link
Reference in a new issue