Last active
July 12, 2023 04:11
-
-
Save rdivyanshu/92b28fcad9f7d6fde22261b12d726093 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
% square size | |
#const n = 5. | |
% number of partition | |
#const m = 5. | |
% sum of each partition | |
#const sm = (n * (n + 1) * (2 * n + 1)) / (6 * m). | |
% given(N, X, Y) - there is N at (X, Y). | |
given(4, 1, 2). given(3, 1, 5). | |
given(5, 5, 1). given(5, 5, 4). | |
% partition(N, X, Y) - (X, Y) belong to partition N. | |
partition(1, 1, 1..3). partition(1, 2, 3). | |
partition(2, 1, 4..5). partition(2, 2, 4). | |
partition(3, 2, 1..2). partition(3, 3..5, 1). | |
partition(4, 2, 5). partition(4, 3, 2..5). partition(4, 4, 5). partition(4, 5, 3..5). | |
partition(5, 4, 2..4). partition(5, 5, 2). | |
% Encoding | |
partition(1..m). | |
% Choose center of hook of N | |
{ center(N, 1..n, 1..n) } = 1 :- N = 1..n. | |
% Choose directions of hook of N | |
{ direction(N, (-1; 1), (-1; 1)) } = 1 :- N = 1..n. | |
% calculate coordinates of hook of N | |
span(N, X + (0..N-1) * DX, Y) :- N = 1..n, center(N, X, Y), direction(N, DX, DY). | |
span(N, X, Y + (0..N-1) * DY) :- N = 1..n, center(N, X, Y), direction(N, DX, DY). | |
% assign which value will be written in hook of N | |
{ assign(N, 1..n) } = 1 :- N = 1..n. | |
% select written block of hooks of N. | |
{ written(W, X, Y) : span(N, X, Y) } = W :- N = 1..n, assign(N, W). | |
:- span(N, X, Y), X < 0. | |
:- span(N, X, Y), X > n. | |
:- span(N, X, Y), Y < 0. | |
:- span(N, X, Y), Y > n. | |
:- span(N1, X, Y), span(N2, X, Y), N1 != N2. | |
:- written(_, X, Y), written(_, X + 1, Y), written(_, X, Y + 1), written(_, X + 1, Y + 1). | |
{ start(X, Y) : written(N, X, Y) } = 1. | |
connected(X, Y) :- start(X, Y). | |
connected(X + 1, Y) :- connected(X, Y), written(_, X + 1, Y). | |
connected(X, Y + 1) :- connected(X, Y), written(_, X, Y + 1). | |
connected(X - 1, Y) :- connected(X, Y), written(_, X - 1, Y). | |
connected(X, Y - 1) :- connected(X, Y), written(_, X, Y - 1). | |
:- written(_, X1, Y1), not connected(X1, Y1). | |
:- span(N, X, Y), not partition(_, X, Y). | |
:- given(N, X, Y), not written(N, X, Y). | |
:- partition(G), sm != #sum { N, R, C : written(N, R, C), partition(G, R, C) }. | |
#show written/3. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment