引用元:https://www.ioccc.org/1990/theorem.c
審査員・作者による説明:https://github.com/ioccc-src/winner/blob/main/1990/theorem.hint
動作
微分方程式の数値的ソルバ。
y’=yという微分方程式を、x=0からx=1にかけて0.1ステップで数値的に解く例。ただしx=0のときy=1とする。
$ gcc -o theorem theorem.c
$ ./theorem y 0 1 0.1 1
0.100000 1.105171
0.200000 1.221403
0.300000 1.349859
0.400000 1.491824
0.500000 1.648721
0.600000 1.822118
0.700000 2.013752
0.800000 2.225539
0.900000 2.459601
1.000000 2.718280
解はy=e^xなので、x=1のときにy=e (= 2.7182818…)になっていることがわかる。
y’=1/xという微分方程式を、x=1からx=2.7にかけて0.1ステップで数値的に解く例。ただしx=1のときy=0とする。
$ ./theorem 1/x 1 2.7 0.1 0
1.100000 0.095310
1.200000 0.182322
1.300000 0.262364
1.400000 0.336472
1.500000 0.405465
1.600000 0.470004
1.700000 0.530628
1.800000 0.587787
1.900000 0.641854
2.000000 0.693147
2.100000 0.741938
2.200000 0.788458
2.300000 0.832909
2.400000 0.875469
2.500000 0.916291
2.600000 0.955512
2.700000 0.993252
2.799999 1.029620
解はy=log(x)なので、x=2.7のときにおおよそlog(e)=1になっていることがわかる。
さて、数式部分に-r
と書いた場合、このプログラムは行の反転をするプログラムになる。
$ echo -e "1\n2\n3" | ./theorem -r 0 0 0 0
3
2
1
もとのソースコードを反転させると、ソートをするプログラムになる。
$ ./theorem -r 0 0 0 0 < theorem.c > sorter.c
$ gcc -o sorter sorter.c
$ echo -e '2\n3\n1" | ./sorter 0 0 0 0
1
2
3
そして、もとのソースコードをソートすると、フィボナッチ数列を計算するプログラムになる。
$ ./sorther 0 0 0 0 < theorem.c > fibonacci.c
$ gcc -o fibonacci fibonacci.c
$ ./fibonacci 1 1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
解説
逆転してもソートしても動くプログラム。いろいろ盛り込みまくっていてすごい。
USENIXでの入賞作品発表では、スタンディングオベーションが発生したとのこと。
theorem.hintによると、数値計算アルゴリズムはルンゲ・クッタ法とのこと。
現代では#include<stdlib.h>
をしないとatof
関数が正しく動かないので、そこだけ修正した。
パッチ
パッチをダウンロード