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

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%20109
Problem 109 「ダーツ」 †
100点未満でダーツの勝負が終わるときの組み合わせ数を求める問題。


解法
25が3倍がないので特殊処理。
うーんもう少し綺麗な処理にならないかなこれ。
全部の組み合わせを作り一つ一つsortして末尾が2倍のだけ残してfindallでまとめてsortで重複を消して数えれば綺麗になるか。
この場合計算量とメモリ使用量が増えるな(といっても微増だけど)


s(25,T,1,25):-T=<1.
s(25,T,2,50):-T=<2.
s(25,_,_,_):-!,fail.
s(N,T,1,N):-T=<1.
s(N,T,2,N2):-T=<2,N2 is N*2.
s(N,T,3,N3):-T=<3,N3 is N*3. 

score(N):-between(1,20,N).
score(25):-!.

check(T,T,N,M):-M<N,!,fail.
check(_,_,_,_):-!.



calc2(N,_):-
	score(M),
	N+M*2<100.

calc2(N,T):-
	score(M),
	s(M,T,T2,M2),
 	check(T,T2,N,M2),
	score(L),
	L2 is L*2,
	N+M2+L2<100.

calc1(1):-
	score(_).
calc1(1):-
	score(N),
	s(N,1,T,N2),
	calc2(N2,T).
 

main:-
	findall(E,calc1(E),Es),
	length(Es,Ans),
	write(Ans).
最終更新:2015年01月28日 04:38