Project Euler Problem 62

Problem 62

ECLiPSe CLP で解きました。
ほぼPure Prolog で、制約論理の述語は使用してません。
自分のマシンで約9秒。

プログラム:

:-lib(util).
:-dynamic(cubic_sorted/2).

go:-
retractall(cubic_sorted(_,_)),
between(1,1000000000000,I),
CubicNum is I * I * I,
digit_sort(CubicNum,Sorted),
assert(cubic_sorted(Sorted,I)),
findall(Num,cubic_sorted(Sorted,Num),NumLst),
length(NumLst,NumLen),
(
NumLen>=5->
sort(NumLst,NumLstSorted),
[First|_]=NumLstSorted,
CubeFirst is First * First * First,
printf(output, "CubicNum %d ,Lst %w", [CubeFirst, NumLst]),nl,
true
;
fail
)
.

digit_sort(Num,Sorted):-
num2lst(Num,Lst),
msort(Lst,Sorted).

% convert number to list(reversed)
num2lst(0,[]):-!.
num2lst(Num,[Dig|DigRst]):-
Dig is Num mod 10,
RestNum is Num // 10,
num2lst(RestNum,DigRst).

コマンドライン:

?- time(go).
Yes (9.22s cpu)

標準出力:

<解答伏せます。>

Success, times: 9.218750s thread, 9.219+0.000s process, 9.224s real

コメントを残す

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

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>