プログラムを書かずにプログラムコンテストを解いてみよう回
2015/8/2 に行われた YUHA presents C88 謎解き×競技プログラミング 『ある勇者の物語』 は謎解きとプログラムコンテストが組み合わさってできたコンテストです。
これ、ざっくり言うと前半の問題 A-E を解くプログラムを使って問題 F を解き、次に問題 G-I を解くプログラムを使って J を解く、というシステムになっているのですが、殊に前半部分は全くプログラムを書かなくても問題 F が解けるのではないか、ということでやってみました。
問題 F
問題文
入力用のデータファイルと何か枠が与えられるので、これをヒントに解きましょう。
β
βは入力データすら見る必要がありません。出力が SEN
か GO
で対応する枠が 2 文字構成なので GO
です。
γ
γはちょっと面倒ですが、出力が辞書順ということなので、まずは正直者かどうかを気にせず辞書順に名前を並べてみましょう。
CRISTO HUNK MARA MCGORE NARA PRIMADONNA TALOON ZOMA
その上で枠を見ると、上から順に 6 文字、4 文字、4 文字、6 文字の構成になっているようです。上記のリストの部分列でその条件に当てはまるのは
CRISTO HUNK MARA MCGORE
CRISTO HUNK NARA TALOON
CRISTO MARA NARA TALOON
の 3 パターンしかありません。ここで確定するのは CRISTO が正直者だということです。
では次に各人の発言を見てみましょう。すると正直者と確定している CRISTO が「HUNK は嘘つき」と言っているので、1 番目、2 番目のパターンはありえないということが分かります。ということで文字の対応は 0=A, 1=L, 6=T, 8=M
となります。
δ
δの枠を見ると 3 文字、入力データの最後を見ると出発点が G
、聖剣が H
ということが分かっているので、移動形式は G→H→?→G、もしくは G→?→H→G のいずれかとなります。つまり、G と H の両方につながっている島の中で、辞書順で先頭になるものを探れば良いのです。
まずは両方に繋がっているという条件でデータを探ると I と J が候補に残ることが分かります。なので辞書順で若い I を選んで 2=G, 7=H, 5=I
が確定します。
ε
この入力ファイルは普通に(人出で)処理するのは無理があります。が、最後の問題部分をよく見ると NEWS
が書かれているだけなので、漢字部分をすっ飛ばしてこのアルファベットが入っている行だけ抜き出しましょう。
そしてアルファベット26文字のリストを用意し、矢印の方向に注意して候補に "出てこなかった" ものを消していくと S
が残ります。
今までで分かった数字と文字の対応を並べると
ALGORITHMS
となります。