美しくない。
Problem 32 「パンデジタル積」
すべての桁に 1 から n が一度だけ使われている数をn桁の数がパンデジタル (pandigital) であるということにしよう: 例えば5桁の数 15234 は1から5のパンデジタルである.
7254 は面白い性質を持っている. 39 × 186 = 7254 と書け, 掛けられる数, 掛ける数, 積が1から9のパンデジタルとなる.
掛けられる数/掛ける数/積が1から9のパンデジタルとなるような積の総和を求めよ.
HINT: いくつかの積は, 1通り以上の掛けられる数/掛ける数/積の組み合わせを持つが1回だけ数え上げよ.
def search(sa, ea, sb, eb):
d = list('123456789')
digits = set()
for a in range(sa, ea + 1): # a : 掛けられる数
for b in range(sb, eb + 1): # b : 掛ける数
c = a * b
if sorted(list(str(a) + str(b) + str(c))) == d:
digits.add(c)
return digits
def hoge():
# 掛けられる数/掛ける数/積が1から9のパンデジタルとなるのは
#「1桁 x 4桁 = 4桁」と「2桁 x 3桁 = 4桁」のみ(たぶん)
return sum(search(1, 9, 1234, 9876) | search(12, 98, 123, 987))
print(hoge())
はじめは重複チェックや桁数チェック入れてたけども見辛いし性能も大して変わらなかったのでやめた。
コメントで書いてる内容も自動的に判定するようにしたかったけど思いつかなかったので諦めた。