Toplamları Asal olan ardışık Asallar

Asal jeneratoru:

import sympy

def primes():
    n = 1
    while True:
        yield sympy.prime(n)
        n += 1

(sympy’de yok mu?)

Suradaki inits fonksiyonunun tembel/jenerator versiyonu:

def inits(it):
    head = []
    while True:
        e = next(it)
        yield head + [e]
        head += [e]

Asal zinciri jeneratoru:

import itertools

def ranges_less_than(gen, sum_):
    g1, g2 = itertools.tee(gen)
    yield from itertools.takewhile(lambda ps: sum(ps) <= sum_, inits(g1))
    try:
        n = next(g2)
    except StopIteration:
        return
    if n > sum_:
        return
    yield from ranges_less_than(g2, sum_)

Toplami asal < 999 olan cok halkali zincirler:

chains = filter(lambda ns_len_sum: ns_len_sum[1] > 1 and sympy.isprime(ns_len_sum[2]), map(lambda ns: (ns, len(ns), sum(ns)), ranges_less_than(primes(), 999)))

En uzun zincir:

print(sorted(chains, key=lambda n_l_s: n_l_s[1], reverse=True)[0])

([7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89], 21, 953)

Challenge:

Toplami sum_'dan kucuk olan butun gen zincirlerini ureten yukaridaki ranges_less_than fonksiyonunun butun gen zincirlerini ureten versiyonunu yazin.

2 Beğeni