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

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%20106
Problem 106 「特殊和集合:メタ検査」 †
特殊和集合のルール1で検討すべき組み合わせの個数をこたえる問題。

全探索して全ケースで検討すべきかをチェック。
小さいほうどうしから順にワンセットとして比べて、片方が片方に全部負けてるなら検討する必要なし。
他の人は数式一発で解いてそうだなこれ。


check([],[],0,_,_):-!,fail.
check([],[],_,0,_):-!,fail.
check([],[],_,_,1):-!.

check([X|Xs],[Y|Ys],C1,C2,Result):-
	X>Y,
	!,
	C11 is C1+1,
	check(Xs,Ys,C11,C2,Result).
check([_|Xs],[_|Ys],C1,C2,Result):-
	!,
	C22 is C2+1,
	check(Xs,Ys,C1,C22,Result).

selects([],_):-!.
selects([X|Xs],Nums):-
	append(_,[X|Nums1],Nums),
	selects(Xs,Nums1).

delete([],Result,Result):-!.
delete([X|Xs],Nums,Result):-
	select(X,Nums,Nums1),
	delete(Xs,Nums1,Result).

seed(0,[]):-!.
seed(N,[_|Result]):-
	N1 is N-1,
	seed(N1,Result).

 
search(E):-
      A1=[1,2,3,4,5,6,7,8,9,10,11,12],
      between(2,6,S),
      seed(S,L1),
      seed(S,L2),
      selects(L1,A1),
      delete(L1,A1,A2),
      selects(L2,A2),
       check(L1,L2,0,0,E).
  
main:-
	findall(E,search(E),Es),
	length(Es,Ans),
	Ans1 is Ans//2,
	write(Ans1).
最終更新:2015年01月07日 02:47