引用元:https://www.ioccc.org/2011/hamaji/hamaji.c
審査員・作者による説明:https://www.ioccc.org/2011/hamaji/hint.html
動作
お絵かきロジックのソルバ。
$ gcc -o hamaji hamaji.c
$ ./hamaji < dragon.nono
4
76. 1
..2321 1 57 3
21.... . .. .11 1 2
1 88..1321 2 33 5512 1 277 14 1
099..12.... . .. .... 1 4 11111...111 122 5.1 .
11...221.821112411123455676489 51.176543232666 902 .27 1
10111...1.....................11.417...........1...21..11.
..2239921176566156225563322299887...6533233233182469196894
22...............................111......................
3269548556987776665556662131223412347543332334543322223456
13.3.37 XXXXXXXXXXXXX XXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
12.2.39 XXXXXXXXXXXX XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
11.2.40 XXXXXXXXXXX XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
10.39 XXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
9.36 XXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
9.31 XXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
8.3.32 XXXXXXXX XXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
7.3.30 XXXXXXX XXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
5.3.29 XXXXX XXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
3.1.3.1.28 XXX X XXX X XXXXXXXXXXXXXXXXXXXXXXXXXXXX
1.2.4.31 X XX XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
7.5.31 XXXXXXX XXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1.6.5.30 X XXXXXX XXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
5.10.12.16 XXXXX XXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXX
5.11.5.4.12.4 XXXXX XXXXXXXXXXX XXXXX XXXX XXXXXXXXXXXX XXXX
15.2.4.4.11.5 XXXXXXXXXXXXXXX XX XXXX XXXX XXXXXXXXXXX XXXXX
16.3.4.2.2.5.5 XXXXXXXXXXXXXXXX XXX XXXX XX XX XXXXX XXXXX
14.8.7.3 XXXXXXXXXXXXXX XXXXXXXX XXXXXXX XXX
12.1.4.1.6.2 XXXXXXXXXXXX X XXXX X XXXXXX XX
11.3.4.6.1 XXXXXXXXXXX XXX XXXX XXXXXX X
10.1.8.8.5.1 XXXXXXXXXX X XXXXXXXX XXXXXXXX XXXXX X
9.8.11.5 XXXXXXXXX XXXXXXXX XXXXXXXXXXX XXXXX
9.5.6.1.2.4.1 XXXXXXXXX XXXXX XXXXXX X XX XXXX X
9.3.5.1.5 XXXXXXXXX XXX XXXXX X XXXXX
3.2.6.5.1 XXX XX XXXXXX XXXXX X
2.6.3.5.1 XX XXXXXX XXX XXXXX X
2.1.2.6.3.6.1 XX X XX XXXXXX XXX XXXXXX X
2.1.2.2.1.5.2.5.1 XX X XX XX X XXXXX XX XXXXX X
2.1.2.5.5.6.3 XX X XX XXXXX XXXXX XXXXXX XXX
4.1.9.7.5.1 XXXX X XXXXXXXXX XXXXXXX XXXXX X
5.19.6.1.2 XXXXX XXXXXXXXXXXXXXXXXXX XXXXXX X XX
24.6.3.3 XXXXXXXXXXXXXXXXXXXXXXXX XXXXXX XXX XXX
24.1.2.9.7.4 XXXXXXXXXXXXXXXXXXXXXXXX X XX XXXXXXXXX XXXXXXX XXXX
25.1.2.25 XXXXXXXXXXXXXXXXXXXXXXXXX X XX XXXXXXXXXXXXXXXXXXXXXXXXX
28.1.26 XXXXXXXXXXXXXXXXXXXXXXXXXXXX X XXXXXXXXXXXXXXXXXXXXXXXXXX
解説
入力は問題データを表す。
左側のヒントの数字をドット区切りで並べ、ハイフンの行で区切ったあと、上側のヒントの数字を並べる。
最大サイズは60x60。
解がない場合、解が一意に決まらない、解が求まらない場合は”invalid”と出力される。
詳しくはhint.text参照のこと。
お絵かきロジックはNP困難なので、バックトラックでまじめに解くのは難しい(30x30程度が限界)。
人間が行うヒューリスティクスを実装すれば、人間が解けるものは大体解けるが、プログラムが長くなりがち。
このプログラムは第3の方法として、http://www.haskell.org/haskellwiki/Nonogramで紹介されている集合ベースのソルバを実装しているとのこと。
人間のようなむずかしい推論はしないが、決定しないセルに対してバックトラックをしない推定を行う。
コードはお絵かきロジックでドラゴンの絵を示した形状。
数字のヒントに多くの文字を消費するので、コード自体はだいぶ縮められている。
ドラゴン形状とスピードとサイズから、しっかり難読化されたコードになっているとのこと。
ドラゴンを選んだのは、2012年が辰年だったからとのこと。
IOCCC 2011は募集期間が2011-11-12から2012-01-12だった。