9.6 C
New York

Remark trouver le produit des nombres de Fib consécutifs en Python


0, 0, 1, 0, 2, 0, 2, 2, 1, 6, 0, 5, 0, 2, 6, 5, 4, 0, 5, 3, 0, 3, …

C’est la séquence de Van Eck.

Passons en revue étape par étape.

Terme 1 : Le premier terme est 0. Terme 2 : Puisque nous n’avons jamais vu de 0 auparavant, le second terme est 0. Terme 3 : Puisque nous avions déjà vu un 0, un pas en arrière, le troisième terme est 1 Terme 4 : Comme nous n’avons jamais vu de 1 auparavant, le quatrième terme est 0 Terme 5 : puisque nous avions déjà vu un 0, deux pas en arrière, le cinquième terme est 2. Et ainsi de…

Votre tâche est de trouver le n_ième nombre dans la séquence de Van Eck. (base 1)

La answer en Python

Possibility 1

from collections import Counter

c=Counter()
SEQ = (0)
for i in vary(1000):
    n = SEQ(-1)
    if not c(n): c(n)=i
    SEQ.append(i-c(n))
    c(n)=i
    
seq=SEQ.__getitem__

Possibility 2

def dist(arr):
    for i in vary (1, len(arr)):
        if arr(-1-i) == arr(-1):
            return i
    return 0

def seq(n):
    s = (0, 0)
    for _ in vary (n):
        s.append(dist(s))
    return s(n-1)
def seq(n):
    van, eck = (0), 0
    whereas n := n - 1:
        van.insert(0, eck := van.index(eck, 1) if eck in van(1:) else 0)
    return eck

Cas de take a look at pour valider la answer

from answer import seq
import take a look at

from random import randint

@take a look at.describe("Pattern exams:")
def exams():
    @take a look at.it("Small numbers")
    def _():
        s = (0, 0, 1, 0, 2, 0, 2, 2, 1, 6, 0, 5, 0, 2, 6)
        for i in vary (len(s)):
            take a look at.assert_equals(seq(i+1), s(i))
    @take a look at.it('Bigger numbers')
    def __():
        s = (3, 1, 42, 0, 5, 15, 20, 0, 4, 32, 0, 3, 11,
             18, 0, 4, 7, 0, 3, 7, 3, 2, 31, 0, 6, 31, 3,
             6, 3, 2, 8, 33, 0, 9, 56, 0, 3, 8, 7, 19, 0,
             5, 37, 0, 3, 8, 8, 1, 46, 0, 6, 23, 0)
        for i in vary (len(s)):
            take a look at.assert_equals(seq(i+50), s(i))

@take a look at.describe('Random exams:')
def r():

    def dist(arr):
        for i in vary (1, len(arr)):
            if arr(-1-i) == arr(-1):
                return i
        return 0

    def ref_sol(n):
        s = (0, 0)
        for _ in vary (n):
            s.append(dist(s))
        return s(n-1)
    
    @take a look at.it('200 random exams:')
    def _():
        for _ in vary (200):
            a = randint(100, 1000)
            exp = ref_sol(a)
            take a look at.assert_equals(seq(a), exp)

Related Articles

LAISSER UN COMMENTAIRE

S'il vous plaît entrez votre commentaire!
S'il vous plaît entrez votre nom ici

Latest Articles