https://odz.sakura.ne.jp/projecteuler/index.php?Problem+49
ChatGPTで「Project Eulerであなたが解くのに難儀する問題をリストアップせよ」と言って出た問題の一つを解いてみた。
ただ自分で解いたのちにChatGPTでソース出力せよと言ったらちゃんと解けるソース(だいぶ速度は遅い)出してきました。
ChatGPTでProjectEulerの答えを出せと言った時に、どうも生成したソースを実行して答えを出しているのではなく、「WEBで学習した答えの値そのもの」を出しているようです(問い詰めると白状する)
ProjectEulerで答えのみバンバン入力して正答数稼ぐことは簡単そうです(意味ないですが…)
私のソースは制約論理プログラミングを使用したものです。
「それぞれの数字は各桁を入れ替えたもの」を表す制約の記述が正しいか微妙ですが答えは合っていました。
ソースコード(回答は省略):
%problem 49
:-lib(ic).
% ABCD,EFGH,IJKL の3つの数字を想定
solve:-
[A,E,I]#::[1..9],
[B,C,D,F,G,H,J,K,L]#::[0..9],
Num1 #= 1000*A + 100*B + 10*C + D,
Num2 #= 1000*E + 100*F + 10*G + H,
Num3 #= 1000*I + 100*J + 10*K + L,
alldifferent([Num1,Num2,Num3]),
Num3 - Num2 #= Num2 - Num1,
Num1 #< Num2,
Num2 #< Num3,
PrimeMax is 9999,
assert(max(PrimeMax)),
make_list(PrimeMax,Lst),
eratosthenes_sieve(Lst,PrimeLst), % エラトステネスのふるいによる素数列挙
% Num1,Num2,Num3は素数
element(_,PrimeLst,Num1),
element(_,PrimeLst,Num2),
element(_,PrimeLst,Num3),
(A #= E) or (A #= F) or (A #= G) or (A #= H),
(B #= E) or (B #= F) or (B #= G) or (B #= H),
(C #= E) or (C #= F) or (C #= G) or (C #= H),
(D #= E) or (D #= F) or (D #= G) or (D #= H),
(E #= A) or (E #= B) or (E #= C) or (E #= D),
(F #= A) or (F #= B) or (F #= C) or (F #= D),
(G #= A) or (G #= B) or (G #= C) or (G #= D),
(H #= A) or (H #= B) or (H #= G) or (H #= D),
A+B+C+D #= E+F+G+H,
(A #= I) or (A #= J) or (A #= K) or (A #= L),
(B #= I) or (B #= J) or (B #= K) or (B #= L),
(C #= I) or (C #= J) or (C #= K) or (C #= L),
(D #= I) or (D #= J) or (D #= K) or (D #= L),
(H #= A) or (H #= B) or (H #= C) or (H #= D),
(J #= A) or (J #= B) or (J #= C) or (J #= D),
(K #= A) or (K #= B) or (K #= C) or (K #= D),
(L #= A) or (L #= B) or (L #= C) or (L #= D),
A+B+C+D #= H+I+J+K,
labeling([A,B,C,D,E,F,G,H,I,J,K,L,Num1,Num2,Num3]),
writeln([Num1,Num2,Num3]).
mk_lst([],_,[]):-!.
mk_lst([First|Rest],Th,[Rest]):-
First>Th,
mk_lst(Rest,Th,Rest).
mk_lst([First|Rest],Th,[First|Rest]):-
mk_lst(Rest,Th,Rest).
% 2 ~ Idx までのリストを作成
make_list(Idx,List):-
make_list_sub(Idx,List,[]).
make_list_sub(1,Ret,Ret):-!.
make_list_sub(Idx,Ret,List):-
Idx1 is Idx - 1,
make_list_sub(Idx1,Ret,[Idx | List]).
% 素数列挙 エラトステネスのふるい
eratosthenes_sieve([],[]):-!.
eratosthenes_sieve([First | Rest],[First | Rest]):-
max(Max),
First * First > Max ,
!.
eratosthenes_sieve([First | Rest], [First | Ret]):-
erase_baisu(First,Rest,Rest1),
eratosthenes_sieve(Rest1,Ret).
erase_baisu(,[],[]):-!. erase_baisu(Base,[First | Rest],[First | Ret]):- First mod Base == 0, !, erase_baisu(Base,Rest,Ret). erase_baisu(Base,[ | Rest],Ret):-
erase_baisu(Base,Rest,Ret).
コメントを残す