Programmer's Nightmare 2回目

面白かったので2回目。

BUG1
BUG2
PROGRAM_ERROR
ACQUIRE1
COPY
GOTO1
GOTO2
OVERWRITE
ACQUIRE2
DECREMENT
ACQUIRE3
REPLACE
GOTO3
REVERSE_PROGRAM

リバースが最後に来ているので序盤の実行順序は考えるのが楽だね。GOTOが3枚もある。PROGRAM_ERRORには他人のビットを乗せることができて、マイナス1ポイント。ACQUIREが3枚もある。これはプラス2ポイント。COPYでPROGRAM_ERRORをコピーしたらやっぱりコピーした自分がマイナスなんだろうな。REPLACEはカードを差し替える命令。むー、ランダム要素が強くて戦略に取り入れにくいぞ。負けそうな側が使う物か。GOTOに取り囲まれていて発動できるのかが微妙だけどもOVERWRITEが肝かなぁ。でも1回しか使えないしなぁ。実はREVERSEが肝か?

仮にREPLACEを取ったらGOTO2で無効にするよなぁ。REVERSEを取ってもその上のGOTO3を取られるだけだし。いや、REPLACEを取ってGOTO2を取られてもGOTO1で飛び込めばいいのか。

先手REPLACEを選択。

後手はREVERSEを取ると続いてGOTO3を取られると困る先手はGOTO3を押さえることになる。そうするとREVERSEが無意味だ。GOTO3を取ったらREVERSEを押さえられるかなぁ。ふむ。このゲームはREPLACEの引きにかなり左右される気がするなぁ。後手GOTO3、先手REVERSE(REPLACEがスキップされるのを防ぐため)、後手GOTO1、先手GOTO2(REPLACEをスキップされることを防ぐため)、後手ACUIRE1、まで決まりかな。

BUG1
BUG2
PROGRAM_ERROR
ACQUIRE1 -
COPY
GOTO1 -
GOTO2 +
OVERWRITE
ACQUIRE2
DECREMENT
ACQUIRE3
REPLACE +
GOTO3 -
REVERSE_PROGRAM +

先手がREPLACEという重要カードを押さえている状況は変わらないけども、先手がそれを死守することを利用して後手は先手のビット2つをGOTOでスキップされる場所に配置させた。GOTO3は行使しないんだけどREVERSEすると先手がREPLACEできなくなるので結果的にビット2つが無意味になったわけだ。ACUIRE2, 3が呼ばれるかどうかの選択権は後手にある。
先手はDECREMENTかな。COPYを押さえて1点取ったらPROGRAM ERRORの-1点で帳消しにされるし。いや、それでいいのか。REPLACEを有効に使うためには自分のビットの多い方が有利だから。先手COPY、後手PROGRAM_ERROR、先手DECREMENT。

BUG1
BUG2
PROGRAM_ERROR +
ACQUIRE1 -
COPY +
GOTO1 -
GOTO2 +
OVERWRITE
ACQUIRE2
DECREMENT -
ACQUIRE3
REPLACE +
GOTO3 -
REVERSE_PROGRAM +

巻き戻すといつまでたっても終わらないのでやらないけど、今思うと後手の ACQUIRE1はOVERWRITEにすべきだったな。そうすると後手がGOTO1を発動させなかった時点で先手は「OVERWRITEでREPLACEが書き換えられてからそれが呼ばれる」という自体を避けるためにGOTO2を発動させるしかない。いや、でもそうすると先手が次にACQUIRE1に置いてしまうだけか。いや、そしたらCOPYを取ってGOTO3を使えばいいんだな。っていうかOVERWRITEは残っているから今からでも後手はOVERWRITEを取ればいいのか。

BUG1
BUG2
PROGRAM_ERROR +
ACQUIRE1 -
COPY +
GOTO1 -
GOTO2 +
OVERWRITE -
ACQUIRE2
DECREMENT +
ACQUIRE3
REPLACE +
GOTO3 -
REVERSE_PROGRAM +

ふうむ。凄まじいことになった。もう一度おさらいをすると後手はGOTO1を発動しない。先手はOVERWRITEを避けるためにGOTO2を発動してGOTO3までジャンプする。後手はGOTO3でジャンプをすると先手だけが1点を得するので発動しない。先手はREVERSEすると後手にGOTO1を使われて得点チャンスを失うので発動しない。いや?そうすると結果的に後手だけが2点の得をするのか。じゃあREVERSEするか。GOTO3が発動してGOTO2が発動して「得点カードを含まないループは3回が上限」ルールが発動する!なるほど。逆順実行のままGOTO3->GOTO2->GOTO3のループに入り、3回目でGOTO2のジャンプが禁止される。あー。そして結局後手が2点を取るのか。
先手後手ともビットが1個ずつ残っているが、先手に勝ち目があるとすれば後手にREPLACEをあげるかわりに失効して差しかわるOVERWRITEが何か状況を打破してくれるカードである可能性に賭けるくらいか。先手ACQUIRE2、後手ACQUIRE3。ビット配置終了。

BUG1
BUG2
PROGRAM_ERROR +
ACQUIRE1 -
COPY +
GOTO1 -
GOTO2 +
OVERWRITE -
ACQUIRE2 +
DECREMENT +
ACQUIRE3 -
REPLACE +
GOTO3 -
REVERSE_PROGRAM +

実行フェーズ。先手 PROGRAM_ERRORの強制発動。点数9対10。後手 ACQUIRE。点数9対12。先手COPY発動。点数10対12。後手GOTO1を発動しない。先手GOTO2を発動しない。後手OVERWRITEでREPLACEを書き換え。失効したOVERWRITEのかわりに山札から引いてくるのは…COPY!っていうか今気づいたけどこれ後手のカードだから先手の勝利につながらないじゃん!!!



というわけで後手の勝ち。