なんとなく暇だったのでしりとりの AI を作って AI としりとりをすることにした.しりとりとは 2 人で遊ぶゲームで,両者の間でまだ一度も発言されておらず,(最初の手番を除いて) 先頭の文字が直前の単語の最後の文字となっている単語を交互に言い合うゲームである.
今回 AI に単語の判定を実装するのが面倒だったので,単語の定義はアルファベットの小文字からなる文字列全てとした.
しかし AI が完成したあたりでしりとりをするのは面倒くさくなってきたので,プログラムを書いて自分の代わりに AI と対戦させることにした.プログラムを書くのは良いのだが目標が無いのはつまらないので,なるべく早く AI に勝つプログラムを書くことにした.すなわち,なるべく少ないやりとりで AI に不正な応答をさせるプログラムを書くのである.
なおプログラムが先手で AI が後手である.
プログラムはしりとりの単語を発言すると,AI の返答を聞くことができる. 例えば C/C++ で abc と単語を発言するには
printf("?abc\n"); fflush(stdout);
とする.次に,
scanf("%s", str);
とすると str に AI の返答が入る.
最終的に AI の誤りを指摘するには !OUT と出力すること.誤りを指摘するのは,間違った発言の直後でなければならない.誤りを指摘した時点でプログラムを終了させ,不要な出力は一切行ってはいけない.誤りの指摘が正しければプログラムは正解 (Accepted) と判定される.単語の応答が不適切であったり,AI への誤りの指摘が正しくない場合,AI の誤りを指摘しなかった場合は誤答 (Wrong Answer) と判定される.
以下の例はプログラムの入出力の例である.左の列がプログラムの出力,右の列がプログラムへの入力 (AI の発言) を表す.最初にプログラムは abcdefghij という単語を言っている.その応答として AI は jk と返してる.3 回目の応答の際に AI はすでに使われている jk という単語を発しているのでそれに対してプログラムは !OUT と言って AI の誤りを指摘している.
プログラムの出力 | プログラムへの入力 |
---|---|
?abcdefghij | |
jk | |
?kkkk | |
kl | |
?lj | |
jk | |
!OUT |
以下の例では,AI が aaa という単語に対して bb としりとりにならない返答をしているため !OUT と返している.
プログラムの出力 | プログラムへの入力 |
---|---|
?aaa | |
bb | |
!OUT |