本記事では昔寿司打自動化ツールを作ることを公式で禁止されてなかった時代(以降「昔」はこの意味で使っています)わたしが寿司打自動化ツールを開発していたときに注意していたこととその方策をまとめています
具体的なコード例は書いてありません
あくまで本記事はアルゴリズム紹介記事です
現状公式は禁止しているのでこれはただ単の読み物として読んでください
寿司打の自動化ツールは公式で禁止されている
昔わたしは寿司打自動化ツールに試行錯誤していました
でも今は公式的に禁止されています
ここで寿司打の公式サイトを見ていきましょう
【ご利用上の注意】寿司打は個人のタイピングの練習や上達を応援するサイトです。外部ツールの使用や、営利目的の使用は禁止されています。
この通り寿司打の自動化は現在禁止されています
なので今寿司打の自動化を始めたいのであれば以下の2択から選ぶことになります
- 諦める
- 寿司打のようなタイピングゲームを再開発し寿司打自動化ツールのようなものを作る
後者は限りなく大変なので今から寿司打の自動化をしたいというのであればそれはやめましょう
「作ることは禁止していない」とか「ランキングに載せなければ良い」とか独自解釈をして乗り切ることはわたしは勧めません
入力処理
Pythonの場合はpyautoguiなどを使えばできます
逆にJSの場合はECMAの規格でできないのでだからどんなにググっても無茶だし無理だし無意味です
何を言いたいかというとこの後のスクショ処理とか画像処理とかをどんなに頑張って実装したとしてもそれは水の泡になってしまうということです
スクショ処理
ターミナルコマンドを使ってスクリーンショットを撮ってもプログラミング言語内で提供されている処理を使っても実現できます
ただし2枚以上ディズプレイがある場合はうまく動かないことがあるのでそこは必要な処理を適宜入れてください
画像をクロップ
先ほどのスクショで得た画像から一部を切り出しする処理をします
具体的に座標を決めて取り出すのでも実現できますし色から推定して取り出すのでも実現できます
RGB画像を1チャンネル画像にする
グレースケールなりRだけなりで取り出せます
Pythonの場合はPILやOpenCVを使えばできると思います
二値化
よく見る二値化の説明では「画像からテキストを推定する精度を上げる」というものがありますがあれはたいてい嘘です
実はこれをしたところであまり変わりません
有意差のあるレベルでは変わりません
昔果てしなく寿司打自動化ツールに試行錯誤していたわたしが言うので間違いないです
ポシネガ変換
Pythonだとtesseractを使うことが多いと思うのでtesseractについて言及しますとtesseractの場合はどうも背景が白で文字が黒の場合のほうが精度の高い文字検出をしてくれます
とはいえもしOCRを自分で作る場合はその自作OCRに依るのでこの処理は不要かもしれません
画像からテキストを推定
Pythonならtesseractを使うことが多いと思います
不要な文字の剪定
寿司打では小文字アルファベットと"!?,-"以外の文字は使わないので正規表現などを使って適宜処理します
そのまま入力すると不正解になってしまうのでやはりこの処理は必要です
時間を超えた処理は寿司打のシステムに引っかかる
高級コースだと340皿あたりのところでJSのwindow.alert()
による警告が出ます
本記事の内容をコードに落とし込んで高級コースを実行するとたいてい出てきます
高級コースだと本来は120秒+皿平らげ追加時間しか実行できないはずですが皿平らげ追加時間が入力時間を超えることが原因です
諦めてください
さいごに
あくまで本記事はアルゴリズム紹介記事です
現状公式は禁止しているのでこれはただ単の読み物として読んでください
なお本記事で紹介されている個別のプログラミング言語やライブラリーはあくまで参考程度です
これら紹介した個別のものを使ったからといって500秒を超えることは保証しません
というかこれら紹介した個別のものを使ったところで500秒は超えないと思います
本記事では紹介しきれていない別のライブラリーとかを使ったり本記事では対象外としている行列計算とかを高速化したりすれば500秒を超えられます