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)