ブログ内検索

2019年12月7日土曜日

17-5 同一パターン補間のプログラム

これまでに、回転や鏡像移動で同じものとみなせる配置はPO率計算を飛ばしても良い、としてきた。せっかくなので、どのようにプログラムしているかを解説する。
toID1という関数は、25個の中から5球取り出した組を、重複なく昇順に並べたものの順番付けをするものである。例えば{1,2,3,4,5}というベクトル値を受け取ると、1という値を返す。toID2はFREE2個の配置用で、toID1の2個取り出すバージョンである。
sgn0はある番号に対して90度回転を与える関数、mir0は左右反転を与える関数である。
最終的には集合を回転させたので、そのためには要素の回転が先に必要になるであろうということから、これを関数化する有用性が見て取れる。
toID11からtoID8は、toID1とかの11,10,9,8球バージョン。それぞれあらかじめオッズを格納したベクトルの指定用。
なにしろいちいちオッズの判定をしていると時間がかかるから…。
sgnとmirは、与えられた集合(長さは任意)を90度回転、左右対称反転するもの。
具体的に言うと、引数として指定した集合を要素ごとにバラバラにして各種回転、反転操作をかけて、それをまた集合に再構築し、さらにそれをsortすることによって昇順にする、というもの。Sortを使わないと例えば{1,2}を引数として渡すと{16,9}となってしまい、先述の重複なく昇順に並べる、という規則に反するので非常に不都合になってしまう。

最後にcheckは、与えられた引数(集合)の回転や対称反転を行った先の組み合わせのIDを順次7個、ベクトルとして返す関数である。

こういった先に関数を指定して後でそれを使うというアイデアはウディタのコモンイベントに引数があるのを見て、それを使うと楽になるのではないかと知ったのがきっかけ。
まだこれを知らなかったころ、自作アニマロッタ風ゲームなどですごく手間な入力をしていた時代があった。


これらで準備が整って、以下のようにプログラムを組む。
といっても思いつくままに書いて、後で修正をするやり方なのでプログラムのミスが頻発するが後で直すのであまり仰々しく丁寧に入力してはいない。
やっていることとしては、5000回に1回進捗状況を示して、という最初の命令と移動先を移動元に直すためには逆演算をする、ということを記述している。
例えば反転→回転→回転→回転でデータを見つけた場合、戻すためには回転→反転としなければならない。

この操作は十数秒程度で終わったと思う。

これでようやく、保留しておいた部分を埋めることができ、ようやくFREE2個のデータが完成するわけである。