Introdução
Obviamente, temos muitos desafios de sequência , então aqui está outro.
A sequência de Kimberling ( A007063 ) é a seguinte:
1, 3, 5, 4, 10, 7, 15, 8, 20, 9, 18, 24, 31, 14, 28, 22, ...
Isso é produzido baralhando a iteração normal:
[1] 2 3 4 5 6 7 8
O primeiro termo da sequência é 1
. Depois disso, reorganizamos a sequência até que todos os termos à esquerda sejam usados. O embaralhamento tem o padrão right - left - right - left - ...
. Como não há termos à esquerda do 1
, não há embaralhamento. Temos o seguinte:
2 [3] 4 5 6 7 8 9
No i th iteração, descartar o i th item e colocar isso na nossa seqüência. Esta é a segunda iteração, então descartamos o segundo item. A sequência torna-se: 1, 3
. Para a nossa próxima iteração, vamos embaralhar a iteração atual com o padrão acima. Tomamos o primeiro item não utilizado à direita do i- ésimo item. Isso acontece ser 4
. Vamos anexar isso à nossa nova iteração:
4
Agora, pegaremos o primeiro item não utilizado à esquerda do i- ésimo item. Isto é 2
. Vamos anexar isso à nossa nova iteração:
4 2
Como não há itens à esquerda do i- ésimo item, apenas anexaremos o restante da sequência à nova iteração:
4 2 [5] 6 7 8 9 10 11 ...
Esta é a nossa terceira iteração, então vamos descartar o terceiro item, que é 5
. Este é o terceiro item da nossa sequência:
1, 3, 5
Para obter a próxima iteração, basta repetir o processo. Eu fiz um gif se não estiver claro:
O gif me levou mais tempo do que escrever a postagem real
Tarefa
- Dado um número inteiro não negativo n , produza os primeiros n termos da sequência
- Você pode fornecer uma função ou um programa
- Isso é código-golfe , então a submissão com a menor quantidade de bytes ganha!
Casos de teste:
Input: 4
Output: 1, 3, 5, 4
Input: 8
Output: 1, 3, 5, 4, 10, 7, 15, 8
Input: 15
Output: 1, 3, 5, 4, 10, 7, 15, 8, 20, 9, 18, 24, 31, 14, 28
Nota: As vírgulas na saída não são necessárias. Você pode, por exemplo, usar novas linhas ou gerar uma lista, etc.
Respostas:
Pitão, 22 bytes
Experimente online: Demonstração
Simplesmente executa a técnica de embaralhamento descrita no OP.
Explicação:
fonte
Julia,
7871 bytesEsta é uma função sem nome que aceita um número inteiro e retorna uma matriz inteira. Para chamá-lo, atribua-o a uma variável.
A abordagem aqui é a mesma descrita na OEIS.
Ungolfed:
Economizou 7 bytes graças a Mauris!
fonte
Mathematica 130 bytes
Começamos com uma lista que consiste no intervalo de
1
até3x
, ondex
é o número desejado de termos de sequência de Kimberling.A cada passo,
n
,TakeDrop
quebra a lista atual em uma lista frente de2n+1
termos (onde o trabalho é feito) e lista traseira (que será mais tarde se juntou com o reformulado lista frontal). A lista da frente corresponde ao seguinte padrão, em{t___,z,r___}
que z é o termo de Kimberling no centro da lista da frente.r
éRiffle
marcado com o reverso det
e, em seguida, a lista traseira é anexada.z
é removido e anexado a (AppendTo
) a crescente sequência de Kimberling.n
é incrementado1
e a lista atual é processada pela mesma função viaNest.
Exemplo
fonte
Python 2, 76 bytes
Explicação
Esta é a fórmula OEIS após muitas transformações de golfe! Funcionou lindamente . O código original era
Eu me livrei
i
, substituindo-o pora+1
todos os lugares e expandindo as expressões:Em seguida, reescreva
b<2*a-1
como-~b<2*a
salvar um byte de espaço em branco e mova o+1
para a seleção, a divisão por 2 e a negação:Então,
-b-1
é justo~b
, para que possamos escrever(b,~b)[b%2]
. Isso é equivalente ab^0 if b%2 else b^-1
usar o operador XOR ou, alternativamenteb^b%-2
,.fonte
Pitão,
2925 bytesJakube salvou 4 bytes, mas não tenho mais idéia de como ler o código.
Aqui está a solução antiga:
Tradução da minha resposta em Python. Eu não sou muito bom em Pyth, então talvez ainda haja maneiras de reduzir isso.
fonte
.W
a golf off 4 bytes:VQ+.W<hHyN-~tN/x%Z_2Z2hNN
..W
tem a forma:.W<condition><apply><start-value>
. Eu usei o valor inicialhN
, como você usouKhN
..W
altera esse valor desde que<condition>
seja verdadeiro. Eu usei a mesma condição que você<hHyN
. A condição é uma função lambda com o parâmetroH
, portanto, o valor atual (no seu códigoK
) éH
. E também usei a mesma<apply>
instrução que você, substitui apenasK
porZ
, porque a<apply>
instrução é uma função lambda com parâmetroZ
. Podemos ignorar o=K
,.W
lida com isso. Ele substitui o valor antigo pelo calculado. No final, imprima+...N
APL,
5644 bytesEste é um trem monádico sem nome que aceita um número inteiro à direita e retorna uma matriz. É mais ou menos a mesma abordagem que minha resposta de Julia .
A função mais interna é uma função recursiva dyadic que retorna o n th prazo na sequência Kimberling, dado n como argumentos certos idênticos e esquerdo.
Com isso em mãos, podemos obter termos individuais da sequência. No entanto, o problema passa a ser que essa é uma função diádica , o que significa que exige argumentos de ambos os lados. Entre no
⍨
operador! Dada uma funçãof
e uma entradax
,f⍨x
é o mesmo quex f x
. Assim, no nosso caso, referindo-se à função mencionada comof
, podemos construir o seguinte trem monádico:Nós aplicamos
f
a cada número inteiro de 1 à entrada, produzindo uma matriz.Economizou 12 bytes graças a Dennis!
fonte