- 本記事はProjectEulerの「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。
問題 62. アナグラム立方数
原文 Problem 62: Cubic permutations
問題の要約:立方数の5通りのアナグラムがすべて立方数になるとき、その最小の立方数を求めよ
3通りの例は以下のようになり41063625が最小値となります。
41063625=345^3,56623104=384^3,66430125=405^3
1から順番に立方数を求めてそれを文字列にしてソートしたもの(アナグラムの最小値)をキーとしてDICT型に格納していきます。
例えば$5^3=125$と$8^3=512$はソートすると"125"となるのでDICT型にキーを"125"で値が[125,512]となります。この値の個数が5になった時点で答えとなります。
import itertools
def addPM(n):
pms = "".join(sorted(str(n))) # use sorted string as a key of dict
if pms in pmdict:
pmdict[pms].append(n)
else:
pmdict[pms] = [n]
return pms
pmdict = dict()
for i in itertools.count(345):
pms = addPM(i**3)
if len(pmdict[pms]) >= 5:
print(pms, pmdict[pms])
break
print(f"Answer: {pmdict[pms][0]}")
(開発環境:Google Colab)