%パズルコレクション パズル第71号 数字パズル を解くPrologコード
%作者 堀江伸一 記述時間約 1時間
num_pattern(0,[[1,0],[0,1],[2,1],[0,3],[2,3],[1,4]]).
num_pattern(0,[[1,0],[3,0],[0,1],[4,1],[1,2],[3,2]]).
num_pattern(1,[[0,1],[0,3]]).
num_pattern(1,[[1,0],[3,0]]).
num_pattern(2,[[1,0],[2,1],[1,2],[0,3],[1,4]]).
num_pattern(2,[[1,0],[0,1],[2,1],[4,1],[3,2]]).
num_pattern(2,[[1,0],[0,1],[1,2],[2,3],[1,4]]).
num_pattern(2,[[3,0],[0,1],[2,1],[4,1],[1,2]]).
num_pattern(3,[[1,0],[2,1],[1,2],[2,3],[1,4]]).
num_pattern(3,[[0,1],[1,2],[2,1],[3,2],[4,1]]).
num_pattern(3,[[1,0],[0,1],[1,2],[0,3],[1,4]]).
num_pattern(3,[[1,0],[3,0],[0,1],[2,1],[4,1]]).
num_pattern(4,[[0,1],[2,1],[1,2],[2,3]]).
num_pattern(4,[[1,0],[0,1],[-1,2],[1,2]]).
num_pattern(4,[[0,1],[1,2],[0,3],[2,3]]).
num_pattern(4,[[1,0],[3,0],[2,1],[1,2]]).
num_pattern(4,[[0,1],[2,1],[1,2],[0,3]]).
num_pattern(4,[[1,0],[2,1],[1,2],[3,2]]).
num_pattern(4,[[0,1],[-1,2],[-2,3],[0,3]]).
num_pattern(4,[[1,0],[3,0],[2,1],[3,2]]).
num_pattern(5,Pattern):-num_pattern(2,Pattern).
num_pattern(6,[[1,0],[0,1],[1,2],[0,3],[2,3],[1,4]]).
num_pattern(6,[[1,0],[3,0],[0,1],[2,1],[4,1],[1,2]]).
num_pattern(6,[[1,0],[0,1],[2,1],[1,2],[2,3],[1,4]]).
num_pattern(6,[[3,0],[0,1],[2,1],[4,1],[1,2],[3,2]]).
num_pattern(6,[[1,0],[2,1],[1,2],[0,3],[2,3],[1,4]]).
num_pattern(6,[[1,0],[0,1],[2,1],[4,1],[1,2],[3,2]]).
num_pattern(6,[[1,0],[0,1],[2,1],[1,2],[0,3],[1,4]]).
num_pattern(6,[[1,0],[3,0],[0,1],[2,1],[4,1],[3,2]]).
num_pattern(7,[[1,0],[2,1],[2,3]]).
num_pattern(7,[[0,1],[-1,2],[-3,2]]).
num_pattern(7,[[0,1],[0,3],[1,4]]).
num_pattern(7,[[1,0],[3,0],[0,1]]).
num_pattern(7,[[1,0],[0,1],[0,3]]).
num_pattern(7,[[1,0],[3,0],[4,1]]).
num_pattern(7,[[0,1],[0,3],[-1,4]]).
num_pattern(7,[[0,1],[1,2],[3,2]]).
num_pattern(8,[[1,0],[0,1],[2,1],[1,2],[0,3],[2,3],[1,4]]).
num_pattern(8,[[1,0],[3,0],[0,1],[2,1],[4,1],[1,2],[3,2]]).
num_pattern(9,Pattern):-num_pattern(6,Pattern).
update(_,_,_,[],NowState,NowState):-!.
update(Row,Col,No,[[X,Y]|Rest],NowState,[[X1,Y1,No]|Result]):-
0=<X1,
0=<Y1,
X1=<XMax,
Y1=<YMax,
not(member([X1,Y1,_],NowState)),
update(Row,Col,No,Rest,NowState,Result).
print_b([]).
print_b([[_,_,N0],[_,_,N1],[_,_,N2],[_,_,N3],[_,_,N4]|Rest]):-
write([N0
,s
,N1
,s
,N2
,s
,N3
,s
,N4
]),nl, print_a(Rest).
print_a([[_,_,N0],[_,_,N1],[_,_,N2],[_,_,N3]|Rest]):-
print_b(Rest).
search(_,_,[],Ans):-
!,sort(Ans,Ans1),
print_a(Ans1).
search(Row,Col,Nums,Ans):-
Row=:=8,
member([Col1,Row,_],Ans),
!,
search(Row,Col2,Nums,Ans).
search(Row,Col,Nums,Ans):-
Col=:=10,
member([Col,Row1,_],Ans),
!,
search(Row2,Col2,Nums,Ans).
search(Row,Col,Nums,Ans):-
member([Col1,Row,_],Ans),
member([Col,Row1,_],Ans),
!,
search(Row,Col2,Nums,Ans).
search(Row,Col,Nums,Ans):-
select(Num,Nums,RestNums),
num_pattern(Num,NumP),
update(Row,Col,Num,NumP,Ans,NextAns),
search(Row,Col,RestNums,NextAns).
main:-search(0,0,[0,1,2,3,4,5,6,7,8,9],[]).
JeODkeOCuuODq+OCs+ODrOOCr+OCt+ODp+ODs+OAgOODkeOCuuODq+esrDcx5Y+344CA5pWw5a2X44OR44K644Or44CA44KS6Kej44GP77ywcm9sb2fjgrPjg7zjg4kKJeS9nOiAheOAgOWggOaxn+S8uOS4gOOAgOiomOi/sOaZgumWk+e0hOOAgO+8keaZgumWkwoKbnVtX3BhdHRlcm4oMCxbWzEsMF0sWzAsMV0sWzIsMV0sWzAsM10sWzIsM10sWzEsNF1dKS4KbnVtX3BhdHRlcm4oMCxbWzEsMF0sWzMsMF0sWzAsMV0sWzQsMV0sWzEsMl0sWzMsMl1dKS4KCm51bV9wYXR0ZXJuKDEsW1swLDFdLFswLDNdXSkuCm51bV9wYXR0ZXJuKDEsW1sxLDBdLFszLDBdXSkuCgpudW1fcGF0dGVybigyLFtbMSwwXSxbMiwxXSxbMSwyXSxbMCwzXSxbMSw0XV0pLgpudW1fcGF0dGVybigyLFtbMSwwXSxbMCwxXSxbMiwxXSxbNCwxXSxbMywyXV0pLgpudW1fcGF0dGVybigyLFtbMSwwXSxbMCwxXSxbMSwyXSxbMiwzXSxbMSw0XV0pLgpudW1fcGF0dGVybigyLFtbMywwXSxbMCwxXSxbMiwxXSxbNCwxXSxbMSwyXV0pLgoKbnVtX3BhdHRlcm4oMyxbWzEsMF0sWzIsMV0sWzEsMl0sWzIsM10sWzEsNF1dKS4KbnVtX3BhdHRlcm4oMyxbWzAsMV0sWzEsMl0sWzIsMV0sWzMsMl0sWzQsMV1dKS4KbnVtX3BhdHRlcm4oMyxbWzEsMF0sWzAsMV0sWzEsMl0sWzAsM10sWzEsNF1dKS4KbnVtX3BhdHRlcm4oMyxbWzEsMF0sWzMsMF0sWzAsMV0sWzIsMV0sWzQsMV1dKS4KIAoKbnVtX3BhdHRlcm4oNCxbWzAsMV0sWzIsMV0sWzEsMl0sWzIsM11dKS4KbnVtX3BhdHRlcm4oNCxbWzEsMF0sWzAsMV0sWy0xLDJdLFsxLDJdXSkuCm51bV9wYXR0ZXJuKDQsW1swLDFdLFsxLDJdLFswLDNdLFsyLDNdXSkuCm51bV9wYXR0ZXJuKDQsW1sxLDBdLFszLDBdLFsyLDFdLFsxLDJdXSkuCgpudW1fcGF0dGVybig0LFtbMCwxXSxbMiwxXSxbMSwyXSxbMCwzXV0pLgpudW1fcGF0dGVybig0LFtbMSwwXSxbMiwxXSxbMSwyXSxbMywyXV0pLgpudW1fcGF0dGVybig0LFtbMCwxXSxbLTEsMl0sWy0yLDNdLFswLDNdXSkuCm51bV9wYXR0ZXJuKDQsW1sxLDBdLFszLDBdLFsyLDFdLFszLDJdXSkuIAoKCm51bV9wYXR0ZXJuKDUsUGF0dGVybik6LW51bV9wYXR0ZXJuKDIsUGF0dGVybikuCgoKbnVtX3BhdHRlcm4oNixbWzEsMF0sWzAsMV0sWzEsMl0sWzAsM10sWzIsM10sWzEsNF1dKS4KbnVtX3BhdHRlcm4oNixbWzEsMF0sWzMsMF0sWzAsMV0sWzIsMV0sWzQsMV0sWzEsMl1dKS4KbnVtX3BhdHRlcm4oNixbWzEsMF0sWzAsMV0sWzIsMV0sWzEsMl0sWzIsM10sWzEsNF1dKS4KbnVtX3BhdHRlcm4oNixbWzMsMF0sWzAsMV0sWzIsMV0sWzQsMV0sWzEsMl0sWzMsMl1dKS4KCm51bV9wYXR0ZXJuKDYsW1sxLDBdLFsyLDFdLFsxLDJdLFswLDNdLFsyLDNdLFsxLDRdXSkuCm51bV9wYXR0ZXJuKDYsW1sxLDBdLFswLDFdLFsyLDFdLFs0LDFdLFsxLDJdLFszLDJdXSkuCm51bV9wYXR0ZXJuKDYsW1sxLDBdLFswLDFdLFsyLDFdLFsxLDJdLFswLDNdLFsxLDRdXSkuCm51bV9wYXR0ZXJuKDYsW1sxLDBdLFszLDBdLFswLDFdLFsyLDFdLFs0LDFdLFszLDJdXSkuCgpudW1fcGF0dGVybig3LFtbMSwwXSxbMiwxXSxbMiwzXV0pLgpudW1fcGF0dGVybig3LFtbMCwxXSxbLTEsMl0sWy0zLDJdXSkuCm51bV9wYXR0ZXJuKDcsW1swLDFdLFswLDNdLFsxLDRdXSkuCm51bV9wYXR0ZXJuKDcsW1sxLDBdLFszLDBdLFswLDFdXSkuCgpudW1fcGF0dGVybig3LFtbMSwwXSxbMCwxXSxbMCwzXV0pLgpudW1fcGF0dGVybig3LFtbMSwwXSxbMywwXSxbNCwxXV0pLgpudW1fcGF0dGVybig3LFtbMCwxXSxbMCwzXSxbLTEsNF1dKS4KbnVtX3BhdHRlcm4oNyxbWzAsMV0sWzEsMl0sWzMsMl1dKS4KCm51bV9wYXR0ZXJuKDgsW1sxLDBdLFswLDFdLFsyLDFdLFsxLDJdLFswLDNdLFsyLDNdLFsxLDRdXSkuCm51bV9wYXR0ZXJuKDgsW1sxLDBdLFszLDBdLFswLDFdLFsyLDFdLFs0LDFdLFsxLDJdLFszLDJdXSkuCgpudW1fcGF0dGVybig5LFBhdHRlcm4pOi1udW1fcGF0dGVybig2LFBhdHRlcm4pLiAKCnVwZGF0ZShfLF8sXyxbXSxOb3dTdGF0ZSxOb3dTdGF0ZSk6LSEuCnVwZGF0ZShSb3csQ29sLE5vLFtbWCxZXXxSZXN0XSxOb3dTdGF0ZSxbW1gxLFkxLE5vXXxSZXN1bHRdKTotIAogICAgWDEgaXMgQ29sK1gsCglZMSBpcyBSb3crWSwKCVhNYXggaXMgOSsoWTEgbW9kIDIpLAoJWU1heCBpcyA3KyhYMSBtb2QgMiksCgkwPTxYMSwKCTA9PFkxLAoJWDE9PFhNYXgsCglZMT08WU1heCwKCW5vdChtZW1iZXIoW1gxLFkxLF9dLE5vd1N0YXRlKSksCgl1cGRhdGUoUm93LENvbCxObyxSZXN0LE5vd1N0YXRlLFJlc3VsdCkuCgpwcmludF9iKFtdKS4KcHJpbnRfYihbW18sXyxOMF0sW18sXyxOMV0sW18sXyxOMl0sW18sXyxOM10sW18sXyxONF18UmVzdF0pOi0KCXdyaXRlKFtOMCxzLE4xLHMsTjIscyxOMyxzLE40XSksbmwsCglwcmludF9hKFJlc3QpLgoKcHJpbnRfYShbW18sXyxOMF0sW18sXyxOMV0sW18sXyxOMl0sW18sXyxOM118UmVzdF0pOi0KCXdyaXRlKFtzLE4wLHMsTjEscyxOMixzLE4zXSksbmwsCglwcmludF9iKFJlc3QpLgoKCnNlYXJjaChfLF8sW10sQW5zKTotCgkhLHNvcnQoQW5zLEFuczEpLAoJcHJpbnRfYShBbnMxKS4KCnNlYXJjaChSb3csQ29sLE51bXMsQW5zKTotCglSb3c9Oj04LAoJQ29sMSBpcyBDb2wrMSwKCW1lbWJlcihbQ29sMSxSb3csX10sQW5zKSwKCSEsCglDb2wyIGlzIENvbCsyLAoJc2VhcmNoKFJvdyxDb2wyLE51bXMsQW5zKS4KCnNlYXJjaChSb3csQ29sLE51bXMsQW5zKTotCglDb2w9Oj0xMCwKCVJvdzEgaXMgUm93KzEsCgltZW1iZXIoW0NvbCxSb3cxLF9dLEFucyksCgkhLAoJQ29sMiBpcyAwLAoJUm93MiBpcyBSb3crMiwKCXNlYXJjaChSb3cyLENvbDIsTnVtcyxBbnMpLgoKc2VhcmNoKFJvdyxDb2wsTnVtcyxBbnMpOi0KCVJvdzEgaXMgUm93KzEsCglDb2wxIGlzIENvbCsxLAoJbWVtYmVyKFtDb2wxLFJvdyxfXSxBbnMpLAoJbWVtYmVyKFtDb2wsUm93MSxfXSxBbnMpLAoJISwKCUNvbDIgaXMgQ29sKzIsCglzZWFyY2goUm93LENvbDIsTnVtcyxBbnMpLgpzZWFyY2goUm93LENvbCxOdW1zLEFucyk6LQoJc2VsZWN0KE51bSxOdW1zLFJlc3ROdW1zKSwKCW51bV9wYXR0ZXJuKE51bSxOdW1QKSwKCXVwZGF0ZShSb3csQ29sLE51bSxOdW1QLEFucyxOZXh0QW5zKSwKCXNlYXJjaChSb3csQ29sLFJlc3ROdW1zLE5leHRBbnMpLgoKbWFpbjotc2VhcmNoKDAsMCxbMCwxLDIsMyw0LDUsNiw3LDgsOV0sW10pLg==