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