Best of Show

最優秀賞

受賞者:Adrian Mariano

引用元: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関数が正しく動かないので、そこだけ修正した。

パッチ

パッチをダウンロード