プロジェクトオイラー問68

Problem 68 「Magic 5-gon ring」 †
5角形の変形魔方陣を解く問題。


解法
全探索で間に合います。
出てきた答えの中から目視で選択。


to_num([],Sum,Sum):-!.
to_num([10|Rest],Sum,Result):-
	!,
	Sum1 is Sum*100+10,
	to_num(Rest,Sum1,Result).
to_num([X|Rest],Sum,Result):-
	Sum1 is Sum*10+X,
	to_num(Rest,Sum1,Result).


board([[_,B,C],[_,C,E],[_,E,G],[_,G,I],[_,I,B]]).

sum3([],Nums,Nums,Sum3,Sum3):-!.
sum3([X|Xs],Nums,ResultNums,Sum3,Wa):-
	(integer(X)->Nums1 = Nums;
	select(X,Nums,Nums1)),
	Sum3A is Sum3+X,
	sum3(Xs,Nums1,ResultNums,Sum3A,Wa).

search(_,_,[],[],_):-!.
search(Wa,Nums,[B3|Board],[B3|Result],Min):-
 	sum3(B3,Nums,Nums1,0,Wa),
	[Top|_]=B3,
	Min=<Top,
	search(Wa,Nums1,Board,Result,Min).
main:-
	Nums=[1,2,3,4,5,6,7,8,9,10],
	board(Board),
	[Top|_]=Board,
 	sum3(Top,Nums,Nums1,0,Wa),
[Min|_]=Top,
 	search(Wa,Nums1,Board,Ans,Min),
	flatten(Ans,Ans1),
	to_num(Ans1,0,Ans2),
	Ans2<10^16,
	write(Ans2),nl,fail.
最終更新:2014年12月12日 13:53