RosettaCodeData/Task/Two-bullet-roulette/Wren/two-bullet-roulette.wren
2024-03-06 22:25:12 -08:00

72 lines
1.4 KiB
Text

import "random" for Random
import "./fmt" for Fmt
var Rand = Random.new()
class Revolver {
construct new() {
_cylinder = List.filled(6, false)
}
rshift() {
var t = _cylinder[-1]
for (i in 4..0) _cylinder[i+1] = _cylinder[i]
_cylinder[0] = t
}
unload() {
for (i in 0..5) _cylinder[i] = false
}
load() {
while (_cylinder[0]) rshift()
_cylinder[0] = true
rshift()
}
spin() {
for (i in 1..Rand.int(1, 7)) rshift()
}
fire() {
var shot = _cylinder[0]
rshift()
return shot
}
method(s) {
unload()
for (c in s) {
if (c == "L") {
load()
} else if (c == "S") {
spin()
} else if (c == "F") {
if (fire()) return 1
}
}
return 0
}
static mstring(s) {
var l = []
for (c in s) {
if (c == "L") {
l.add("load")
} else if (c == "S") {
l.add("spin")
} else if (c == "F") {
l.add("fire")
}
}
return l.join(", ")
}
}
var rev = Revolver.new()
var tests = 100000
for (m in ["LSLSFSF", "LSLSFF", "LLSFSF", "LLSFF"]) {
var sum = 0
for (t in 1..tests) sum = sum + rev.method(m)
Fmt.print("$-40s produces $6.3f\% deaths.", Revolver.mstring(m), sum * 100 / tests)
}