Best abuse of C constructs

C構文の最高の悪用

受賞者:Arch D. Robison

引用元:https://www.ioccc.org/1988/robison.c

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

動作

指定した桁数だけネイピア数eの計算を行う。

$ gcc -o robison robison.c

$ ./robison
2.718281828

$ ./robison 40
2.718281828459045235360287471352662497757

第2引数は基数(デフォルトは10)。

$ ./robison 40 2
2.101101111110000101010001011000101000101

解説

利用できる構文・言語機能をあえて制限してプログラムを書こうという方針の初の入賞作品。 おおよそ-->=whileだけでプログラムが書かれている。

難読化プログラミング言語のBrainf**kを思い浮かべる人も多いのではないかと思う。 ただし、このコードはBrainf**kの登場(1993年)より先に作られている。 unsigned charを使って、underflowによってゼロから非ゼロを作り出す点はBrainf**kよりhackyな感じ。

robison.hintには、robison 80 2にバグがあることが示唆されている。

     robison 80 2   <--- can you find the bug?

これはおそらく、2.で始まっていることを指していると思われる。2進数なので2は書けず、10.で始まるのが正しい。

     robison 80 -246

は、unsigned charに変換するので、10を指定しているのと同じ。

なお、この年までのhintファイルには審査員のコメントしかなかったけれど、robison.hintには作者の冗談コメントが引用されている。

このプログラムは、Cには不要な構文が多すぎることを示しています。 実際、必須なのは-->=whileだけです (先頭にある2つの代入は、atoiをこのやり方で書き直せば避けられます)。 留意すべきは、異論の多いgotoや代入文がないことで、意味が明瞭になっていることです。 現在のANSI委員会はこの実用的なCの簡略化をよく見るべきです。

ちなみにC言語の初の標準規格、ANSI C(C89)が登場するのは翌年末。