LoginSignup
2
1

More than 5 years have passed since last update.

Project Euler 32「パンデジタル積」

Last updated at Posted at 2018-02-16

美しくない。

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

はじめは重複チェックや桁数チェック入れてたけども見辛いし性能も大して変わらなかったのでやめた。
コメントで書いてる内容も自動的に判定するようにしたかったけど思いつかなかったので諦めた。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1