Best Algorithm

最高のアルゴリズム

受賞者:Jens Schweikhardt

引用元:https://www.ioccc.org/1996/schweikh2.c

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

動作

小町算のソルバ。

$ gcc -o schweikh2 schweikh2.c

$ ./schweikh2
1 + 2 * 3 + 4 * 5 + 6 * 7 - 8 - 9 - 10 = 42
1 - 2 + 3 * 4 * 5 / 6 * 7 - 8 - 9 - 10 = 42
1 + 2 * 3 / 4 * 5 * 6 + 7 + 8 - 9 - 10 = 42
1 - 2 + 3 + 4 + 5 + 6 * 7 + 8 - 9 - 10 = 42
1 / 2 * 3 * 4 + 5 + 6 * 7 + 8 - 9 - 10 = 42
...

引数は次の通り。第1引数は演算する数字の数。

$ ./schweikh2 6
1 * 2 * 3 * 4 + 5 + 6 + 7 = 42
1 * 2 - 3 - 4 + 5 + 6 * 7 = 42

第2引数は先頭の数字。

$ ./schweikh2 7 0
0 / 1 + 2 * 3 * 4 + 5 + 6 + 7 = 42
0 * 1 + 2 * 3 * 4 + 5 + 6 + 7 = 42
0 + 1 * 2 * 3 * 4 + 5 + 6 + 7 = 42
0 / 1 - 2 + 3 + 4 + 5 * 6 + 7 = 42
0 * 1 - 2 + 3 + 4 + 5 * 6 + 7 = 42
...

第3引数は隣り合う数字の差。

$ ./schweikh2 7 7 0
7 + 7 + 7 + 7 + 7 + 7 + 7 - 7 = 42
7 + 7 + 7 + 7 + 7 + 7 - 7 + 7 = 42
7 + 7 + 7 + 7 + 7 - 7 + 7 + 7 = 42

第4引数は合計値。

$ ./schweikh2 8 9 -1 -67/21
9 - 8 / 7 * 6 - 5 - 4 / 3 + 2 - 1 = -67/21
9 - 8 / 7 * 6 - 5 + 4 / 3 / 2 - 1 = -67/21
9 - 8 / 7 / 6 - 5 - 4 * 3 / 2 - 1 = -67/21
9 + 8 / 7 - 6 - 5 - 4 / 3 - 2 + 1 = -67/21

解説

すべての組み合わせを列挙するわけではない模様。 いくつか実験すると、明らかな解が不足していたり、解がある問題でも何もでなかったりすることもある。

詳細は未解読。 コードには原則として1文字ずつスペースが入っている。 たとえばmainはこのようにつくる。

#define R( n , d ) e ( n , d )
#define e(p,o)o##p

R ( e ( n , i ) , e ( a , m ) )

コード形状はウロコのよう。 ダイヤモンドを並べているものらしい。 挙動との関係はなさそう。

オリジナルのコードはhunni.cで、これをhunni.plで処理することで生成されているとのこと。 当時の難読化コードの開発が垣間見えるのは興味深い。

[[1996/schweikh2]][[1996/schweikh3]]とあわせて、同じ人が同年に3部門で入賞するのは初の事例。