引用元:https://www.ioccc.org/1992/buzzard.1.c
審査員・作者による説明:https://github.com/ioccc-src/winner/blob/main/1992/buzzard.1.hint
動作
3つのアルゴリズムが入っている。1つは階乗計算。第1引数が0のとき、第2引数の階乗を求める。
$ gcc -o buzzard.1 buzzard.1.c
$ ./buzzard.1 0 1
1
$ ./buzzard.1 0 2
2
$ ./buzzard.1 0 3
6
$ ./buzzard.1 0 4
24
$ ./buzzard.1 0 10
3628800
第2引数が1のとき、第2引数の素数判定をする。合成数なら因数を出し、素数ならace
と出す。
$ ./buzzard.1 1 2
ace
$ ./buzzard.1 1 3
ace
$ ./buzzard.1 1 4
2
$ ./buzzard.1 1 5
ace
$ ./buzzard.1 1 100
50
$ ./buzzard.1 1 101
ace
第1引数が2以上のとき、第2引数との最大公約数を求める。
$ ./buzzard.1 4 6
2
$ ./buzzard.1 45 60
15
$ ./buzzard.1 100 101
1
解説
チャールズ・バベッジの解析機関のシミュレータとのこと。
解析機関は、エイダ・ラブレスが世界で初めてプログラミングをしたとされていることで有名。
マクロが解析機関の命令を表現していて、コード部が解析機関のプログラムを表現しているらしい。
命令の詳細はbuzzard.1.hint参照。
マクロを展開してindentコマンドをかけても、解析機関のアセンブリがCに展開されるだけでまるでわからない。
次のようなコードが500行以上続くだけ。
int t, u, q, p = 0, r, w = 0, a, x, y, s;
main (argc, argv)
char **argv;
{
for (; !w;)
{
q = 0;
u = p;
u -= q;
t = u;
t *= u;
t += 2047;
t /= 2048;
t += 8191;
t /= 8192;
r += 2;
...
t = 0;
t -= p;
t *= r;
p += t;
r = 0;
}
printf ("%x\n", y);
}
コードの形状は”CB”。
理由は”for obvious reasons”とのことだが、Charles Babbageのイニシャルや、C言語ソースコードを整形するcbコマンド(現代で言うprettier、C-beautifierの略称)などにかけていると思われる。
さらに「Charles Barrettに捧ぐ」とあるが、おそらく作者の身内だろうか。