マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

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]~}~

*1:ついでに、reverxii.tex を pdflatex で組版すると、パッケージに含まれるのと同じ reverxii.pdf が生成される。

*2:reverxii.tex には pdflatex で組版される解説文書の記述が一緒になっているのでもっと大きくなっている。