明日の面接。
久しぶりすぎて興奮して眠れない。
派遣面接だが派遣はいい思い出がない。
昔派遣先の事務所で待っていたら、30分延々と待たされた挙句、パーティション越しの事務所から聞こえてきた会話は自社派遣社員を笑いものにする会話が30分も続いた。
30分も人の悪口を続けられることもおかしいが、派遣は自社登録員をその程度の存在としか見てないのかと思ったり。
まあ面接だ。
眠れないので数学の問題などを解く。
2つの5角数をP1,P2とする。
P1-P2、P1+P2がともに五角数となるものがあるが、この条件を満たすP1,P2の組でD=|P1-P2|が最小値となるDを答えよ。
解法
説明するのがめんどくさいのでProlog言語そのまま記載。
もし答えがとても大きくなる問題だとcheck2関数の信頼性がいろいろ疑問視される。
がこの問題の答えの範囲なら誤差は出ない。
うーんでもA>B^2でB^2がもっともAに近くなる整数を返す述語があったようななかったような?
それを使えばcheck2関数はもっときれいになる。
答えが出るまで3.219sec。
まあまあだと思う。
もっと早い解法はありそう。
check(N,A,B):-
between(1,N,D),
T1 is N-3*D^2+D,
(T1 < 6*D ->!,fail;true),
0=:=T1 mod (6*D),
B is T1//(6*D),
A is B+D,
N=:=(A-B)*(3*A+3*B-1).
check2(A,B):-
calc5(A,D1),
calc5(B,D2),
D3 is 1+24*(D1+D2),
sqrt(D3,D4),
floor(D4,D5),
D4=:=D5,
D6 is 1+D5,
D6>0,
0=:=D6 mod 6.
search(2000):-!.
search(D):-
calc5(D,D1),
D2 is D1*2,
check(D2,A,B),
check2(A,B),
!,
writeln([ans,D1,A,B]).
search(D):-
D1 is D+1,
search(D1).
main:-search(2).
0 件のコメント:
コメントを投稿