Project Euler 49

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).

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です