「prolog勉強プロジェクトオイラー191~200」の編集履歴(バックアップ)一覧に戻る
one_calc([L,_,P],[L,0,P]).% one_calc([0,_,P],[1,0,P]).% one_calc([L,0,P],[L,1,P]).% one_calc([L,1,P],[L,2,P]).% union_sum([],Y,[Y]):-!. union_sum([[L,A,P]|Rest],[L,A,P1],Result):- !, P2 is P+P1, union_sum(Rest,[L,A,P2],Result). union_sum([X|Rest],Y,[Y|Result]):- union_sum(Rest,X,Result). next_calc(Sets,Result):- member(Set,Sets), one_calc(Set,Result). sum([],0):-!. sum([[_,_,P]|Rest],Result):-sum(Rest,Re),Result is Re+P. search(30,Sets):-!,write(Sets),nl,sum(Sets,Ans),write(Ans). search(N,Sets):- findall(Set,next_calc(Sets,Set),Sets1), msort(Sets1,Sets2), [Top|Sets3]=Sets2, union_sum(Sets3,Top,Sets4), N1 is N+1, search(N1,Sets4). main191:- search(0,[[0,0,1]]).
in(R1,R2,R3,Result):- A is R3+R2, B is R1+R3, C is R1+R2, CosA is (B^2+C^2-A^2)/(2*B*C), SinA is sqrt(1-CosA^2), X1 is C, X2 is B*CosA, Y2 is B*SinA, S1 is X1^2+R1^2-R2^2, S2 is X2^2+R1^2+Y2^2-R3^2, S3 is X1*R1-X1*R3-X2*R1+X2*R2, S4 is -1*S1*X2+S2*X1, S5 is R1-R2, S6 is 4*Y2^2*S5^2+4*S3^2-4*Y2^2*X1^2, S7 is 4*Y2^2*S5*S1+4*S3*S4-8*Y2^2*X1^2*R1, S8 is Y2^2*S1^2+S4^2-4*Y2^2*X1^2*R1^2, Result is (-S7-sqrt(S7^2-4*S6*S8))/(2*S6). %XA is (2*Result*(R1-R2)+S1)/(2*X1), %YA is (2*Result*(R1-R3)-2*XA*X2+S2)/(2*Y2). out(R1,R2,R3,Result):- A is R2+R3, B is R1-R3, C is R1-R2, CosA is (B^2+C^2-A^2)/(2*B*C), SinA is sqrt(1-CosA^2), X1 is R1-R2, X2 is B*CosA, Y2 is B*SinA, S1 is R1^2+X1^2-R2^2, S2 is X2^2+R1^2+Y2^2-R3^2, S3 is R1+R2, S4 is R1+R3, S5 is 2*(S3*X2-S4*X1), S6 is S2*X1-S1*X2, S7 is 4*Y2^2*S3^2+S5^2-4*Y2^2*X1^2, S8 is -4*S1*S3*Y2^2+2*S5*S6+2*R1*4*Y2^2*X1^2, S9 is S1^2*Y2^2+S6^2-R1^2*4*Y2^2*X1^2, Result is (-S8-sqrt(S8^2-4*S7*S9))/(2*S7). %XA is (-2*Result*(R1+R2)+S1)/(2*X1), %YA is (Result*S5+S6)/(2*Y2*X1), %write([XA,YA]). sum([],0):-!. sum([X|Xs],Result):-sum(Xs,Re),Result is Re+X. next_in_a(_,_,_,_,R4,R44):-R44 is R4^2. next_in_a(10,_,_,_,_,0):-!,fail. next_in_a(N,R1,R2,_,R4,Result):- next_in(N,R1,R2,R4,Result). next_in_a(N,R1,_,R3,R4,Result):- next_in(N,R1,R3,R4,Result). next_in_a(N,_,R2,R3,R4,Result):- next_in(N,R2,R3,R4,Result). next_out_a(_,_,_,_,R4,R44):-R44 is R4^2. next_out_a(10,_,_,_,_,0):-!,fail. next_out_a(N,R1,R2,_,R4,Result):- next_out(N,R1,R2,R4,Result). next_out_a(N,R1,_,R3,R4,Result):- next_out(N,R1,R4,R3,Result). next_out_a(N,_,R2,R3,R4,Result):- next_in(N,R2,R3,R4,Result). next_in(N,R1,R2,R3,Result):- N1 is N+1, in(R1,R2,R3,R4), findall(S,next_in_a(N1,R1,R2,R3,R4,S),Sum), sum(Sum,Result). next_out(N,R1,R2,R3,Result):- N1 is N+1, out(R1,R2,R3,R4), findall(S,next_out_a(N1,R1,R2,R3,R4,S),Sum), sum(Sum,Result). main199:- R2 is (-6+sqrt(48))/2, S2 is R2^2*3, next_in(0,R2,R2,R2,AnsIn),nl,nl, next_out(0,1,R2,R2,AnsOut), nl,write([AnsIn,AnsOut,S2]),nl, Ans is 1-(AnsIn+AnsOut*3+S2), write(Ans).