技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

プログラマ脳を鍛える数学パズル 19

続きです。

プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問

プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問

これを 20 分とか言語によるでしょ…マジで。
ヒントで素数を作っておけば…みたいな事は書いていますが、そもそもこのジェネレータが存在するのか分からん…。

仕方ないので、作ったのが以下の prime_generator で、メモリの続く限りは素数を生成する。

きちんと追いかけると分かるが、取り出すたびに stream の中に is_individable のスタックが溜まっていくので、どこかでフローする。
あと、論理的には判定対象の数字 N を割って試す数は N/2 まででいいはずだが、この論理だと、過去出た全ての素数を判定するので、利用しやすさはまだしも無駄は多い。

import itertools
import functools


def prime_generator():
    stream = itertools.count(2)
    def is_individable(x, y): return x % y != 0

    while True:
        prime = next(stream)
        stream = filter(functools.partial(is_individable, y=prime), stream)
        yield prime


if __name__ == "__main__":
    prime_gen = prime_generator()
    prime_nums = [next(prime_gen) for _ in range(6)]
    min_value = prime_nums[-1] ** 2
    min_datas = []

    for prime in itertools.permutations(prime_nums):
        friends = []

        # Head/Tail
        head = prime[0]
        tail = prime[-1]

        # Calc head*head, head*(head+1)...(tail-1)*tail
        for n in prime:
            friends.append(head * n)
            head = n

        # tail
        friends = friends + [tail**2]

        # update current result
        if min_value > max(friends):
            min_value = max(friends)
            min_datas = friends

    print(f'Minimum: {min_value} at Datas: {min_datas}')