引用元:https://www.ioccc.org/2006/meyer/meyer.c
審査員・作者による説明:https://www.ioccc.org/2006/meyer/hint.text
動作
数独を対戦ゲームにしたもの。
$ gcc -o meyer meyer.c
$ ./meyer
. . . . . . . . . a
. . . . . . . . . b
. . . . . . . . . c
. . . . . . . . . d
. . . . . . . . . e
. . . . . . . . . f
. . . . . . . . . g
. . . . . . . . . h
. . . . . . . . . i
0 1 2 3 4 5 6 7 8
you:
数字を置く場所を聞かれる。
a 0 1と書くと、「a-0の位置に数字1を置く」という意味になる。
you: a 0 1
1 . . . . . . . . a
. . . . . . . . . b
. . . . . . . . . c
. . . . . . . . . d
. . . . . . . . . e
. . . . . . . . . f
. . . . . . . . . g
. . . . . . . . . h
. . . . . . . . . i
0 1 2 3 4 5 6 7 8
cpu: e 8 3
1 . . . . . . . . a
. . . . . . . . . b
. . . . . . . . . c
. . . . . . . . . d
. . . . . . . . 3 e
. . . . . . . . . f
. . . . . . . . . g
. . . . . . . . . h
. . . . . . . . . i
0 1 2 3 4 5 6 7 8
you: a 1 2
CPUはe-8に3を置いた。
数独のルールに違反するような置き方はできない。この制約の下で、お互いにマスに数字を1つずつ置いていき、どこにも置けなくなった方の負け。
解説
コードの特徴としては、オブジェクト指向を意識しながら書いたらしい。
F、G、H、Iが4つのクラスを意識しているようで、NF()やNH()などがnew相当。
関数ポインタの配列Mが全クラスのメソッドテーブルになっており、Fは0番目から5つ、Gは5番目から4つ、などが所属メソッドになっていると思う(このオフセットはLで定義されている)。
0番目のメソッドに対応する関数ポインタはnew相当の関数から呼び出されるので、コンストラクタ相当。
Gのコンストラクタは0なので、これは直接newすることがない抽象クラス相当と思われる。
NH()とNI()の返り値が(G*)にキャストされているので、これらの親クラスということか。