Jump to content

Two bullet roulette: Difference between revisions

m (→‎{{header|REXX}}: added which of the options had the highest percentage of deaths as per the task's requirement.)
Line 173:
load, load, spin, fire, spin, fire produces 55.487% deaths.
load, load, spin, fire, fire produces 50.289% deaths.</pre>
 
=={{header|C++}}==
{{trans|C}}
<lang cpp>#include <array>
#include <iomanip>
#include <iostream>
#include <random>
#include <sstream>
 
class Roulette {
private:
std::array<bool, 6> cylinder;
 
std::mt19937 gen;
std::uniform_int_distribution<> distrib;
 
int next_int() {
return distrib(gen);
}
 
void rshift() {
std::rotate(cylinder.begin(), cylinder.begin() + 1, cylinder.end());
}
 
void unload() {
std::fill(cylinder.begin(), cylinder.end(), false);
}
 
void load() {
while (cylinder[0]) {
rshift();
}
cylinder[0] = true;
rshift();
}
 
void spin() {
int lim = next_int();
for (int i = 1; i < lim; i++) {
rshift();
}
}
 
bool fire() {
auto shot = cylinder[0];
rshift();
return shot;
}
 
public:
Roulette() {
std::random_device rd;
gen = std::mt19937(rd());
distrib = std::uniform_int_distribution<>(1, 6);
 
unload();
}
 
int method(const std::string &s) {
unload();
for (auto c : s) {
switch (c) {
case 'L':
load();
break;
case 'S':
spin();
break;
case 'F':
if (fire()) {
return 1;
}
break;
}
}
return 0;
}
};
 
std::string mstring(const std::string &s) {
std::stringstream ss;
bool first = true;
 
auto append = [&ss, &first](const std::string s) {
if (first) {
first = false;
} else {
ss << ", ";
}
ss << s;
};
 
for (auto c : s) {
switch (c) {
case 'L':
append("load");
break;
case 'S':
append("spin");
break;
case 'F':
append("fire");
break;
}
}
 
return ss.str();
}
 
void test(const std::string &src) {
const int tests = 100000;
int sum = 0;
 
Roulette r;
for (int t = 0; t < tests; t++) {
sum += r.method(src);
}
 
double pc = 100.0 * sum / tests;
 
std::cout << std::left << std::setw(40) << mstring(src) << " produces " << pc << "% deaths.\n";
}
 
int main() {
test("LSLSFSF");
test("LSLSFF");
test("LLSFSF");
test("LLSFF");
 
return 0;
}</lang>
{{out}}
<pre>load, spin, load, spin, fire, spin, fire produces 55.487% deaths.
load, spin, load, spin, fire, fire produces 58.542% deaths.
load, load, spin, fire, spin, fire produces 55.675% deaths.
load, load, spin, fire, fire produces 50.051% deaths.</pre>
 
=={{header|Factor}}==
1,452

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.