TeX でリバーシ(オセロ)で遊ぶ件について
TeX で花火を打ち上げるのもたまには良いかも知れないが、やっぱり TeX と言えば何と言ってもゲームだ、という人もいるかも知れない。そういう人には、昨年の暮れに CTAN に収録された reverxii パッケージ(作者:Bruno Le Floch)をお奨めする。
次のように、reverxii.tex を plain TeX で実行させると、コンピュータ相手にリバーシ(オセロ)で遊ぶことができる。*1
# tex reverxii.tex ……(中略)…… 1 2 3 4 5 6 7 8 A A B B C 0 C D - 0 - D E - - 0 E F - F G G H H 1 2 3 4 5 6 7 8 [5] Row and column? e.g. E6 E3 1 2 3 4 5 6 7 8 A A B B C 0 C D 0 0 - D E 0 0 0 0 E F - F G G H H 1 2 3 4 5 6 7 8 [6] 1 2 3 4 5 6 7 8 A A B B C - 0 C D - 0 - D E 0 - 0 0 E F - F G G H H 1 2 3 4 5 6 7 8 [7] Row and column? e.g. E6
対戦が終わると、棋譜が記された DVI ファイルが生成される。
ファイル名の reverxii.tex はもちろんあの xii.tex(作者:David Carlisle;参照)への表敬である。従って、次のような素敵なコードになっている。(ただ xii.tex と異なり、難読化よりも最小化に重点を置いているらしい。)つまり、実際の reverxii.tex の代わりにこの内容のファイルを使っても同じ動作になる。*2
\vsize5cm\hsize3cm\newlinechar`*\def~#1{\catcode`#113~} ~IJKLMNOPQRSTUVWXYZjqz@.[|](/+^'";:?,_)!*{ 13\def~#1#2{\let#1#2~} \def+{\count1}+1=2}*\cr[\ifnum(\ifcase|\or/\else]\fiN\number@\advance X\expandafter!\global?\message~\def.#1{@+1 1\countdef#1+1.} .IJKLPQRSTUVWYZ.-1P1T2+44P+55P+45T+54T ~j{[0<Q[9>Q[0<J[9>J^/.]/.]/.]/.]} ~^{+NQNJ}~:#1{#11#12#13#14#15#16#17#18}~M#1{?{#1}#1} ~_#1#2{M#2:{\B#1}&M#2&M{*}}~\B#1#2{&M{(+#1#2 |-|0]}} ~q{?{Row and column? e.g. E6*}\read.to\EX\D\meaning\E ;} ~\D#1->#2#3#4;{Q`#2@Q-`@J`#3@J-`0)(V?{Invalid move #2#3.}q]} ~){V0 (jS1z1z0z.S0z1z.S.z1z0z.]}~;{@R(P|-]}~z#1{{K#1Z1{Y1,}(Z,]}} ~,{@QS@JK[j=T(Y!^P!;2]O,/[j=P!VV(I(Y/!Z0]]]]}~\A#1{Q#1:\C} ~\C#1{J#1)[0<VO[V>WWVUQLJ]]}~"#1{(#1|0|1|2|2|2|2|1|0]} ~O{Z"Q\multiplyZ3@Z"J@V(Z9|1|6|1|1|2|6|2|4] }~'{M :{&M}&M{*}} ~~{PXTXTNP\halign{&## *M{*}'_1A_2B_3C_4D_5E_6F_7G_8H'}\vfil\break I1W(W./0] :\AI0 [0<W[1=PQUJL/q])^P;1][.=W?{(RTie/ Player [0>R-/0] wins by N[0>R-]R].}X\end]~}~