fork download
  1. #include <vector>
  2. #include <array>
  3. #include <iostream>
  4.  
  5. enum class outcome {
  6. crit_fail,
  7. fail,
  8. marginal,
  9. degree1,
  10. degree2,
  11. degree3,
  12. degree4,
  13. };
  14.  
  15. struct pool_result {
  16. int log2_weight = 0;
  17. outcome result = outcome::fail;
  18. };
  19.  
  20. enum class die_result {
  21. one,
  22. fail,
  23. success,
  24. six,
  25. };
  26.  
  27. die_result unpack_one(unsigned x) {
  28. return static_cast<die_result>(x & 3);
  29. }
  30.  
  31. // 2 bits per die result
  32. std::vector<die_result> unpack(unsigned x, std::size_t count) {
  33. std::vector<die_result> retval;
  34. retval.reserve(count);
  35. for (std::size_t i = 0; i < count; ++i) {
  36. retval.push_back(unpack_one(x));
  37. x = x >> 2;
  38. }
  39. return retval;
  40. }
  41.  
  42. pool_result evaluate( std::vector<die_result> const& r, int difficulty, int auto_success )
  43. {
  44. int ones = 0;
  45. int failures = 0;
  46. int successes = 0;
  47. int sixes = 0;
  48. for (auto x : r)
  49. {
  50. switch (x) {
  51. case die_result::one: ++ones; ++failures; break;
  52. case die_result::fail: ++failures; break;
  53. case die_result::success: ++successes; break;
  54. case die_result::six: ++successes; ++sixes; break;
  55. }
  56. }
  57. pool_result retval;
  58. retval.log2_weight = failures - ones + successes - sixes;
  59.  
  60. bool success = (successes + auto_success) >= difficulty;
  61.  
  62. if (!success && ones > successes)
  63. retval.result = outcome::crit_fail;
  64. else if (!success)
  65. retval.result = outcome::fail;
  66. else if (sixes == 0)
  67. retval.result = outcome::marginal;
  68. else if (sixes == 1)
  69. retval.result = outcome::degree1;
  70. else if (sixes == 2)
  71. retval.result = outcome::degree2;
  72. else if (sixes == 3)
  73. retval.result = outcome::degree3;
  74. else if (sixes >= 4)
  75. retval.result = outcome::degree4;
  76. return retval;
  77. }
  78.  
  79. using table = std::array< pool_result, (1<<24) >;
  80.  
  81. table solve( int dice, int difficulty) {
  82. int bonus_dice = (std::max)(dice-12, 0);
  83. if (dice > 12) dice = 12;
  84. int table_size = (1 << (dice*2));
  85. table retval;
  86. for (int x = 0; x < table_size; ++x)
  87. {
  88. retval[x] = evaluate( unpack(x, dice), difficulty, bonus_dice );
  89. }
  90. return retval;
  91. }
  92.  
  93.  
  94. int main() {
  95. printf("Hello\n");
  96. std::cerr << "Working...\n";
  97.  
  98. auto result = solve(12, 4);
  99. int prob[7] = {0};
  100. for (auto r : result)
  101. {
  102. prob[static_cast<int>(r.result)] += (1<<r.log2_weight);
  103. }
  104.  
  105. for (auto p:prob)
  106. std::cout << (p/double(1<<24)) << "\n";
  107. }
Success #stdin #stdout #stderr 1.93s 134824KB
stdin
Standard input is empty
stdout
Hello
4.28516
5.18607
11.2728
30.7715
36.6361
25.3533
16.2414
stderr
Working...