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

コメント

“Project Euler Problem 62” への2件のフィードバック

  1. 中島誠一のアバター
    中島誠一

    30年ほど前にDEC-2060のprologとPSIのESPで開発をしていました。当時、研究所の方が制約プログラムとしてtau言語(?)をESPで作成し、魔法陣をtau環境で実行しました。

    M.Hiroi’s Home Page で制約論理プログラムを見つけて魔法陣がSWI-prolog, clpfdで短時間に解けることに驚き、このページにたどり着き、ECLiPse_clpの導入を開始しています。

    Tensorflowを個人で勉強してDeepLearningは目の機能を実現してもAIには遠いと感じていました。prologには将来性があると思っています。ECLiPse_clpの情報発信に期待します。

    1. koyahataのアバター
      koyahata

      うわー返信ものすごく遅れて大変申し訳ありません!!!来るコメントすべてスパムばかりだったのでブログのコメントページを全く見ておりませんでした。

      中島さんのコメントのtau言語、ESP、Tensorflowどれもあまりよくわからなかったので勉強します。
      ECLiPSeは現在も勉強中ですので気が向いたらブログ書くようにします。

      ECLiPSeのtutorialのpdfがかなり良い資料で、これを読んでいるだけで制約論理プログラミングがどのようなものかがおぼろげに分かってくるような感じがします。
      ECLiPSe CLP tutorial

コメントを残す

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