ぷぇ

競技プログラミングとかについて書きます。

ソートなぞなぞについて

この記事は プログラマーのオススメのゲームの話をする Advent Calendar 2019 - Adventar の11日目の記事の一部です。

ソートなぞなぞについて書きます。既にかなり下火ですが、いい機会ですし少し書こうと思います。 

ソートなぞなぞとは?

ソート済みの文字列からソート元の文字列を推定する遊びです。

厳密っぽく書くと、ある文字列 S について、以下の Python3 コードの実行結果 T が与えられるので S を当てて下さい。というものです。 

sort_nazonazo_

 

やってみるのが早いので、何問か載せます。答えは注釈から見て下さい。

  1. ググプミラロン*1
  2. あううきこのゅん*2
  3. ううかこてほんん*3
  4. いうしししめゃょん*4
  5. deeelmnoptv*5

どうでしょう?解けましたか?案外難しいと思います。
これを早押しクイズのようにしたものが一般にソートなぞなぞと呼ばれるものです。
私はこれの出題と解答チェック、最速回答者の判定などをやってくれる discord bot を制作しました。

なりたちと命名

Absolutterという twitter クライアントをご存知でしょうか?
これの 中指機能 というものの中に ソートする というのがあります。
押すと今書いているツイート内容をソートしてくれます。これです。

アナグラムを当てるゲームなんかは昔のバラエティ番組だとかクイズ番組なんかで見たような感じがしますが、それと同じことを twitter でやってみたところ、結構楽しかった、というのが始まりです。

命名について、なぞなぞでもなんでもないんですけど、そのネーミングはなに?ってなりますよね。分かります。僕もそうなっているので。
そもそも僕は普段 twitterくそなぞなぞをやっています。 参考
言葉遊びであって答えがあるものを全てなぞなぞと呼んでいて、これもその延長です。
正直深い意味はありません。

discord bot を作った

楽しかったので、出題やら回答の判定やらを自動でやりたくなりました。
その頃ハイパーロボットボットが流行っていて、かなり好きだったのでtwitter botにしたかったんですが、同時期にtwitter APIを利用したら垢バン食らったみたいな話があって、嫌だなあと思ったので別のプラットフォームを探すことにしました。
slack botが有力な選択肢だったのですが、競技プログラミングをやっている人達で集まってゲームしたいよねーと思って立てた競プLoL *6 というdiscordサーバーがあって、僕はこれが好きなのとdiscord botを作るのはそれほど難しくないようだというインターネットの情報(?)から、discord botにすることにしました。
実際、discord.pyはかなり使いやすくdiscord自体のトークンの発行などもかなり簡単でした。
みなさんも興味あれば是非触ってみて下さい。楽しいので!

こことかこことかここを参考にやったのをかすかに覚えています。
実際、初期のsort_nazonazo botのコードは前述2個目のリンクに載っているコードを改造したもので、ほとんど構成は一緒でした。

discord サーバーへの導入

ソートなぞなぞbotは皆様の環境でも(多分)実行できます。

1. python3 の実行環境を用意する。参考
2. レポジトリを取ってくる。レポジトリはここです。
3. 運用したいサーバーでbotを作りトークンと動かしたいチャンネルのIDを取得する。トークンの参考 チャンネルIDの参考
4. レポジトリに3.で取得した情報を組み込んで実行。クローンしてきたディレクトリの ./key/token にトークン、 ./key/channel_id にチャンネル ID を書いて ./run.sh を実行すると動くはずです。

って感じの流れです。まあなんか困ったら直接聞いて下さい(投げやり)(めんどくさくなってきたわ)

botが動いたら @sort_nazonazo_bot -prob みたいな感じにハイフンから始まるコマンドをメンションしてみて下さい。返事をしたら成功です。 -help をメンションすると使い方を教えてくれます。

辞書の生成

ソートなぞなぞbot辞書を内部に持っていて、ここから問題を出題しています。

辞書には問題に使う文字列が含まれています。

辞書を作るためにクローラを書いたりクロールするサイトを探したり頑張ったんですが、この辺り法律とか怖いのと雑に書捨てでコードを使ったのとでクローラの公開はしていません。

辞書を増やすのが多分ユーザーを楽しませる一番の方法なんですけど、いい感じのクロール対象がなくて辞書は運用開始時点からあまり増えていません。

多言語版の話

僕の知らないところや知っているところでドイツ語、フランス語、ロシア語などなどがあるらしいです。あんま把握していないんですけどすごい、すごいなって思います(こなみ)

最近

beatmania IIDXが楽しい。六段が遠いです。


おわり

*1:プログラミング

*2:あうんのこきゅう

*3:ほうこうてんかん

*4:しょうめいしゃしん

*5:development

*6:競プLoLという名前ですが League of Legends をやっている人は圧倒的に少数派で、累計チャットの7割以上を sort_nazonazo チャンネルが占めています。