第2位賞
xxxxxxxxxx
#define x =
#define double(a,b) int
#define char k['a']
#define union static struct
extern int floor;
double (x1, y1) b,
char x {sizeof(
double(%s,%D)(*)())
,};
struct tag{int x0,*xO;}
*main(i, dup, signal) {
{
for(signal=0;*k *x * __FILE__ *i;) do {
(printf(&*"'\",x); /*\n\\", (*((double(tag,u)(*)())&floor))(i)));
goto _0;
_O: while (!(char <<x - dup)) { /*/*\*/
union tag u x{4};
}
}
while(b x 3, i); {
char x b,i;
_0:if(b&&k+
sin(signal) / * ((main) (b)-> xO));/*}
;
}
*/}}}
引用元:https://www.ioccc.org/1984/decot/decot.c
審査員・作者による説明:https://www.ioccc.org/1984/decot/hint.html
ゴミデータを出力するだけ。
$ gcc -m32 -traditional-cpp -o decot decot.c -lm
$ ./decot
'",x); /*
\
素朴に人間の認知に挑戦する感じ。
型名やキーワードをマクロで置き換えたり、do
~while
のwhile
が単独while
文のように見えたり。
コメントがややこしい書き方になっているが、当時の意図はよくわかっていない。 当時のコンパイラではコメントを入れ子にできるものもあったらしいが、このプログラムのコメントを入れ子として解釈するとコンパイルエラーになると思う。
おそらくこの作品がきっかけで、1986年の第2回IOCCCからは、「何かしら興味深い動作をするコードに加点をする」というルールが追加された。
現代で動かすポイントは次の通り。
extern int floor;
を、標準関数double floor(double x);
へのポインタをint
にキャストするので、64ビット環境では情報が落ちてしまって動かない。-m32
をつければ回避できる。#define x =
という難読化は現代のC規格では違反なので、-traditional-cpp
をつける。int*
とdouble
の足し算がエラーになるので適当にk+sin
を(int)k+sin
とするパッチを適用する(下記)。xxxxxxxxxx
--- decot.c
+++ decot.c
while(b x 3, i); {
char x b,i;
- _0:if(b&&k+
+ _0:if(b&&(int)k+
sin(signal) / * ((main) (b)-> xO));/*}
;
}