悪あがきの可能性
前回までの実装で、事実上、1億回の演算を30分で済ませることが可能となった。
ただし、これだけやっても10億回やるのに5時間、100億回やるのには50時間――おおよそ2日かかる計算だ。
発音できない文字列を取り除いたとはいえ、「シェイクスピア」の総パターン数は約21兆4000億。甘く見積もったとして、半分の地点でまぐれ当たりを引いたとしても10兆7000億回の演算が必要。
100億回出力しようとも、出現確率は0.093%にしかならない。重複することも考えれば、更に少なくなるか。
挑戦権を得るには、せめて小数点以下から脱出――1%の確率にはなってほしい。
そうなった場合、100億回の更に10.75倍の演算(1075億回)が必要となる。そうなると、今の演算形式では約21.5日となり、今年中にはギリギリ間に合わない計算だ。
その程度の演算量、1日で終わってくれなければ、どの道先はない。
そうなると、どんな手段を用いようとも、演算速度を21.5倍にする必要がある。倍速でわいわい言っている場合ではなかったのだ。とんだハードなSFである。
早速、実装の方を考えていきたい。
前回で一文字限りの出力セルは取り除かれた。しかし、絞り込みを行う内、あることに気付いたのだ。
――Q列って本当に要るのだろうか?
Q列の機能は、C列からI列に生成された乱数に従い、カタカナに変換しながらも、7文字を結合して表示するというものだ。「シェイクスピア」に最も近い文字列をAH列に表示する際にも用いられる。
重要な箇所ではあるが、10000行ものセルに非常に重い計算式(7文字分を1つにまとめているから当たり前なのだが)が設定されているのだ。
マクロを実行し、結果を見る時――私は「シェイクスピア」に一番近い文字列しか見ていない。例えば、今の実装では一回の周期に530000個の文字列が生成されるが、最優秀を除く529999個の文字列を眺める必要がないことは、誰だって分かることだろう。
「シェイクスピア」に最も近い文字列の基準となるのは、一致文字数(AF列)であり、文字列そのもの(Q列)ではない。AF列が最大値となるQ列の値を取るだけならば――わざわざ10000行もセルに表示させなくとも、マクロ内部で文字列結合を行ってしまえばいいのでは。
集中維持用のハッカキャンデーを口に放り込み、E〇CELの改修を始めた。
実施内容は以下の通り。
・Q列の記載を削除。
・マクロの記載を修正。AH列に表示する文字列について、Q列を参照していたところを、以下の通りに修正。
「Moji = WorksheetFunction.VLookup(Cells(Target, 3).Value, Range("A1:B83"), 2, False) & …(中略)…& WorksheetFunction.VLookup(Cells(Target, 9).Value, Range("A1:B83"), 2, False)」
複雑なように見えるが、やっていることは、元々Q列がやっていた作業(C列からI列までの乱数を、対応するカタカナに変換し、それらを「&」で結合する)をコードに書き直したに過ぎない。
これにより、10000行出力していたものが、計算式とマクロという実装の違いはあるにせよ、1行で収まった。
実行結果は以下の通り。
1回目:5.72秒――シズャボスハア
2回目:5.67秒――ダェムクジピフ
3回目:5.58秒――ポホゲクリピア
おおよそ4秒程度の削減となった。倍速とはいかないまでも、更に高速化が見込める事は確かだ。
そろそろ、本格的にレポートを取ってみてもいいかもしれない。
1000億は無理でも――10億程度ならば、3時間半くらいで終わってくれるはずだ。
<備考>
マクロを実行してから長時間放置していると、PCが自動でスリープモードに入ることで、処理が中断されてしまうという問題があった。
これにより以前、貴重な休日の20時間を棒に振ってしまった苦い経験があったが、実はPC本体にてスリープに関する設定を切り替えることで予防が可能と判明(マクロでも実施が可能らしいが、今回は対応しない)。
とりあえず、10億回の実行による試運転を経てから、放置する時間を伸ばしていこうと思う。無論、その間の電気代は……
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます