fork(1) download
  1. // 麻雀、向聴数の計算
  2.  
  3. const hands = [
  4. [ 5, 6, 7,11,12,13,15,16,17,19,19,21,22,23], /* 和了 [0] -1 */
  5. [ 3, 5, 6, 7,12,13,15,16,17,19,19,21,22,23], /* 聴牌 [1] 0 */
  6. [ 3, 5, 6,12,13,15,16,17,19,19,21,22,23,31], /* 1向聴 [2] 1 */
  7. [ 3, 5, 6,12,13,15,16,17,19,19,21,22,25,31], /* 2向聴 [3] 2 */
  8. [ 1, 5, 6, 7,11,13,14,17,18,20,23,24,26,31], /* 3向聴 [4] 3 */
  9. [ 2, 5, 8,10,10,11,14,14,19,20,22,24,24,27], /* 4向聴 [5] 4 */
  10. [ 0, 1, 1, 5, 7, 9,13,16,18,24,25,29,30,32], /* 5向聴 [6] 5 */
  11. [ 0, 1, 1, 5, 5, 7, 9,13,16,18,24,29,30,32], /* 6向聴 [7] 6 */
  12. [ 0, 5, 7, 9,13,17,18,24,28,29,30,31,32,33], /* 7向聴 [8] 7 */
  13. [ 0, 5, 9,13,17,18,21,24,28,29,30,31,32,33], /* 8向聴 [9] 8 */
  14. ];
  15.  
  16. const hand = hands[4];
  17.  
  18. const hand_pai = new Array(34);
  19. hand_pai.fill(4);
  20. for (let i = 0; i < hand.length; i++) {
  21. hand_pai[hand[i]]--;
  22. }
  23.  
  24. let shanten = 14;
  25.  
  26. const pai = new Array(34);
  27. pai.fill(4);
  28. let count = 0;
  29.  
  30. let patterns = [];
  31.  
  32. const pattern = new Array(5);
  33.  
  34. function calc() {
  35. let c = -1;
  36. for (let i = 0; i < 34; i++) {
  37. c += Math.max(0, hand_pai[i] - pai[i]);
  38. }
  39. if (c < shanten) {
  40. shanten = c;
  41. patterns = [pattern.slice(0)];
  42. } else if (c === shanten) {
  43. patterns.push(pattern.slice(0));
  44. }
  45. }
  46.  
  47. function juntsu(rem, p) {
  48. if (rem === 0) {
  49. count++;
  50. calc();
  51. return;
  52. }
  53. for (let i = p; i < 27; i++) {
  54. if (i % 9 > 6) continue;
  55. if (pai[i] === 0) continue;
  56. if (pai[i+1] === 0) continue;
  57. if (pai[i+2] === 0) continue;
  58. pai[i]--;
  59. pai[i+1]--;
  60. pai[i+2]--;
  61. pattern[5-rem] = 10101 * (i+1) + 102;
  62. juntsu(rem-1, i);
  63. pai[i]++;
  64. pai[i+1]++;
  65. pai[i+2]++;
  66.  
  67. }
  68. }
  69.  
  70. function mentsu(rem, p) {
  71. if (rem === 0) {
  72. count++;
  73. calc();
  74. return;
  75. }
  76. for (let i = p; i < 34; i++) {
  77. if (pai[i] < 4) continue;
  78. pai[i] -= 3;
  79. pattern[5-rem] = 10101 * (i+1);
  80. mentsu(rem-1, i+1);
  81. juntsu(rem-1, 0);
  82. pai[i] += 3;
  83. }
  84. }
  85.  
  86. function atama() {
  87. for (let i = 0; i < 34; i++) {
  88. pai[i] -= 2;
  89. pattern[0] = 101 * (i+1);
  90. mentsu(4, 0);
  91. juntsu(4, 0);
  92. pai[i] += 2;
  93. }
  94. }
  95.  
  96. atama();
  97. patterns.sort();
  98.  
  99. console.log(count);
  100. console.log(hand.map((e)=>e+1));
  101. console.log(shanten);
  102. console.log(patterns.length);
  103. console.log(patterns);
  104.  
  105.  
Success #stdin #stdout 2.27s 35044KB
stdin
stdout
12971847
[ 2, 6, 7, 8, 12, 14, 15, 18, 19, 21, 24, 25, 27, 32 ]
3
45
[ [ 1212, 60708, 131415, 192021, 232425 ],
  [ 1212, 60708, 131415, 192021, 242526 ],
  [ 1212, 60708, 131415, 192021, 252627 ],
  [ 1212, 60708, 141516, 192021, 232425 ],
  [ 1212, 60708, 141516, 192021, 242526 ],
  [ 1212, 60708, 141516, 192021, 252627 ],
  [ 1515, 60708, 121314, 192021, 232425 ],
  [ 1515, 60708, 121314, 192021, 242526 ],
  [ 1515, 60708, 121314, 192021, 252627 ],
  [ 1818, 60708, 121314, 192021, 232425 ],
  [ 1818, 60708, 121314, 192021, 242526 ],
  [ 1818, 60708, 121314, 192021, 252627 ],
  [ 1818, 60708, 131415, 192021, 232425 ],
  [ 1818, 60708, 131415, 192021, 242526 ],
  [ 1818, 60708, 131415, 192021, 252627 ],
  [ 1818, 60708, 141516, 192021, 232425 ],
  [ 1818, 60708, 141516, 192021, 242526 ],
  [ 1818, 60708, 141516, 192021, 252627 ],
  [ 202, 60708, 121314, 192021, 232425 ],
  [ 202, 60708, 121314, 192021, 242526 ],
  [ 202, 60708, 121314, 192021, 252627 ],
  [ 202, 60708, 131415, 192021, 232425 ],
  [ 202, 60708, 131415, 192021, 242526 ],
  [ 202, 60708, 131415, 192021, 252627 ],
  [ 202, 60708, 141516, 192021, 232425 ],
  [ 202, 60708, 141516, 192021, 242526 ],
  [ 202, 60708, 141516, 192021, 252627 ],
  [ 2424, 60708, 121314, 192021, 252627 ],
  [ 2424, 60708, 131415, 192021, 252627 ],
  [ 2424, 60708, 141516, 192021, 252627 ],
  [ 2727, 60708, 121314, 192021, 232425 ],
  [ 2727, 60708, 121314, 192021, 242526 ],
  [ 2727, 60708, 131415, 192021, 232425 ],
  [ 2727, 60708, 131415, 192021, 242526 ],
  [ 2727, 60708, 141516, 192021, 232425 ],
  [ 2727, 60708, 141516, 192021, 242526 ],
  [ 3232, 60708, 121314, 192021, 232425 ],
  [ 3232, 60708, 121314, 192021, 242526 ],
  [ 3232, 60708, 121314, 192021, 252627 ],
  [ 3232, 60708, 131415, 192021, 232425 ],
  [ 3232, 60708, 131415, 192021, 242526 ],
  [ 3232, 60708, 131415, 192021, 252627 ],
  [ 3232, 60708, 141516, 192021, 232425 ],
  [ 3232, 60708, 141516, 192021, 242526 ],
  [ 3232, 60708, 141516, 192021, 252627 ] ]