プログラマ脳を鍛える数学パズル 19
続きです。
プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問
- 作者: 増井敏克
- 出版社/メーカー: 翔泳社
- 発売日: 2015/10/14
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (11件) を見る
これを 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}')