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

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%20125
Problem 125 「回文数の和」 †
連続した平方数の和で表せる10^8以下の回文数の和を求めよ

解法
私は全探索以外のソリューションを見つけることができなかった。
ダサい。

last(100000000):-!.
seed([_]).
seed([A,A]).
seed([A,_,A]).
seed([A,B,B,A]).
seed([A,B,_,B,A]).
seed([A,B,C,C,B,A]).
seed([A,B,C,_,C,B,A]).
seed([A,B,C,D,D,C,B,A]).

set([]).
set([X|Xs]):-
	member(X,[0,1,2,3,4,5,6,7,8,9]),
	set(Xs).

to_num([],Num,Num):-!.
to_num([X|Xs],Num,Result):-
	!,
	Num1 is Num*10+X,
	to_num(Xs,Num1,Result).

create(Num):-
	seed(Seed),
	set(Seed),
	[A|_]=Seed,
	A>0,
	to_num(Seed,0,Num).

calc2(_,_,[],Add,[],Add):-!.
calc2(Sum,A,[Sum|Rest],Add,Result,ResultAdd):-
	!,
	Sum1 is Sum+A^2,
	A1 is A+1,
	Add1 is Add+Sum,
	calc2(Sum1,A1,Rest,Add1,Result,ResultAdd).

calc2(Sum,A,[Num|Rest],Add,Result,ResultAdd):-
	Sum<Num,
	!,
	Sum1 is Sum+A^2,
	A1 is A+1,
	calc2(Sum1,A1,[Num|Rest],Add,Result,ResultAdd).

calc2(Sum,A,[Num|Rest],Add,[Num|Result],ResultAdd):-
 	!,
	calc2(Sum,A,Rest,Add,Result,ResultAdd).

calc(A,_,Ans):-
	last(N),
	2*A^2+2*A+1>=N,
	!,
	write(Ans).
calc(A,Nums,Ans):-
	Sum is 2*A^2+2*A+1,
	A1 is A+1,
	A2 is A1+1,
	calc2(Sum,A2,Nums,0,Nums1,Add),
 	Ans1 is Ans+Add,
	calc(A1,Nums1,Ans1).

main:-
	findall(E,create(E),Es),
	sort(Es,Nums),
	calc(1,Nums,0).
最終更新:2015年01月07日 09:33