Most Obfuscated X Program

もっとも難読化されたXプログラム

受賞者:Jon Thingvold

引用元:https://www.ioccc.org/1993/jonth.c

審査員・作者による説明:https://github.com/ioccc-src/winner/blob/main/1993/jonth.hint

動作

X Window Systemでのテトリス。

$ sed -e s/\^\ /#define/ -e 's/@/Window(D,/g' jonth.c > jonth.tmp.c

$ gcc -DXX1='H 19;}M(J,4)}N H 20;}M(T,4)}q(m,w,' -DXX='XKeycodeToKeysym(D,((XKeyEvent*)o)->keycode,0);K 12:Y();}R;}d XX1' jonth.tmp.c -o jonth -lX11

$ ./jonth
X Window Systemでテトリス
図:X Window Systemでテトリス

jで左、lで右、kで回転、スペースで落とす。

解説

X11の関数名は長いので、sedコマンドで@Window(D,に置き換えるなどをした上でコンパイルすることになっている。 それ以外、コードに特筆することはないと思う。

現代で動かすことにとても苦労した。 なぜか(難読化のため?)、#include <X11/Xlib.h>をせず、定数は即値で、構造体は配列インデックスで無理やりアクセスしている。 関数宣言もないので、返り値は暗黙的にintが仮定されてしまう。 jonth.hintに「intとポインタが同じサイズでないと動かない」と書いてあるとおり(-m32をつけるとX11とリンクできないので使えなかった)。 よって、#include <X11/Xlib.h>をしてintlongに書き換えれば、とりあえず動いた。 しかしこれだけではキー入力が効かない。 構造体のフィールドをintの配列インデックスで読みだそうとしているが、longに変えたためにずれる模様。 このコード断片はMakefileの中にある(サイズ制限回避のため?)。 ややこしいので、直接展開した上で修正した。 さらに、XSelectInputを指定した。 これによってキー操作もできるようになった。 ただし、途中でキーボード操作が効かなくなることがある(未調査)。

パッチ

パッチをダウンロード