【寮祭企画】1日1回登頂のすゝめ

これはなに

 京都大学熊野寮の1年に1回の祭典、熊野寮祭の常設企画として設置した寮祭企画「1日1回登頂」のルールを説明します。公式Twitterアカウントは以下になります。

twitter.com

 

そもそも

 この企画の目的は何か、ということですが、生活が崩壊しがちな寮祭期間に毎日登山をすることで健康になろう!ということです。登頂によって獲得したポイントをもとにランキングを作成し、優勝者にはなんと企画者が焼き肉をご馳走します🥩

 

ルール

〇期間

熊野寮祭の開催期間である12/1~12/10までの10日間。

 

〇参加資格について
寮祭が終わるまでの間に上記の企画公式アカウントとFFになっていること。フォロバします。

 

〇ポイントのつけ方について
山に登頂し、山頂標識の写真と共に #1日1回登頂 のタグを付けてツイートしてください。山頂として認めるのは、山頂標識が存在する山に限ります。GPSログなどがあるとなお良いです。

例を示します。

例を基に詳細なルールを以下に記します。

1.ツイートには登頂した山頂名を記してください。次のようなポイント付けにします。分かりやすいように、次のものに該当するときは、山頂名の横に記してください。

日本百名山の山頂:5pt、日本二百名山の山頂:4pt、日本三百名山の山頂:3pt、その他の山頂:1pt

2.集計する登頂の期間は、寮祭期間中のみとします。

3.主催者判断が入る山頂があります(○○ノ頭、○○ノ肩など)ご了承ください。

4.全ての山頂は、期間中1人1回のみ集計に入れます。

 

〇勝敗
毎日、ランキングを発表します。寮祭終了時点での優勝者にさとのやエビスコースをプレゼント!🥩

 

〇その他

無理のない登山をしてください。

【寮祭企画】1日1回大文字火床2022のすゝめ

これはなに

 京都大学熊野寮の1年に1回の祭典、熊野寮祭の企画として昨年に引き続き設置した「1日1回大文字火床」の2022年度ルールを説明します。公式Twitterアカウントは以下になります。

twitter.com

 

そもそも

 この企画の目的は何か、ということですが、生活が崩壊しがちな寮祭期間に毎日登山をすることで健康になろう!ということです。大文字山を登って獲得したポイントや速さに応じてランキングを作成し、優勝者にはなんと焼き肉をご馳走します🥩

 

ルール

1.期間

熊野寮祭の開催期間である11/25 0:00:00~12/4 24:00:00までの10日間。

 

2.参加資格について
寮祭が終わるまでの間に上記の企画公式アカウントとFFになっていること。

 

3.大文字火床の登り方
この記事を読んでください。なお、大文字登山中に怪我をしても企画者は一切責任を取れません。

copynight.hatenablog.com

 

大文字山ポイント部門

 昨年実施した「登った回数部門」には大きな欠点があります。それは、「1日1回大文字火床」なのに1日3回登らないといけないことです。また、自販機から大文字火床まで1日に3回も往復する行為はかなり面白みがない行為だと思います。

そこで今年、大文字山ポイント部門を新しく作ります!まずは以下の地図をご覧ください。

これは大文字山(如意ヶ岳)周辺の地図です。大文字山には、火床に行くまでのルートでは通ることのない数多くのルートが存在します。それらを探索する楽しみを知っていただこうというのが今年度の1日1回大文字火床企画の趣旨でもあります。

大雑把にそれぞれの地点に何があるかを説明したPDFを以下に貼ります。

drive.google.com

 

では、大文字山ポイント部門のルールについて説明します。

〇ツイートする際は、#1日1回大文字火床のタグを付けること。このタグが付いていないツイートは発見されない。

 

〇参加者は、以下の場所に行くことによって、それぞれ以下のポイントを得られる。

⓪自販機:0ポイント

①大文字火床:3ポイント

大文字山頂:3ポイント

③熊山:3ポイント

④孫熊山 ⑤子熊山 ⑥曾孫熊山 ⑦玄孫熊山:1ポイント

⑧鹿山 ⑨子鹿山:3ポイント

⑩楼門の滝:3ポイント

⑪如意ヶ岳:3ポイント

山科駅:1ポイント

三井寺:1ポイント

 

〇同じ場所に2回以上行っても、ポイントは1回分しか獲得できない。ただし、以下の条件のを満たせば再度同じ場所に行ってもポイントを獲得できる。

・⓪の自販機に戻ってくる(その場合は自販機の写真をツイートに加えること)

 

〇1日に最大10ポイントまで獲得できる。ただし、1日1回は大文字火床を踏むこと。踏まない場合は0ポイントとなる場合がある。

 

〇1日無限大文字火床デーに限り、10ポイントを超えてポイントを獲得できる。詳細は、1日無限大文字火床部門を参照。

 

〇1日に自販機から大文字火床まで3往復した場合は、1ポイントボーナスして10ポイントを与える。

 

ルールは以上です。以下に、実際に10ポイントを獲得できるルート例を提示します。

yamap.com

yamap.com

 

また、以下にツイートの例を提示します。

 

最後に注意です。熊山ルートや鹿山ルート、如意越などのルートは、地図なしで行くと遭難の可能性が高いです。参加者が遭難しても、企画者は一切責任をとれませんので、以下のことを推奨します。

・夜にはいかない

・2人以上で行く

・あらかじめ登山計画を立てる

 

なお、登山計画を立てる手段としては、YAMAPを推奨しています。計画の立て方については以下のリンクをご覧ください。また、DMなどで相談に乗ります。

https://help.yamap.com/hc/ja/articles/900000939206-登山計画はどうやって作るの-

不安な方は、1日3回大文字火床に登ることで10ポイントを達成しましょう!

 

1日無限大文字火床部門

〇期間中の好きな1日だけ、1日無限大文字火床デーを認める。

 

〇1日無限大文字火床デーに設定した日は0:00〜24:00までの間、何回火床に登ってもポイントに計上する。ただし、1回ごとに⓪の自販機まで戻る必要があり、火床以外の場所に行ってもポイントには加算しない。また、ボーナスポイントは付かない。

 

〇1日無限大文字火床デーに設定したい日には #1日無限大文字火床デー のタグを付け加えてツイートすること。

 

以下に、昨年の部門優勝者の牛さんのツイート例を提示します。

 

大文字山RTA部門

〇自販機→大文字山頂→自販機のタイムを測ること。

 

〇自販機、山頂の八角形の石柱には必ずタッチし、その様子を撮影すること。

 

〇登ってから下りるまで、休憩時間も含めてストップウォッチを停止してはいけない。

 

〇タイムは #1日1回大文字山RTAハッシュタグを付けてツイートすること。なお、ストップウォッチの示す時間と写真から読み取れる登山時間が2,3分以上ずれないように注意。RTA中は急いでいると思うので、写真だけ撮っておいてツイートは下山してからで問題ない。

 

以下がツイートの例です。なお、ツイート例なので時間の整合性は取れていません。

 

 

6.勝敗
毎日、各部門のランキングを発表します。寮祭終了時点で大文字山ポイント部門・1日無限大文字火床部門・大文字山RTA部門のそれぞれの優勝者にさとのや昼ランチを、複数の部門で優勝した方にはさとのやエビスコースをプレゼント!🥩

なお、1日無限大文字火床部門に関しては、昨年優勝者の27回を超えた方には景品のグレードアップを考えています。

 

7.その他
上記のルールはあくまで大文字登山に競技性を持たせたもので、大文字に登ること自体に価値はあります。ぜひ、寮祭期間中に1度だけでもいいので大文字山に登ってたり、新たなルートを探索してみたりしてください。毎日登った累計人数を発表します。

 

質問は質問箱またはDMにお願いします。

peing.net

 

Q&A

Q.ツイートの時間は見られますか?

A.ツイートの時間を見ることはありませんので、暇なときにしていただいて大丈夫です。集計には、ツイートに添付されている写真の時間を用います。

 

Q.火床や自販機の写真を撮り忘れた場合はカウントされませんか?

A.撮り忘れた場合はカウントから除外します。気を付けてください。

 

Q.1日無限大文字火床は何回までカウントされますか?

A.何回でもカウントします。ちなみに自販機から大文字火床までの標高差は230m程度なので、38回登れば実質エベレストを上ったのと同じぐらい登ったことになります。なので、おすすめは1日で38回以上登ることです。

ロードキルされた鹿を食べるすゝめ

これは何

 これは2022年10月頭にロードキルされていた哀れな鹿をありがたく頂いたので、その備忘録です。

※グロテスクな写真などを含むので、苦手な方はお戻りください。

 

本題

 友人4人で高知に行った帰りのことです。それなりに楽しくも疲れる旅行を終え、国道372号を走りながら京都府に入った瞬間。23時頃で、上手くいけばそこまで遅くない時間には布団に入って寝られるな~と考えていた時のことです。

 

道のど真ん中に鹿が落ちていました。

 

一度は騒然となった車内でしたが、京都市の鹿はあまり頭が良くない(と言ったらかわいそうですが、ライトを見ると動きを止めたり車に突っ込んできたりする)ので、たまに見る光景ではあります。とりあえずは衝突しなかったことにホッとし、素通りしたのですが、車に乗っていたうちの1人がボソっと言いました。

 

「あの鹿、食べられるんじゃない?」

 

道路のど真ん中に鹿が落ちている状況というのは、他の車が衝突する恐れがあって余り宜しくありません。とりあえず轢かれてしまった哀れな鹿の様子を確認するために、我々は鹿の元へと引き換えしました。皆さんも、落ちている動物の死体などを見つけた際は、邪魔にならないように道路脇にどかすなどしましょう。

場所はここ

 

鹿との邂逅

 かくして引き返してみると、ありました。横たわった鹿の姿が。

無残な鹿の姿

残念ながら鹿はもう息絶えていました。しかし、写真の通り外傷もほとんどなく、非常にきれいな姿です。

とりあえず身体に触れてみると、まだ温かい。そして道路に流れ出ていた血はまだ固まっていませんでした。これはまだ轢かれて時間が経ってない鹿だ!と判断しました。(※鹿にはマダニが多く付いていることがあるので、素手で直接触れてはいけません)

そこで4人で話し合ったところ、特に反対意見が出なかったこと、そして私が住んでいる寮まで1時間程度の距離であったことから、鹿は寮に持って帰って食べることになりました。(※動物の死体を車に積むことに抵抗がある人がいる場合は、反対を押し切って積載してはいけません)

 

かくして幸か不幸か、眠れぬ夜が始まったのでした……。

車に積み込まれる鹿

 

そもそも

 ロードキルされて死んでしまった鹿を持って帰って食べることは法的に問題ないか、という話ですが、法学部生に聞いたところ多分大丈夫だという話を頂けたので多分大丈夫だと思います。詳しい方がいたら教えてください。

 

解体

 本題に戻ります。鹿と共に帰ってきたはいいものの、既に死亡から時間が経過している鹿なので、さっそく解体を始めました。幸い、鹿の解体に詳しい人と生き物をさばいて食べることに知見のある人がいたので、滞りなく進みました。

 さて、一番困ったのはマダニと解体場所です。マダニは沸騰させたお湯を次々と浴びせることである程度は殺せました。加えてゴム手袋を付けることで噛まれる対策をしました。解体は(写真の段階では写っていませんが)たまたま不要な大きな板と都合の良い車があったので、鹿の足を車に括りつけて板の上で解体が進みました。

 

解体の道中の絵面はかなりグロテスクであるので省きますが、知見のある人々のおかげで思ったよりスムーズに事が進みました。私は学校でカエルの解剖などをしていないので、初めての解体は生物について詳しく知る良い機会であったと同時に、普段気軽に食べている豚や牛、そして食肉解体作業員の皆様に深い感謝の念を抱けたので、とても良い体験であったと思います。

 

内臓などを詰めた袋。死体遺棄現場ですね。

そんなこんなで3時間ほど、鹿は立派な鹿肉となりました。とても美味しそうです。

 

このサイズの鹿の足は冷凍庫に入らないので、この後、肉をそぎ落として冷凍する作業が続きました。全ての鹿肉の処理が終わったころにはもう午前6時。睡眠時間と引き換えに大量の鹿肉をゲットすることができました。

 

まとめ

1.ロードキルされた鹿を見つけても、作業できる環境や人が揃っていない限りは持って帰らない方が良いです。しかし、交通の妨げになるので余裕があれば道路脇に除けましょう。

2.京都の山には鹿がたくさんいます。普通の車で轢くと車が大破するのは避けられないので、慎重に運転しましょう。

3.鹿肉を自分で獲って食べたい場合は、狩猟免許を取りましょう。

4.食肉を食べる時は、感謝の念を持ちましょう。

 

後日談

 手に入れた鹿肉は、鹿肉餃子と鹿肉シチューになりました。鹿肉は野生特有の臭みがあるので、匂いが強い食材と一緒に調理するか、煮込み料理にするのがオススメです。

 

夜大文字登山のすゝめ

これはなに

 夜だけど山に登りたい……。そんな願望を抱く皆様にオススメなのが夜の大文字山。道が整備されており、難易度も低く、日が暮れたばかりの時間だとそれなりの人数がいる夜の大文字山は、夜に登る山としてはぴったりです。

 しかし、いくら大文字山とはいえ、何の準備もなしに行くと普通に遭難します。この記事は、夜に大文字登山がしたい皆様に事前知識を提供するものです。「昼の大文字山に登れればいいや」という方は下記より↓ 

copynight.hatenablog.com

 

※注意

この記事を読んで大文字登山を実行し、怪我や遭難などが発生しても筆者は一切の責任を取りません。自己責任で登ってください。

・この記事に書いてあるルート以外は夜には通らないでください。遭難します。

・夜大文字登山に慣れたからと言って、他の山に夜に登らないでください。遭難します。

・昼の大文字山と夜の大文字山は様相が全く違います。気を引き締めて登ってください。

 

持ち物

懐中電灯などの照明器具(必須)

バッテリーの十分残った携帯電話

・飲み物(あったらよい)

 

本題

  というわけで、さっそく始めます。出発は以下の地点とします。

goo.gl

 

 靴は普通の靴で大丈夫です。自転車を止める場所はあるので、出発地点までは自転車で行って大丈夫です。時間ですが、最低2、3時間程度は見積もっておくことをお勧めします。実際の山道は登り40分、下り20分程度です。

 

登山口まで

 出発地点の交差点から銀閣寺の道まで東に進んでください。哲学の道に沿う形になります。しばらく歩くと交差点があり、そのすぐ後ろにトイレがあります。これ以降トイレはないので、ここで行っておきましょう。(昼の写真です)

f:id:Copynight:20211010152649j:plain

交差点。車両通行止めの看板が目印。

 

f:id:Copynight:20211010152235j:plain

交差点の左手前にある最終トイレ

 

 次に、上の交差点の写真に書いてある赤矢印の道に入ってください。まあまあな上り坂があり、奥に銀閣が見えます。ウォーミングアップだと思って頑張りましょう。

 さて、坂を上りきると銀閣寺の入り口があります。今回の目的はここではないので、スルーです。この道を左に進んでください。(昼の写真です)

f:id:Copynight:20211010153034j:plain

ここに入ると銀閣寺があります

 

 ここからは夜の写真です。先ほどの道を左に進むと、このように鳥井があります。ここを右折します。

 

 しばらく進むと自転車置き場があります。時間帯によっては自転車は置いてないですが、ここに自転車を置きましょう。

 

 このような看板が置いてある分岐があります。分岐を右に進みましょう。

 

 

 自販機の光が灯っています。水分を持ってきていない場合はここで買いましょう。

 写真の通り、街灯などは一切なく真っ暗です。怖かったらここで引き返しましょう。自販機の左に道があるので、懐中電灯で照らしながら進んでください。

 

 しばらくはこのような道が続きます。道の右は川になっているので、落ちないように気を付けましょう。

 

 しばらく進むと右手に川を渡る橋があります。暗いと全く見えないので、スルーしないように気を付けながら進んでください。

 

 このような柵を通過して、しばらくは石段のような道を上ります。

 

 以下のような木が生えた広い空間に出ます。そのまま直進してください。

 

 分岐らしきものがあります。どっちでも問題ないですが、右から行くことをお勧めします。

 

 しばらく進むと以下のような看板の置いてある空間に出ます。この空間から出ている道は何本かあり、選択をミスると遭難するので落ち着いて行動してください。

 

 看板の左の道を、進行方向左手を照らしながら進んでください。すると、左手に以下のような「千人塚」と呼ばれる碑が見えます。ここを左折してください。右折すると道に迷います。

 

 少し歩くと、このような青い門のようなものが見えるはずです。通過しましょう。

 

 ここまで問題なく来れていれば、最後の難関である地獄の階段が見えてきます。頑張って登りましょう。

 

 道中の建物です。

 

 階段を上り終えると開けた場所に出て、大文字火床に到着します。ここからの景色は写真で見るより圧倒的に綺麗です。楽しんでください。運が良ければ鹿がいます。

 

帰り

 火床から上に登ると山頂に行けますが、夜は行かないようにしましょう。危険ですし、行っても特に景色が綺麗なわけではないです。

 来た道をよく確認しながら、最後まで気を付けて帰ってください。お疲れさまでした。

 

Wordle自動化のすゝめ

これはなに

 最近話題になっている単語当てゲーム「Wordle」を自動化したので、それについて記そうと思います。前回の記事は以下より↓

copynight.hatenablog.com

 

前置き

 前回、Wordleを解くプログラムまでは作りました。詳しいことは上記の記事を読んでもらえればいいのですが、今回のWordle自動化に当たり、いくつか変更点があります。

1.単語リストの再考

前回の単語リストはいくつかのサイトからスクレイピングによって単語を取得しましたが、その中には実用的でなく、Wordleで使うことができない単語が数多く含まれていることが発覚しました。そこで、より良い単語リストを探していたところ、以下の単語リストが(解析的にも)非常に良いのではないか、ということで使うことにしました。

https://seleniumbase.io/cdn/txt/wordle_words.txt

このリストを使うことで単語数も半分となり、より早い解析が可能となりました。

 

2.最初の単語の再考

上記の単語リストを用いて再度解析を行ったところ、最初に入力すべき単語は"arise"よりも"later"の方が(微小な差ですが)良いという結果になったので、"later"を1文字目に入力することにしました。また、これを基にパラメータも計算し直しました。

 

本題

 では今回は、前回のWordleを解くプログラムを用いて、プログラムを起動するだけでその日のWordleを勝手に解くプログラムを作成することを目標とします。今回は前回とは違い、少し技術的な話も交えようと思います。

といっても、解く部分はできているので、必要なことはWordleに対して単語を入力してその結果を読み取り、前回作成したプログラムに放り込むだけです。とはいえ、それなりに苦戦しました。

 

最初に完成したコードを貼っておきます。

github.com

前回同様Pythonを用いています。自動化のためにSeleniumを用いています。SeleniumPythonで1番と言って差し支えないレベルで有名なブラウザ自動化のフレームワークなので、その使い方は調べればいくらでも出てきます。興味があれば触ってみてください。

さて、Wordleですが、普通にSeleniumを用いてもエレメントが取得できません。何故なら、WordleはShadow DOMを用いているためです。これはDOMをカプセル化するためのものですが、要するに開発者しかその中身にアクセスできません。SeleniumはShadow DOM以下のエレメントにはアクセスできないので、その状態でfind_elementを行っても、エレメントを見つけることができません。

ではどうするか、というと、Shadow DOMの処理された内容を結合してしてやればよいのです。そのための処置として、shadow_rootというのを付け加えます。以下はコードの174~178行目です。

ga = driver.find_element(By.TAG_NAME, 'game-app').shadow_root
gm = ga.find_element(By.TAG_NAME, 'game-modal').shadow_root
gm.find_element(By.TAG_NAME, 'game-icon').click()

gk = ga.find_element(By.TAG_NAME, 'game-keyboard').shadow_root

このように、Wordleのキーボードエレメントにアクセスするためには、3段階のShadow Rootを結合すれ必要があります。このことさえ知っていれば、後は普通に処理に必要なエレメントを取得し、ボタンを押すなりクリックするなりの処理を行わせればよいわけです。

 

Wordleに対して入力した文字のレスポンスとして一致・含まれている・含まれていないの色付けが返ってきますが、この色は直接読み取る必要はありません。以下のように、色付けされた枠にはevaluation(評価)というAttributeが追加されています。この値を読み取ることで、色を判断しなくてもレスポンスを取得できるというわけです。

        if gt[n].get_attribute('evaluation') == 'absent': #b
            inp+='b'
        if gt[n].get_attribute('evaluation') == 'present': #o
            inp+='o'
        if gt[n].get_attribute('evaluation') == 'correct': #g
            inp+='g'

 

入力に関してなんですが、Wordleの画面にはキーボードが表示されるので非常に簡単です。このキーボードは左上(つまりQ)からQWERT・・・・・・の順番にID側r降られているので、入力したい文字のIDのボタンを押すことで、入力が完了します。

# wordleに入力
def keyboard_input(b, word):
    for n in range(5):
        time.sleep(0.1)
        if keyboard.index(word[n])>=19:
            b[keyboard.index(word[n])+1].click()
        else:
            b[keyboard.index(word[n])].click()
    b[19].click()

ちなみに入力が速すぎると表示がバグります。そのためのsleep(0.1)です。

 

以上で、文字列の入力、レスポンスの取得、次に入力する単語の解析の全てのキーが揃いました。あとはこれらを結合していくだけです。

 

実際に動いている様子が以下のツイートの動画になります。

 

まとめ

いかがでしたか?ここに書いてある情報(なんならコード自体をさらしている)でWordle自動化が可能となります。あなただけの最適Wordle自動化プログラムを作成してみてください。

 

下り坂で雪道スタックからの脱出のすゝめ

これはなに

 下り坂の雪道でスタックしたのでその脱出体験記です。

 

そもそも

「車で雪道に行きたい」

2022年1月、某熊野寮生がそう言ったのが全ての始まりでした。私は「一人でスタックしたら脱出できないだろうし付いてってやるか」ぐらいの気持ちで付いていくことにしました。2人でも不安があったので、その場で見かけたもう1人にも声をかけて連行しました。

正直なところ、1回ぐらいはスタックすると思っていましたが、大したことにはならんだろうと思っていました。

f:id:Copynight:20220309221048j:plain

大したことになりました。

 

状況

 そもそもなんでこんなにひどいスタックをしたかということですが、京都の北の芹生峠、それまでは「こんな需要なさそうな道でもちゃんと除雪しててすごいな~」と思うぐらい綺麗に除雪された道を走っていたのですが、坂を超えた瞬間に除雪が消えて1メートル程度のパウダースノーが現れたのです。正直運転していた彼には、もうちょっと早く気づいてブレーキを踏んでほしかったですが、突っ込んでしまったものはしょうがないです。

なんでこんな中途半端なところで除雪を止めたんだ……という思いがかなりありますが、交通の妨げになるような場所ではなくて良かったです。

goo.gl

 

f:id:Copynight:20220309221044j:plain

京北の高い坂を抜けると、そこは未圧雪でした。

f:id:Copynight:20220309221056j:plain

かなり傾斜のある下り坂だったので、「あ、これは終わったな」と思いました。

 

ここで装備を確認しました。

・スタックを想定して持ってきた段ボール

・スタックを想定して持ってきた牽引ロープ

・スタックを想定して持ってきたシャベル

・スタックを想定して乗ってきたミラ(中華スタッドレスタイヤ)

 

段ボール

 とりあえずタイヤの下に段ボールを引いて脱出を試みました。ギアをリバースに入れて後退を試みると、段ボールをきっちり捉えたタイヤが回りだし、

 

段ボールを前方に吹っ飛ばしました。失敗。

 

牽引ロープ

 次に牽引ロープを使って後ろから引っ張ることを試みました。しかし、車は1台しかないので人力です。一応やってみるも、当然無理でした。失敗。

 

振り子

 雪道でスタックしたときによく使われる手法として、「車を前後し、振り子の要領で雪を固めて脱出」があります。これを試したところ、最初の数回は良さそうな雰囲気があったのですが、かなり斜度のある下り坂であったことから、ある前進のタイミングで車が前に突進し、最初の位置よりも雪に突っ込みました。失敗。

 

シャベル

 結局のところ、シャベルが唯一役に立ちました。試行錯誤の末、シャベルを用いて車後方の雪を全て掘り起こし、ドライバーにはタイヤが空転しない程度に車をバックしてもらい、車を前から人力で振り子みたいな感じで揺らすことで最も効率的に車を押し上げることができると分かりました。以下が実際の様子です。

f:id:Copynight:20220309221103j:plain

連れてきたうちの1人はサンダルだったので、とても辛そうでした。

この試行をn回行った末に、我々は1時間半かけて車を脱出させることができました。以下の写真を見てもらえば分かる通り、かなりの距離です。

f:id:Copynight:20220309221111j:plain

 

結論

・車で雪道に行くときはスコップや丈夫な段ボールを用意する

・振り子のような感じで車を揺らすと脱出しやすい

・サンダルを履いていかない

・そもそも雪道に行くべきではない

 

雪道でスタックをするとかなり不安になりますが、こんなひどい状況でも脱出できたんだと覚えておいてもらえれば、冷静に対処できると思います。

Wordleのすゝめ

これはなに

 最近話題になっている単語当てゲーム「Wordle」を短い試行回数で解くための最適な戦略について分析したので、それについて記そうと思います。

www.powerlanguage.co.uk

 

そもそも

 Wordleとは何か、ということですが、知っている人はこの見出しはスキップしてください。Wordleとは、お題の5文字の単語を6回の試行回数の間に当てるゲームです。1日1回お題が更新され、以下の画面は2022年2月9日のお題に回答する様子です。

f:id:Copynight:20220209172401p:plain

2022/02/09

プレイヤーには、お題だと思う5文字の英単語を6回入力する機会が与えられ、1回の入力ごとに入力された文字がお題に含まれていない場合はグレーが、お題に含まれてはいるが場所が違う場合はオレンジ色が、お題に含まれている場所も一致する場合は緑色が示されます。つまり、全ての文字が緑色になればお題と一致しているということで、上記は5回目の入力で正解を引き当てることができた、というわけです。

 

分析に当たって

 とりあえず分析のためには5文字の英単語を集めないといけません。私は以下の三つのサイトから5文字の英単語を収集しました。

https://kanji.reader.bz/english/starting/
https://www.kashiramoji.com/
https://cotobasearch.com/search/

上記3サイトから取得した英単語だけで、5文字の英単語はほとんどは網羅できていると(勝手に)判断しました。本記事は技術記事ではないので、英単語取得のために書いたコードの解説はしませんが、BeautifulSoup4を用いており、Githubに上げたコードは以下の通りです。同レポジトリのwList.txtファイルに取得内容が保存されていますが、分析データとして英単語計6000語程度を用意しました。

github.com

 

分析1.n文字目における各アルファベットの出現回数

 計算に用いたのは以下のコードです。

github.com

計算結果は同レポジトリのfirst.csv~fifth.csvに保存されていますが、ここでは結果について簡潔にまとめておこうと思います。

1文字目に出現するアルファベット1位:s(694回)、2位:c(471回)、3位:b(467回)

2文字目に出現するアルファベット1位:a(1110回)、2位:o(901回)、3位:e(721回)

3文字目に出現するアルファベット1位:a(664回)、2位:i(563回)、3位:r(509回)

4文字目に出現するアルファベット1位:e(924回)、2位:a(487回)、3位:i(479回)

5文字目に出現するアルファベット1位:s(1167回)、2位:e(767回)、3位:y(649回)

 

分析2.分析1をもとに最初に入力すべき単語を考える

 上記の順位をもとに、各アルファベットに(26-順位)の点数を与えました。例えば1文字目であればsは26-1=25点、cは26-2=24点です。この点を全6000単語で計算し、最も点数が高いものは1文字目に入力したときにより多くのヒントが返ってくる期待値が高いと考えられます。計算に用いたのは以下のコードです。

github.com

結果は、"cares"と"sores"が122点で同率1位でした。

 

分析3.最初に入力すべき単語を考える2

 分析2はランキングをもとに点数をつけているので、参考にはなるものの少し大雑把な気がします。そこで、6000文字の総当たりで最初に入力した英単語のヒット文字数(つまりオレンジ色になる文字数)の期待値と、一致文字数(つまり緑色になる文字数)の期待値を計算しました。計算に用いたのは以下のコードです。

github.com

結果は、ヒット文字数期待値が最も高いのは"arise"で期待値は2.03文字でした。また、一致文字数期待値が最も高いのは"cares"で期待値は0.67文字でした。ちなみに"arise"の一致文字数期待値は0.41文字で、"cares"のヒット文字数期待値は1.89文字でした。

つまり両方が共に高い文字というのは存在しないこと、最初に入力した単語の一致文字数の期待値は高くて0.67文字程度であることを考えると、最初に入力するのは"cares"よりも"arise"の方が良いのではないかと考えました。

 

分析4.お題にたどり着くまでに入力すべき単語の解析

 a~zの各アルファベットについて、1~5文字目に出てくる回数およびそのアルファベットが使われているかどうかなどの情報を含めた6つの情報を持つ26×11二次元行列を用意し、これを判断材料に使うデータにしました。「含まれているか不明の文字」、「含まれている文字」、「場所が分かっている文字」のそれぞれに重みを用意し、データより算出した評価値と重みの積を次に入力する単語の選定に用いました。評価値には、お題にたどり着くまでの入力回数を用いることにしました。コードは以下になります。

github.com

さて、皆さんが1度は疑問に思ったことがあるである「可能性があるアルファベットを順番に入れて最短で正解にたどり着く」のと「使われるかどうか不明なアルファベットを先に潰す」のとどちらがより良い戦法か、についてですが、この解析結果によると2回目の入力は一致するアルファベットを、3回目の入力は含まれているアルファベット、4回目の入力は不明なアルファベットを含む語句を中心に入力すればよいという結果になりました。計算時間の都合で一部の語句や値でしか計算してないので、これが正しいのかは分かりません。

これに加えて、まだ可能性が残っている単語と、もうお題としてはあり得ない単語のうち、どちらから入力単語を選択するか、に関しても最適な重み計算しました。コードは以下になります。

github.com

結果だけ述べると、可能性が残っている単語から入力単語を選択する方がお題に至るまでの入力単語数が短いという結果になりました。先ほどと同じく正しい結果かどうかは知りません。

 

分析5.Wordle

 以上の結果を用いて、Wordleのお題予想を行うプログラムを作成しました。コードは以下の通りです。

github.com

このプログラムを用いて、2022/2/12のWordleを解いたところ、以下のような感じになりました。

 

f:id:Copynight:20220212002015p:plain

なかなか良い感じではないでしょうか?

5.総括や反省点など

・最初は"arise"を入力するのが最も効率よく絞り込める。

・最初は既に分かっている文字を中心に、次第に不明な文字を中心とした所謂「絞り込み」をすることで正解にたどり着きやすくなる。

スパコンなどの、計算がバカ速いコンピュータがあればもうちょっと良い解析ができたと思うので、機会があれば実践してみたい。例えば、評価基準をお題に至るまでの入力回数ではなく、可能性の残る単語数をどれだけ減らせるかにした方が良い結果が得られたと思うが、計算が膨大になりすぎる(おそらく計算に数十~数百時間かかる)ので断念した。

Python高速化の知見がないのでC++で書けばよかったな、と後から思ったが、面倒そうなので断念した。

・Wordleは非常に奥深いゲームだと感じた。

 

おまけ

Wordleを自動化したので、その備忘録を以下に記しています。続きのようなものです。

copynight.hatenablog.com