試してみたはじめに開発・公開中の『ポケモンしりとり』は、ポケモンの名前を使ったしりとりです。ルールは通常のしりとりと同じなので、名前の語尾が「ン」で終わるポケモンを回答すると負けになってしまいます。www.pokemon-shiritori.com現在、ポケモンは809種類いて、しりとりゲームを成立させるには十分な数ですが、「"ン"で終わる名前のポケモンって結構いるイメージだけど、何匹いるんだろ?」と思い立ち、せっかくなので、Ruby2.7から追加される新機能Enumerable#tallyを使って調べてみることにしました。Enumerable#tallyとはEnumerable#tallyは、Ruby2.7から追加される「各要素の出現回数を数える」メソッドです。各要素の値がkeyに、各要素の数がvalueとなるハッシュを返します。"c"=>1}ちなみに、tallyは日本語で「集計」という意味だそうです。www.ruby-lang.orgソースコードと、いうことで、さっそく書いてみました。Rubyのバージョンは2.7.0-preview1です。全ポケモンの情報が記述されているJSONファイルを読み取る読み取ったデータをもとに、名前の語尾だけを格納した配列をつくるつくった配列に対してtallyを呼び出すその結果をsortで昇順にソートするというやり方です。tallyはハッシュを返しますが、最後にsortしているため、最終的には配列が返ります。『ポケモンしりとり』のルールに則り、語尾が長音の場合はその直前の文字(「フリーザー」は「ザ」)で、小文字の場合は大文字に変換(「フェローチェ」は「エ」)してカウントします。ついでに語尾だけでなく、頭文字の数も調べてみました。data['name'][0]}.tally.sortソースコードはGithubにも公開しました。github.com出力結果こんな感じ↓になりました!ブログに張り付けるにあたって、見やすいように(そもそもが見づらいけど......)改行を入れています。7]]「ン」で終わるポケモンは102匹でした。1割ちょっとのポケモンが「ン」で終わるポケモンということですね。ちなみに、全文字中、1位が「ン」の102、2位が「ス」の80、3位が「ル」の77でした。CPUに勝つには「ル」と「ス」を使え!(確信)こちらの記事でも書いたのですが、「ル」もしくは「ス」で終わるポケモンをできるだけ回答し、「ル」「ス」で始まるポケモンを枯渇させることがCPUに勝つ最善の方法だということが、今回の分析で改めて分かりました。いうのも、「ス」で終わるポケモンは80匹と多く、かつ「ス」で始まるポケモンは13匹と少ないです。「ス」で始まるポケモンは枯渇させやすいです。「ル」で終わるポケモンは77匹、「ル」で始まるポケモンは10匹で、枯渇させやすいです。CPUに勝ちたければ、「ス」と「ル」のポケモンをたくさん覚えましょう!blog.tatehitolog.com「レックウザ」と「フリーザー」で必勝!?たとえば、「ヤ」で終わるポケモンが何種類かいて、かつ「ヤ」で始まるポケモンが1種類もいないとすると、「ヤ」で終わるポケモンを答えた時点で勝利が確定します。...が、そんな必勝ポケモンはいませんでした。(たぶん)しかし!「ザ」で始まるポケモンは「ザングース」だけなのに対し、「ザ」で終わるポケモンは「レックウザ」と「フリーザー」の2匹います。「レックウザ」と「フリーザー」をどちらも回答してしまえばCPUに勝つことができます。これは大発見(!?)です!おわりにRuby2.7の新機能Enumerable#tallyを使って遊んでみました。新機能は楽しいですね。Enumerable#tallyは「競技プログラミングで便利そうだな~~」という印象を受けましたが、AtCoderのRubyのバージョンは2.3.3なので、使えません。