1 | |||||||
3 | |||||||
0 | |||||||
4 | 0 | ||||||
2 | |||||||
1 | |||||||
なお,以下ではパズルの盤面の一番上の行を第0行, 一番左の列を第0列として数えます.
(int x_0_0 0 1) ; 0行目0列目は0か1のいずれかの値が入る他の変数も同様に宣言します.
(= (+ x_0_4 x_0_6 x_1_5) 1)他の数字のマスについても同様にします.
(<= (+ x_0_0 x_1_0 x_2_0) 1) (<= (+ x_0_0 x_0_1 x_0_2 x_0_3 x_0_4) 1)他の連続する白マスについても同様にします.
次に,「どの照明にも照らされてない白マスがあってはいけません」という Ruleについて考えます. たとえば,2行目3列目の白マスを見てみます. この白マスが照らされるためには, 以下で黄色で示されるマス中に照明がなければいけません (照明が2つあっても良いことに注意).
1 | |||||||
3 | |||||||
0 | |||||||
4 | 0 | ||||||
2 | |||||||
1 | |||||||
(>= (+ x_2_3 x_1_3 x_0_3 x_2_2 x_2_1 x_2_0 x_2_4 x_2_5 x_3_3) 1)他の白マスについても同様にします.
s SATISFIABLE a x_0_0 0 a x_0_1 1 a x_0_2 0 a x_0_3 0 a x_0_4 0 a x_0_6 1 a x_0_7 0 a x_1_0 1 a x_1_3 0 a x_1_4 0 a x_1_5 0 a x_1_6 0 a x_1_7 1 a x_2_0 0 a x_2_1 1 a x_2_2 0 a x_2_3 0 a x_2_4 0 a x_2_5 0 a x_2_7 0 a x_3_1 0 a x_3_2 0 a x_3_3 1 a x_3_5 1 a x_3_6 0 a x_3_7 0 a x_4_0 0 a x_4_1 0 a x_4_2 1 a x_4_4 1 a x_4_5 0 a x_4_6 0 a x_5_0 1 a x_5_2 0 a x_5_3 1 a x_5_4 0 a x_5_5 0 a x_5_6 0 a x_5_7 0 a x_6_0 0 a x_6_1 1 a x_6_2 0 a x_6_3 0 a x_6_4 0 a x_7_0 0 a x_7_1 0 a x_7_3 0 a x_7_4 0 a x_7_5 1 a x_7_6 0 a x_7_7 0 aSugarの次期リリースには, 問題ファイルを読み込んで 制約条件を記述したCSPファイルを作成するツールを含める予定です. 以下は,その実行例です.
$ ./akari.pl data/akari-0.txt >csp/akari-0.csp $ /usr/bin/time sugar csp/akari-0.csp >log/akari-0.log 0.72user 0.07system 0:00.73elapsed 108%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+152outputs (2major+9112minor)pagefaults 0swaps $ ./akari.pl -s log/akari-0.log data/akari-0.txt ; Akari (Light Up) Puzzle ; # http://www.nikoli.co.jp/en/puzzles/akari/ ; size 8 8 ; - - - - - 1 - - ; - 3 X - - - - - ; - - - - - - 0 - ; X - - - X - - - ; - - - 4 - - - 0 ; - 2 - - - - - - ; - - - - - 1 X 0 ; - - X - - - - - - @ - - - 1 @ - @ 3 X - - - - @ - @ - - - - 0 - X - - @ X @ - - - - @ 4 @ - - 0 @ 2 - @ - - - - - @ - - - 1 X 0 - - X - - @ - - ; END以下は, Nikoli: 美術館のおためし問題中の おためし問題10 (36x20)をLet's Note CF-W5で解いた結果です(MiniSat2を使用). 5秒以内で解けています(CPU時間は約9秒).
$ ./akari.pl data/akari-10.txt >csp/akari-10.csp $ /usr/bin/time sugar csp/akari-10.csp >log/akari-10.log 8.78user 0.21system 0:04.84elapsed 185%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+760outputs (2major+29538minor)pagefaults 0swaps $ ./akari.pl -s log/akari-10.log data/akari-10.txt ; Akari (Light Up) Puzzle ; # http://www.nikoli.co.jp/en/puzzles/akari/ ; size 36 20 ; - - 2 - - - - - - - - - - - X - - - - - - - - - - - 1 - - - - - - - - - ; - - - 2 - - - - - 3 - - - - - X - - - - - 3 - - - - - X - - - - - 1 - - ; X - - - 2 - - - 3 - - - X - - - X - - - 1 - - - 2 - - - 2 - - - 1 - - - ; - - - - - - 1 1 - - X - - - - - - - 1 1 - - 1 - - - - - - - 1 1 - - 1 - ; - X - - 2 1 - - - - - - - X - - 2 1 - - - - - - - 1 - - 1 1 - - - - - - ; - - - 2 - - - X - - - 0 - - - 2 - - - X - - - X - - - 1 - - - 1 - - - X ; - - 1 - - - - - 0 - - - - - 3 - - - - - 2 - - - - - 1 - - - - - 1 - - - ; - 2 - - - - - - - X - - - 3 - - - - - - - X - - - 1 - - - - - - - 1 - - ; 2 - - - - - 1 - - - X - 2 - - - - - 0 - - - 3 - 1 - - - - - 1 - - - 2 - ; 1 - - - 1 - - - - - - - 1 - - - X - - - - - - - 1 - - - 1 - - - - - - - ; - - - - - - - 1 - - - 1 - - - - - - - 1 - - - 1 - - - - - - - 1 - - - 1 ; - X - - - X - - - - - 1 - X - - - X - - - - - 1 - 3 - - - 1 - - - - - 1 ; - - 1 - - - - - - - 3 - - - X - - - - - - - 1 - - - 3 - - - - - - - 1 - ; - - - X - - - - - 2 - - - - - 1 - - - - - 1 - - - - - 1 - - - - - 1 - - ; 1 - - - 2 - - - 1 - - - 2 - - - 0 - - - 1 - - - 2 - - - X - - - 3 - - - ; - - - - - - 2 1 - - X - - - - - - - 1 1 - - X - - - - - - - 1 2 - - X - ; - 1 - - 2 1 - - - - - - - 2 - - 1 1 - - - - - - - 0 - - 2 1 - - - - - - ; - - - 1 - - - X - - - X - - - 1 - - - 1 - - - X - - - 2 - - - X - - - X ; - - 2 - - - - - 1 - - - - - 1 - - - - - X - - - - - 0 - - - - - 1 - - - ; - - - - - - - - - 1 - - - - - - - - - - - 1 - - - - - - - - - - - 2 - - @ - 2 @ - - - - - - - - - - X - - - - - - @ - - - - 1 @ - - - - - - - - - - @ 2 - - - - @ 3 @ - - - - X - - - - @ 3 @ - - - - X @ - - - - 1 @ - X @ - - 2 @ - - 3 @ - - X @ - - X - @ - 1 - - @ 2 - - @ 2 - - @ 1 - - @ - - - - @ - 1 1 @ - X - - - - - @ - 1 1 - @ 1 - @ - - - - - 1 1 - @ 1 - - X - @ 2 1 @ - - - - - - X - @ 2 1 - @ - - - - - 1 @ - 1 1 @ - - - - - - @ - 2 - - - X - - - 0 - - @ 2 - @ - X @ - - X - - - 1 @ - - 1 @ - - X - - 1 @ - - - - 0 - - - - @ 3 - - - - @ 2 - - - - @ 1 - - - - - 1 - @ - @ 2 - - @ - - - - X @ - - 3 @ - - - - - - X @ - - 1 - - - - - - - 1 - - 2 @ - - - - 1 @ - - X @ 2 @ - - - - 0 - - @ 3 @ 1 - - - - @ 1 - - @ 2 @ 1 - - - 1 @ - - - - - - 1 - - - X - - - @ - - - 1 @ - - 1 - - @ - - - - @ - - - - - - 1 @ - - 1 @ - - - - - - 1 - - @ 1 - - - - @ - - 1 - - @ 1 - X @ - - X - - - - @ 1 - X - - @ X - @ - - - 1 @ 3 @ - - 1 @ - - - - 1 - - 1 - - - - - - @ 3 - - - X @ - - - - - - 1 - - @ 3 @ - - - - - - 1 @ - - - X @ - - - - 2 @ - - - - 1 - - @ - - 1 @ - - - - 1 - - - - @ 1 - - 1 @ - - 2 - @ - 1 - - @ 2 @ - - 0 - - - 1 - - @ 2 - @ - X - - @ 3 - @ - - - - - @ - 2 1 @ - X - - - - - - @ 1 1 @ - X - @ - - - - - 1 2 @ - X - - 1 @ - 2 1 @ - - - - - - 2 @ - 1 1 - - - - @ - - 0 - @ 2 1 @ - - - - - @ - - 1 @ - - X - - @ X - @ - 1 @ - - 1 - - - X - - - 2 @ - - X - - - X - @ 2 - - @ - - 1 @ - - - - 1 - - - - @ X @ - - - - 0 - - @ - - 1 @ - - - - @ - - - - - - 1 - - - - @ - - - - - - 1 - - - @ - - - - - - - 2 @ - ; END