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

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2049
Problem 49 「素数数列」 †
素数かつ等差数列かつ互いが置き換えな3つぐみ数列は4桁にふたつある。
これの片方を答えよ。

置き換えから計算。
計算時間0.7秒、遅いけど処理がきれいなのでまあいいかな。

not_prime(N):-N<2,!.
not_prime(N):-
	between(2,N,D),
	(D^2>N->!,fail;true),
	N mod D=:=0,
	!.
is_prime(N):-not(not_prime(N)).

seed([_,_,_,_]):-!.
ok([X|_]):-X>0.



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

set2([],[]):-!.
set2([X|Xs],Ys):-
	select(X,Ys,Ys1),
	set2(Xs,Ys1).

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

search([A1,B1,C1]):-
	seed(A),
	seed(B),
	seed(C),
	set(A),
	ok(A),
	to_num(A,0,A1),
	is_prime(A1),
 	set2(B,A),
	to_num(B,0,B1),
	A1<B1,
	is_prime(B1),
	set2(C,A),
	to_num(C,0,C1),
 	B1<C1,
	is_prime(C1),
	B1-A1=:=C1-B1.

main:-
	findall(E,search(E),Es),
	sort(Es,Ans),
	write(Ans).
最終更新:2014年12月07日 08:28