Here's a solver for the puzzles at 0hh1.com.
% USAGE: clingo -n 0 <thisfile.txt # show all solutions to puzzle % % Download from: http://sourceforge.net/projects/potassco/files/clingo/3.0.5/ % Two colors: 1 = red, 2 = blue. (0 = empty) color(1). color(2). #const size = 6. % coord(Y,X) = Y,X is a valid coordinate of a cell in the puzzle. coord(0..size-1,0..size-1). % p(Y,X,C) = cell [Y,X] is color C in the original puzzle. %- X X - - - %O - - - - - %- - - - - - %- - - - O - %- - - - - O %- X - - - - color(1). color(2). #const size = 6. % coord(Y,X) = Y,X is a valid coordinate of a cell in the puzzle. coord(0..size-1,0..size-1). % p(Y,X,C) = cell [Y,X] is color C in the original puzzle. %- X X - - - %O - - - - - %- - - - - - %- - - - O - %- - - - - O %- X - - - - p(0,0,2). p(0,1,1). p(0,2,0). p(0,3,0). p(0,4,1). p(0,5,2). p(1,0,1). p(1,1,0). p(1,2,0). p(1,3,2). p(1,4,0). p(1,5,0). p(2,0,0). p(2,1,2). p(2,2,1). p(2,3,1). p(2,4,2). p(2,5,0). p(3,0,0). p(3,1,0). p(3,2,2). p(3,3,0). p(3,4,0). p(3,5,0). p(4,0,1). p(4,1,0). p(4,2,2). p(4,3,1). p(4,4,2). p(4,5,0). p(5,0,1). p(5,1,2). p(5,2,0). p(5,3,0). p(5,4,2). p(5,5,0). % q(Y,X,C) = cell[Y,X] is color C in the solved puzzle. % The colors in the original puzzle must not change in the solution. q(Y,X,C) :- p(Y,X,C); C != 0. % Each empty square in the original puzzle must be colored red or blue in the solution. 1 { q(Y,X,C) : color(C) } 1 :- p(Y,X,0). % f(Y,X) = cell(Y,X) is filled with some color. f(Y,X) :- q(Y,X,C); C != 0. % Solution cannot have empty squares. :- coord(Y,X); not f(Y,X). % Solution cannot have three adjacent cells of the same color horizontally. :- q(Y,X,C); q(Y,X+1,C); q(Y,X+2,C). % Solution cannot have three adjacent cells of the same color vertically. :- q(Y,X,C); q(Y+1,X,C); q(Y+2,X,C). % Exactly half of the cells in every row in the solution must be red. :- coord(Y,_); {coord(Y,X) : q(Y,X,2) } != size/2. % Exactly half of the cells in every column in the solution must be red. :- coord(_,X); {coord(Y,X) : q(Y,X,1) } != size/2. % diffrow(Y1, Y2) = rows Y1 and Y2 differ. diffrow(Y1, Y2) :- q(Y1,X,C1); q(Y2,X,C2); C1 != C2; coord(Y1,_); coord(Y2,_); Y1 < Y2. % diffcol(X1, X2) = columns X1 and X2 differ. diffcol(X1, X2) :- q(Y,X1,C1); q(Y,X2,C2); C1 != C2; coord(_,X1); coord(_,X2); X1 < X2. % Solution cannot have duplicate rows. :- coord(Y1,_); coord(Y2,_); Y1 < Y2; not diffrow(Y1, Y2). % Solution cannot have duplicate columns. :- coord(_,X1); coord(_,X2); X1 < X2; not diffcol(X1, X2).
No comments:
Post a Comment