Two bullet roulette: Difference between revisions
Content added Content deleted
m (→{{header|REXX}}: added which of the options had the highest percentage of deaths as per the task's requirement.) |
|||
Line 173: | Line 173: | ||
load, load, spin, fire, spin, fire produces 55.487% deaths. |
load, load, spin, fire, spin, fire produces 55.487% deaths. |
||
load, load, spin, fire, fire produces 50.289% deaths.</pre> |
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}}== |
=={{header|Factor}}== |