Sequência de Szekeres

9

Definição

  • a(1) = 1
  • a(2) = 2
  • a(n)é o menor número k>a(n-1)que evita qualquer progressão aritmética em 3 termos em a(1), a(2), ..., a(n-1), k.
  • Em outras palavras, a(n)é o menor número k>a(n-1)que não existe x, yonde 0<x<y<ne a(y)-a(x) = k-a(y).

Exemplo elaborado

Para n=5:

Nós temos a(1), a(2), a(3), a(4) = 1, 2, 4, 5

Se a(5)=6, 2, 4, 6forme uma progressão aritmética.

Se a(5)=7, 1, 4, 7forme uma progressão aritmética.

Se a(5)=8, 2, 5, 8forme uma progressão aritmética.

Se a(5)=9, 1, 5, 9forme uma progressão aritmética.

Se a(5)=10, nenhuma progressão aritmética pode ser encontrada.

Portanto a(5)=10.

Tarefa

Dado n, saída a(n).

Especificações

  • n será um número inteiro positivo.
  • Você pode usar 0 indexado em vez de 1, nesse caso, npode ser 0. Por favor, indique-o na sua resposta se você estiver usando o índice 0.

Pontuação

Como estamos tentando evitar a progressão aritmética em 3 períodos, e 3 é um número pequeno, seu código deve ser o menor (ou seja, o mais curto) possível, em termos de contagem de bytes.

Casos de teste

As caixas de teste são indexadas em 1. Você pode usar o índice 0, mas especifique-o na sua resposta se o fizer.

1     1
2     2
3     4
4     5
5     10
6     11
7     13
8     14
9     28
10    29
11    31
12    32
13    37
14    38
15    40
16    41
17    82
18    83
19    85
20    86
10000 1679657

Referências

Freira Furada
fonte
2
Relacionado. (Se eu entender seu desafio corretamente.)
Martin Ender
@MartinEnder Você entendeu meu desafio corretamente.
Leaky Nun

Respostas:

6

Haskell, 37 36 32 bytes

Usando a fórmula fornecida na entrada OEIS, usando índices baseados em 0. Obrigado @nimi por 4 bytes!

a 0=1;a m=3*a(div m 2)-2+mod m 2
flawr
fonte
3

Python 3, 28 bytes

lambda n:int(bin(n)[2:],3)+1

Uma função anônima que recebe entrada por meio de argumento e retorna o resultado. Isso é zero-indexado.

Como funciona

lambda n    Anonymous function with input zero-indexed term index n
bin(n)      Convert n to a binary string..
...[2:]     ...remove `0b` from beginning...
int(...,3)  ...convert from base-3 to decimal...
...+1       ...increment...
:...        and return

Experimente no Ideone

TheBikingViking
fonte
2

Python 3, 113 bytes

def f(n):
 i=1;a=[]
 for _ in range(n):
  while any(i+x in[y*2for y in a]for x in a):i+=1
  a+=[i]
 return a[n-1]

Ideone it!

Freira Furada
fonte
2

Rubi, 28. 24 bytes

Usando o mesmo método que Dennis, com índices baseados em 0:

->n{n.to_s(2).to_i(3)+1}

Execute os casos de teste em repl.it: https://repl.it/Cif8/1

Jordânia
fonte
2

Pyke, 5 bytes

b2b3h

Experimente aqui!

Indexação baseada em 0

A mesma fórmula da resposta da geléia

Azul
fonte
0

Java 8, 52 46 bytes

0 indexado.

i->Integer.valueOf(Integer.toString(i,2),3)+1;
Justin
fonte
Você não precisa o returnmas você precisa fazer o ponto e vírgula depois
Leaky Nun
Esta resposta que diz ponto e vírgula não é contada; Eu poderia mudar de qualquer maneira, mas a contagem de ponto e vírgula é o consenso?
23716 Justin Justin
Eh, foi o que eles me disseram. Não sei se o consenso é como tal.
Freira vazada
Tudo bem, sem retorno, mais ponto e vírgula é mais curto do que antes de qualquer maneira :)
Justin