最初に結果だけ述べると
toID1[{a_, b_, c_, d_, e_}] :=
Sum[Binomial[25 - k, 4], {k, a - 1}] +
Sum[Binomial[25 - a - k, 3], {k, b - a - 1}] +
Sum[Binomial[25 - b - k, 2], {k, c - b - 1}] +
Sum[Binomial[25 - c - k, 1], {k, d - c - 1}] + e - d;
toID2[{a_, b_, c_, d_}] :=
Sum[Binomial[25 - k, 3], {k, a - 1}] +
Sum[Binomial[25 - a - k, 2], {k, b - a - 1}] +
Sum[Binomial[25 - b - k, 1], {k, c - b - 1}] + d - c;
sgn0[x_] :=
Which[x == 1, 16, x == 2, 9, x == 3, 15, x == 4, 21, x == 5, 4,
x == 6, 8, x == 7, 14, x == 8, 20, x == 9, 24, x == 10, 1, x == 11,
3, x == 12, 7, x == 13, 13, x == 14, 19, x == 15, 23, x == 16, 25,
x == 17, 2, x == 18, 6, x == 19, 12, x == 20, 18, x == 21, 22,
x == 22, 5, x == 23, 11, x == 24, 17, x == 25, 10];
mir0[x_] :=
Which[x == 1, 1, x == 2, 4, x == 3, 3, x == 4, 2, x == 5, 9, x == 6,
8, x == 7, 7, x == 8, 6, x == 9, 5, x == 10, 16, x == 11, 15,
x == 12, 14, x == 13, 13, x == 14, 12, x == 15, 11, x == 16, 10,
x == 17, 21, x == 18, 20, x == 19, 19, x == 20, 18, x == 21, 17,
x == 22, 24, x == 23, 23, x == 24, 22, x == 25, 25];
toIDall[{a_, b_, c_, d_, e_}] :=
Sum[Binomial[25 - k, 4], {k, a - 1}] +
Sum[Binomial[25 - a - k, 3], {k, b - a - 1}] +
Sum[Binomial[25 - b - k, 2], {k, c - b - 1}] +
Sum[Binomial[25 - c - k, 1], {k, d - c - 1}] + e - d;
toID12[{a_, b_, c_, d_, e_, f_, g_, h_, i_, j_, l_, m_}] :=
Sum[Binomial[25 - k, 11], {k, a - 1}] +
Sum[Binomial[25 - a - k, 10], {k, b - a - 1}] +
Sum[Binomial[25 - b - k, 9], {k, c - b - 1}] +
Sum[Binomial[25 - c - k, 8], {k, d - c - 1}] +
Sum[Binomial[25 - d - k, 7], {k, e - d - 1}] +
Sum[Binomial[25 - e - k, 6], {k, f - e - 1}] +
Sum[Binomial[25 - f - k, 5], {k, g - f - 1}] +
Sum[Binomial[25 - g - k, 4], {k, h - g - 1}] +
Sum[Binomial[25 - h - k, 3], {k, i - h - 1}] +
Sum[Binomial[25 - i - k, 2], {k, j - i - 1}] +
Sum[Binomial[25 - j - k, 1], {k, l - j - 1}] + m - l;
toID11[{a_, b_, c_, d_, e_, f_, g_, h_, i_, j_, l_}] :=
Sum[Binomial[25 - k, 10], {k, a - 1}] +
Sum[Binomial[25 - a - k, 9], {k, b - a - 1}] +
Sum[Binomial[25 - b - k, 8], {k, c - b - 1}] +
Sum[Binomial[25 - c - k, 7], {k, d - c - 1}] +
Sum[Binomial[25 - d - k, 6], {k, e - d - 1}] +
Sum[Binomial[25 - e - k, 5], {k, f - e - 1}] +
Sum[Binomial[25 - f - k, 4], {k, g - f - 1}] +
Sum[Binomial[25 - g - k, 3], {k, h - g - 1}] +
Sum[Binomial[25 - h - k, 2], {k, i - h - 1}] +
Sum[Binomial[25 - i - k, 1], {k, j - i - 1}] + l - j;
toID10[{a_, b_, c_, d_, e_, f_, g_, h_, i_, j_}] :=
Sum[Binomial[25 - k, 9], {k, a - 1}] +
Sum[Binomial[25 - a - k, 8], {k, b - a - 1}] +
Sum[Binomial[25 - b - k, 7], {k, c - b - 1}] +
Sum[Binomial[25 - c - k, 6], {k, d - c - 1}] +
Sum[Binomial[25 - d - k, 5], {k, e - d - 1}] +
Sum[Binomial[25 - e - k, 4], {k, f - e - 1}] +
Sum[Binomial[25 - f - k, 3], {k, g - f - 1}] +
Sum[Binomial[25 - g - k, 2], {k, h - g - 1}] +
Sum[Binomial[25 - h - k, 1], {k, i - h - 1}] + j - i;
toID9[{a_, b_, c_, d_, e_, f_, g_, h_, i_}] :=
Sum[Binomial[25 - k, 8], {k, a - 1}] +
Sum[Binomial[25 - a - k, 7], {k, b - a - 1}] +
Sum[Binomial[25 - b - k, 6], {k, c - b - 1}] +
Sum[Binomial[25 - c - k, 5], {k, d - c - 1}] +
Sum[Binomial[25 - d - k, 4], {k, e - d - 1}] +
Sum[Binomial[25 - e - k, 3], {k, f - e - 1}] +
Sum[Binomial[25 - f - k, 2], {k, g - f - 1}] +
Sum[Binomial[25 - g - k, 1], {k, h - g - 1}] + i - h;
toID8[{a_, b_, c_, d_, e_, f_, g_, h_}] :=
Sum[Binomial[25 - k, 7], {k, a - 1}] +
Sum[Binomial[25 - a - k, 6], {k, b - a - 1}] +
Sum[Binomial[25 - b - k, 5], {k, c - b - 1}] +
Sum[Binomial[25 - c - k, 4], {k, d - c - 1}] +
Sum[Binomial[25 - d - k, 3], {k, e - d - 1}] +
Sum[Binomial[25 - e - k, 2], {k, f - e - 1}] +
Sum[Binomial[25 - f - k, 1], {k, g - f - 1}] + h - g;
sgn[vec_] := Sort[Table[sgn0[vec[[i]]], {i, 1, Length[vec]}]];
mir[vec_] := Sort[Table[mir0[vec[[i]]], {i, 1, Length[vec]}]];
check[vec_] := {toIDall[mir[vec]], toIDall[mir[sgn[vec]]],
toIDall[mir[sgn[sgn[vec]]]], toIDall[mir[sgn[sgn[sgn[vec]]]]],
toIDall[sgn[vec]], toIDall[sgn[sgn[vec]]],
toIDall[sgn[sgn[sgn[vec]]]]}
ほとんど四則計算などでの処理となっている。toIDというのは{1,2,3,4,5}の組を1番目、{21,22,23,24,25}の組を最後つまり53130(=25C5)番目とするように和と積で表したプログラムである。sgn0やmir0というのは、ビンゴバルーンの盤面が対称面が多いので処理を軽減するために同一ターンを判定するのに使っている。例えば左右対称の関数は{1,2,3,4,5}を入力すると、軸上の1,3は変わらず、2,4はお互いに位置が入れ替わるので昇順に並べると結局同一置換。5のみが軸対象の9に移動するので{1,2,3,4,9}を返す。checkの関数は裏返したり軸対象にしたり回転させたり様々な同一パターンを探るための関数である。
do[i_] :=
For[l = 1, l <= 1, l++, first5 = first5all[[i]]; dai1 = 0; dai2 = 0;
prevodds = 0; fly = 0;
For[q = 1, q <= 7, q++,
If[check[first5all[[i]]][[q]] < i, fly = 1]];
Which[fly == 0,
For[j = 1, j <= 12650, j++, set2 = free2[[j]];
rest3 = Subsets[Complement[all, first5], {3}]; odds = 0;
For[k = 1, k <= 1140, k++, baloon = Table[0, 25];
cons = Union[first5, rest3[[k]], set2];
Which[Length[cons] == 8, odds += 5*result8[[toID8[cons]]],
Length[cons] == 9, odds += 4*result9[[toID9[cons]]],
Length[cons] == 10, odds += 3*result10[[toID10[cons]]],
Length[cons] == 11, odds += 2*result11[[toID11[cons]]],
Length[cons] == 12, odds += result12[[toID12[cons]]]]];
If[odds > prevodds, dai1 = j; dai2 = odds; prevodds = odds]];
Return[{dai1, dai2/1140}], fly == 1, Return[{0, 0}]];
If[QuotientRemainder[i, 100][[2]] == 0, Print[{dai1, dai2}]]];
ここが本体。各マスへの入賞パターンをすべて把握し、その中で最大のものを記録せよ、というプログラムである。
しかしこれ、簡単そうに見えるが、FREE4個ともなると53130通り?もの5級終了後のパターンにFREEの組み合わせ1140通りを乗じてそのすべてにオッズ処理をしなければならない。
よっていくらPCのプログラミングで素早く計算ができるとは言っても、このブログの過去を見ればわかる通り、CPUを並立処理で100%近くで夜通し延々と毎日稼働させ続けて1か月かかった。
しかしいったんデータさえ手に入れてしまえば、ビンゴバルーンのすべてのパターン、すべてのFREE配置個数に対してもっとも配当の期待値が高額となる配置方法を得られたということになるのでその成果は大きいはず…だがまあ別に使わなくてもええか(本音)FREE4個とか需要ないやろ…。