(async(s=new Set(Object.values(PARENT)))=>{for(i in ID_TO_TITLE)if(!s.has(i)){guessbox.value=ID_TO_TITLE[i];uncomment();attempt();await new Promise(requestAnimationFrame)}})() これは内部の動物データベースのすべてを推測して、「親」を避けることで最高得点を得るための簡潔でかなり単純な方法だね。どれくらいのポイントが得られるかはわからないけど、完了するのに3時間くらいかかるだろうね。でも、いくつかの追加情報を分析することで、得点をもっと良くできるよ。(以下の数字は、重複するセットや調査/理解の異なる段階で記録したため、少しずれているかもしれないけど、かなり近いよ)ゲームには379,729の動物がリストにあって(ID_TO_TITLE)、768,743の入力文字列(LOWER_TITLE_TO_ID)からマッピングされてる。52,546は他の動物の親だから、そこはスキップした方がいいね。「鳥」を最初に推測してから「ワシ」を推測すると、ワシはポイントにならない。もし…まあ、その話は後で!4,485行は「特定しすぎ」と見なされてる。例えば、モルデリステナの下には462種いるけど、ゲームは「いや、モルデリステナで十分特定されてる」と言ってる。3,127は重複で、同じ種だけど異なる時代の名前がついてる。例えば、メガキレハルスは1853年に発見されたけど、1879年にメガキレコルダタに改名された。ゲームはこれを一度だけカウントする。3,116は…変なやつで、これは主に入力パーサーが異なるIDに推測をリダイレクトしてしまったエラーによるものだと思う。パーサーはテキストを「正しい」IDにマッピングするけど、異なる、もしかしたら似たIDをクレジットしないことがある。例えば、イエローテイルのエントリーがあるけど、これはイエローテイルモスの重複で、「イエローテイル」は「イエローテイル」と解析されて、魚のカンパチにマッピングされることになる。時々、分類のランクを飛ばすこともあって、例えば、ネオモルデリステナ・パルブーラは直接亜科にマッピングされて、系統を確認するために必要な属レベルを飛ばしてしまうことがある。時々、ある属から別の属に再分類されたものもあるし、時々は家族が属にマッピングされる行もある(ディロフォサウルス科 -> ディロフォサウルス)。28行は到達不可能で、カールアポストロフィが必要だけど、パーサーはそれをストレートアポストロフィに置き換えちゃう。ストレートバージョンの23は別の動物にマッピングされる。例えば、「バディンのツコツコ」(カール)はバディンのツコツコにマッピングされるけど、正規化後は「バディンのツコツコ」(ストレート)になって、赤っぽいツコツコにマッピングされる。5つはカールアポストロフィを持つキーがあって、ストレートバージョンはデータベースに全く存在しない。動物リストの中に「ゾース」(シマウマと馬のハイブリッド)があるけど、この推測は明示的に拒否される。なぜなら、独自のウィキペディアページがないから(そのウィキペディアページは「ゼブロイド」へのリダイレクト)。これで最大得点は316,457になるけど、文字列マッピングテーブルには生の動物テーブルに現れない722のエントリーがあって、他のブロックされた動物にマッピングできる。例えば、モンゴリアンウルフ。この動物は存在していて得点になるけど、「モンゴリアンウルフ」と入力するとヒマラヤンウルフにマッピングされて、その得点を得ることになる。でも、「ウーリーウルフ」のマッピングも含まれていて、モンゴリアンウルフの得点が得られる。これで実際の最大得点は317,179になる。そして、これらの10,034の到達不可能なリーフノード(動物リストの非親行)のおかげで、時々親の子供たちが全て到達不可能になるから、子供たちの得点を一度も獲得していないので、親の得点を獲得できる。これで5,561ポイントが追加される。これで322,740になる。最大の30回の推測を1秒あたり行う(ゲームのティックレートが30fpsに制限されている)と、すべての動物を提出するのに絶対的に最低3時間かかる。ちょっと注意だけど、カウントダウンタイマーは1分からカウントダウンするけど、正しい推測ごとに6秒が追加される。だから、終わる頃にはカウントダウンタイマーは22.6日になる。これが経過するまでゲームは「勝利」とはならない。視覚効果をいくつか取り除けば、12msの間に推測をスパムして、4msの間にブラウザがレンダリングできるように一時停止することで、タブを応答させることができる。でも、推測は時間とともに遅くなる。ゲームのコードにO(N²)アルゴリズムがあるから、現在の推測をリスト(JSの配列構造)に対してチェックするから、O(N)のチェックがN回実行されて、全体としてO(N²)のパフォーマンスヒットがある。関数をパッチして、リストの代わりにセットに対してチェックするようにすればO(1)に保てる。M2 MBPでは、ゲームロジックを変更せずに30秒以内にハイスコアを達成できる。でも、視覚効果は良かったし、作者の芸術的ビジョンなしでは少し無味乾燥だね。それを戻して、すべてをレンダリングするのに必要な6msを与えると、30秒から退屈な5分に遅くなる。ゲームロジックを98%の時間実行して、レンダリングを2%の時間行うこともできるけど、ブラウザが推測を入力ボックスから提出するたびにページレイアウト(DOM)を再計算しなければならないので、まだ少し遅すぎる。だから、実際の入力ボックスをスキップすることもできる。これで最高得点を得るのに素晴らしい20秒に減らせる!それから、メモ化やUIを良く見せるためのちょっとした調整、進捗メーターの追加、HN投稿用の攻撃的な最適化を行って、最終的なスクリプトは16.5秒で実行される。ゲームに勝つためには、カウントダウンタイマーが切れるまで22.75日待たなければならない。ゲームのロジックや勝利条件を実際に変更したくなかったから、それを編集するのは読者の課題として残しておくよ! :)