Este é um reposicionamento de um antigo desafio , a fim de ajustar os requisitos de E / S aos nossos padrões recentes. Isso é feito em um esforço para permitir que mais idiomas participem de um desafio sobre essa sequência popular. Veja este meta post para uma discussão sobre o repost.
A sequência Kolakoski é uma sequência auto-referencial divertida, que tem a honra de ser a sequência OEIS A000002 (e é muito mais fácil de entender e implementar do que A000001). A sequência começa com um , consiste apenas de 1 s e 2 s e o elemento de sequência A (n) descreve o comprimento do n ° de execução de 1 s ou 2 s na sequcia. Isso define exclusivamente a sequência a ser (com uma visualização das execuções abaixo):
1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1,2,1,1,2,1,2,2,1,1,2,1,1,2,...
= === === = = === = === === = === === = = === = = === === = === =
1, 2, 2, 1,1, 2, 1, 2, 2, 1, 2, 2, 1,1, 2, 1,1, 2, 2, 1, 2, 1,...
Sua tarefa é, é claro, implementar essa sequência. Você pode escolher um dos três formatos para fazer isso:
- Tomar uma entrada n e saída do n ésimo termo da sequência, em que n é iniciado quer a partir de 0 ou 1 .
- Tomar uma entrada n e saída os termos até e incluindo o n ésimo termo da sequência, em que n é iniciado quer a partir de 0 ou 1 (ou seja, quer imprimir a primeira n ou o primeiro n + 1 termos).
- Valores de saída da sequência indefinidamente.
No segundo e terceiro caso, você pode escolher qualquer formato de lista razoável e inequívoco. Tudo bem se não houver separador entre os elementos, pois eles sempre têm um único dígito por definição.
No terceiro caso, se o seu envio for uma função, você também poderá retornar uma lista infinita ou um gerador nos idiomas que os suportam.
Você pode escrever um programa ou uma função e usar qualquer um dos nossos métodos padrão de recebimento de entrada e saída. Observe que essas brechas são proibidas por padrão.
Isso é código-golfe , então a resposta mais curta e válida - medida em bytes - vence.
Respostas:
Geléia , 7 bytes
Este é um programa completo que imprime os primeiros n termos.
Experimente online!
Como funciona
Exemplo de execução
Seja n = 5 .
A primeira invocação da cadeia se repete 1, 2 ciclicamente para atingir o comprimento 5 , depois cada elemento 5 vezes e, finalmente, trunca o resultado para o comprimento 5 .
Isso produz uma lista de comprimento 5 . O primeiro elemento é o primeiro elemento da sequência de Kolakoski.
A segunda invocação da cadeia repete 1, 2 ciclicamente para atingir o comprimento 5 , depois repete o k- ésimo elemento j vezes, onde j é o k- ésimo elemento da lista anterior e, finalmente, trunca o resultado para o comprimento 5 .
Isso produz outra lista de comprimento 5 . Os dois primeiros elementos são os dois primeiros da sequência de Kolakoski.
O processo continua por mais três iterações.
Estes são os cinco primeiros elementos da sequência de Kolakoski.
fonte
Python 2 , 51 bytes
Imprime indefinidamente. Cria a lista à
l
medida que é iterada. Para cada entradax
del
, anexax
cópias de1
ou2
, o que estiver oposto ao último elemento atual.A principal dificuldade está em lidar com o fragmento auto-referencial inicial
[1,2,2]
. Este código apenas imprime a inicial1,2
e prossegue a partir daí. A impressão extra custa 12 bytes. Sem isso:39 bytes , faltando as duas primeiras entradas:
Outra abordagem é inicializar especialmente as duas primeiras entradas. Inicializamos
l
como[0,0,2]
para que as duas primeiras entradas não causem anexos, mas asprint x or n
fazem ser impressas comon
.51 bytes
Outra correção é inicializar
l=[1]
, rastrear a alternância manualmenten
e corrigir a impressão:51 bytes
Sem o
(l==[1,1])+
, tudo funciona, exceto as seqüências impressas, em1,1,2
vez de1,2,2
. Tem que haver uma maneira melhor de reconhecer que estamos neste segundo passo.E outra correção estranha, também de alguma forma a mesma contagem de bytes:
51 bytes
fonte
Wumpus ,
1311 bytesExperimente online!
Imprime a sequência indefinidamente sem separadores.
Estou genuinamente surpreso com o quão curto isso é.
Explicação
A idéia básica é manter a sequência na pilha e usar repetidamente o elemento mais baixo para gerar outra execução e imprimi-la. Estamos abusando efetivamente da pilha como uma fila aqui. Também podemos salvar alguns bytes trabalhando
0
e1
(incrementando apenas para saída) em vez de1
e2
, porque dessa forma não precisamos inicializar explicitamente a pilha com ae1
podemos usar negação lógica para alternar entre os dois valores.fonte
Brachylog ,
30 26 25 23 17 1614 bytesProduz os primeiros n valores. Usa a "variável de saída"
.
para entrada e as saídas para a "variável de entrada"?
. Experimente online!Explicação
Estou muito feliz com o quão declarativo isso acabou: o programa é basicamente uma descrição de alto nível da lista de saída e sua relação com a entrada.
Como
{1|2}ᵐ
as listas de tentativas estão em ordem lexicográfica, a saída começará com 1.fonte
Casca , 10 bytes
Retorna os primeiros n valores. Experimente online!
Explicação
Para a entrada 20, o processo é assim:
fonte
Java 10,
15510810510097 bytesImprime indefinidamente sem delimitador.
-3 bytes após uma dica indireta de @Neil .
-5 bytes graças a @MartinEnder .
-3 bytes convertendo Java 8 em Java 10.
Explicação:
Experimente online (o tempo limite é excedido após 60 segundos no TIO).
fonte
[1,2,2]
e depois a partir daí) e escrevi a resposta de 155 bytes (que agora é jogada usando uma String em vez de Lista).(3-i)
vez de(1+i%2)
?i
não é 1 ou 2, é o índice de strings.Gelatina , 10 bytes
Retorna o n º prazo.
Experimente online!
Como funciona
fonte
Haskell , 33 bytes
Experimente online!
Ørjan Johansen salvou 7 bytes usando um padrão irrefutável para forçar o prefixo.
fonte
n:
no início da expressão, você não precisa saber o quex
está lá para produzir o primeiron
. Mas você precisa que o padrão seja preguiçoso para evitar que a função o verifique antes de chegar aon:
.Gol> <> ,
87 bytesExperimente online!
Explicação
Esta é uma porta da minha resposta Wumpus . Gol> <> é basicamente o idioma que possui todos os recursos necessários para portar a resposta Wumpus (especificamente, zeros implícitos na parte inferior da pilha, "duplicado" implementado "pop, push, push" e um comando de rotação da pilha), mas :
00.
para voltar ao início.K
, que é "pop N, em seguida, duplica o próximo elemento N vezes", que pode substituir?=
, salvando outro byte.Assim, o mapeamento de Wumpus para Gol> <> se torna:
fonte
Linguagem de programação de Shakespeare ,
594 583572 bytesObrigado a Ed Wynn por -10 bytes!
Experimente online!
Esta é uma versão em golfe da solução não destruída de Ed Wynn , começando pela solução de 828 bytes que ele vinculou nos comentários e ficando um pouco louca a partir daí.
Explicação:
fonte
> <> ,
1312 bytesExperimente online!
Um porto da resposta de Martin Ender Wumpus . Infelizmente,
><>
não possui um comando incremental ou invertido, nem 0s implícitos na parte inferior da pilha; portanto, isso acaba sendo um pouco mais longo.fonte
JavaScript,
67666058525150 bytesBem, isso fez meu cérebro coçar mais do que deveria! Retrocede o
n
termo th, indexado a 0.5 + 1 bytes salvos graças a tsh arranhando meu cérebro com coceira!
Teste-o
O snippet abaixo produzirá os 50 primeiros termos.
Mostrar snippet de código
Explicação
Essa é uma daquelas raras ocasiões em que podemos declarar algumas variáveis fora do escopo de nossa função, modificá-las dentro da função e ainda poder reutilizá-las em chamadas subseqüentes da função.
fonte
n=>(g=s=>s[n]||g(s+(++x%2+1)*(10*s[x]-9)))('122',x=1)
s='122',x=1,g=n=>s[n]||g(n,s+=(++x%2+1)*(10*s[x]-9))
considerado um envio válido?s[n]||
foi um caso claro de não ver a madeira das árvores! Sua segunda sugestão não seria válida, porém, pois a função poderia ser chamada apenas uma vez;s
ex
precisa ser inicializado a cada chamada.s
ex
não tocado por outros códigos entre cada invoca (que é por padrão).s[x]+0-9
é um truque bem arrumadoPython (2 e 3),
6560 bytesRetorna o n º de entrada, 0-indexados.
Alternativa (65 bytes):
fonte
[1,2,2]
como valor inicial o #sum
Haskell , 48 bytes
-1 byte graças a nimi. -2 bytes graças a Lynn.
Experimente online!
Repita cada elemento sua posição mod 2 + 1 vezes.
fonte
c=1:2:c
brainfuck , 61 bytes
Experimente online!
Imprime números como códigos de caracteres indefinidamente. Para maior clareza, aqui está uma versão que imprime em números (exceto os dois primeiros elementos, que são fáceis de verificar).
Como funciona:
fonte
05AB1E ,
129 bytesEconomizou 3 bytes graças ao Grimy
Imprime os primeiros n itens.
Experimente online!
Explicação
fonte
2L[2LÞsÅΓ
.∞[2LÞsÅΓ
.Δ2LÞsÅΓI∍
para uma versão que imprime os primeiros n itens, com a entrada n.05AB1E , 15 bytes
Experimente online! ou com um limite de iteração
Explicação
fonte
¸«
,=
os imprimiria por 2 bytes salvos.ƵLS[NÌ©èF®É>=
, não há necessidade de enganar se você não está consumindo.Python 3 ,
5554 bytesExperimente online!
fonte
J , 12 bytes
Função de argumento único, tomando n e produzindo os primeiros n termos. Experimente online!
Apenas enfeitando minha resposta antiga para a pergunta antiga.
I.
é um verbo que pega uma matriz de números e cospe uma lista de índices, de modo que se o k -ésimo item da matriz for n , o índice k aparecerá n vezes. Vamos usá-lo para inicializar a sequência Kolakowski a partir de uma semente inicial. Cada etapa será da seguinte maneira:Se executarmos esta operação (
1+2|I.
) repetidamente a partir de 10, será algo como isto:Observe como obtemos termos cada vez mais corretos a cada vez e, após algum tempo, os primeiros n termos são corrigidos. O número de iterações necessárias para se estabelecer é difícil de descrever com precisão, mas parece ser logarítmico em n , portanto, se a executarmos n vezes (
^:]
), tudo ficará bem. (Confira essas outras sequências OEIS para obter mais informações: comprimentos de geração , somas parciais .)Uma vez feito isso, tudo o que precisamos fazer é usar os primeiros n termos
$
. A construção$v
de qualquer verbov
é um exemplo de gancho, e fornecê-lon
como argumento executarán $ (v n)
.Aqui é a velha versão de 13-byte que é muito menos desperdício de tempo e espaço:
($1+2|I.)^:_~
. Ele trunca a entrada a cada etapa, para que possamos executar exatamente quantas vezes forem necessárias para resolver, em vez de linearmente várias vezes.fonte
I.
. Eu sempre quis ver o recurso de cópia usado em algum golfe.Fueue , 30 bytes
Fueue é um esolang baseado em fila, no qual o programa em execução e seus dados estão ambos na mesma fila, a execução percorre a fila em ciclos e a programação requer muita sincronização para impedir que qualquer coisa seja executada no momento errado.
Experimente online!
O exemplo acima imprime uma lista interminável de dígitos como códigos de controle. Para 34 bytes, ele pode imprimir dígitos reais:
Experimente online!
O restante da explicação usa a última versão.
Resumo dos elementos Fueue
A fila do Fueue pode conter o seguinte tipo de elementos:
)
função os desbloqueie e~
(trocar dois elementos a seguir),:
(duplicar o próximo elemento) e)
(desbloquear o bloco a seguir).Visão geral de alto nível
Durante o loop principal do programa, a fila consiste em:
[49]
e[50:]
, respectivamente.Rastreio de baixo nível dos 10 primeiros comandos
Passo a passo de uma iteração de loop principal completa
Espaço em branco opcional foi inserido para separar comandos.
Ciclo 1:
49
imprime1
.)
está inativo, esperando para ser reunido com o bloco de loop principal.50
impressões2
.:
duplica o bloco de loop principal (que precisa de uma cópia para auto-replicação).Ciclo 2:
)
desbloqueia o primeiro bloco de loop principal, iniciando a execução do próximo ciclo.Ciclo 3:
[50:]
representa o primeiro dígito produzido na cadeia, um2
ainda não desbloqueado. O seguinte)
acabará por fazê-lo após o restante do loop principal.~)~:~
é um atraso de um ciclo de golfe (usando uma troca e uma cópia) de~)~~
.[[49]:~))~:~~]
está inativo.~
troca o seguinte bloco de loop principal além do[50:]
bloco de dígitos.Ciclo 4:
)
ainda aguarda,~)~
produz~)
,~
troca[[49]:~))~:~~]
o[50:]
bloco de dígitos.Ciclo 5:
~
swaps)
passado, o[50:]
bloco de dígitos.Ciclo 6: o primeiro
)
agora desbloqueia o[50:]
bloco de dígitos, o próximo)
desbloqueia o subprograma[[49]:~))~:~~]
.Ciclo 7:
50
imprime2
,:
duplica o[49]
bloco de dígitos acabado de produzir , criando uma execução de dois1
s.:~))~:~
é um atraso de um ciclo de~~))~:
.~
troca o bloco de loop principal restante pelo primeiro[49]
.Ciclo 8:
~~))
é um atraso de um ciclo de)~)
.~
swaps:
além dos atualmente atravessados[49]
.Ciclo 9:
~
troca de)
passado[49]
.:
duplica o bloco principal do loop.Ciclo 10: o primeiro
)
desbloqueia o[49]
bloco de dígitos que acabou de atravessar, o segundo)
reinicia o loop principal para percorrer o próximo (acima, mostrado no início da fila).fonte
x86,
4137353328 bytesEu me diverti muito brincando com instruções x86 diferentes, pois esta é minha primeira resposta x86 "não trivial". Na verdade, eu aprendi o x86-64 primeiro e salvei muitos bytes apenas convertendo meu programa em 32 bits.
Acontece que o algoritmo que usei do OEIS envia valores para uma matriz, o que o torna passível de x86 e o armazenamento de valores na pilha (observe que o MIPS não possui instruções de pilha).
Atualmente, o programa recebe
N
valores como entradaecx
e retorna um endereço emebp
uma matriz com o enésimo elemento que representa o enésimo valor na sequência. Presumo que retornar na pilha e calcular valores extras sejam válidos (consideramos o que está além da matriz como lixo de qualquer maneira).Changelog
-4 bytes calculando
x = 2 - n%2
comxor
cada iteração-2 bytes usando do-while em vez de while loop.
-2 bytes pressionando os valores iniciais 1, 2, 2 usando
eax
-5 bytes não armazenando
n
explicitamente e executandoN
tempos de loopObjdump:
fonte
C (gcc) ,
7271656462 bytes-9 bytes graças a @ceilingcat
Experimente online!
Gera valores da sequência indefinidamente (opção 3 do desafio)
fonte
for($x=$y=-1;;$y=$y+1|$f&.5*$x^=$f=$y&-$y-2)echo$x&1?:2;
. 2)50-x%2
deve salvar um byte para você. 3) Tentei fazê-lo funcionarx=y=1
; mas não consegui acertar as operações até agora. Você pode?Perl 5 , 36 bytes
Ainda uma modificação trivial da solução clássica de TPR (0,3):
Emite a série de
0
paran
Experimente online!
fonte
Javascript ES6 -
717068 bytes1 bit economizado graças a Neil
Tanques para Shaggy por corrigir meu erro, também por economizar 1 bit.
fonte
x=0
vez dex=1
), mas o @Shaggy está certo: isso não funciona em sua forma atual (adicionei o,i=100;i-->0
temporariamente para ver apenas os 100 primeiros itens, em vez de precisar aguarde 60 segundos antes de ver uma saída). Mas não faço ideia por que não funciona. JS não é minha coisa.1.
iniciarx
a 0 em vez de 1 (como @KevinCruijssen mencionado) e2.
verificar se ox
caráter th na seqüência, o que só pode ser sempre 1 ou 2, é maior do que 49.(_[x]*10-9)
então(_[x]>1?11:1)
Appleseed , 89 bytes
Define uma função
K
que não aceita argumentos e retorna a sequência Kolakoski como uma lista infinita. Experimente online!Essa abordagem foi inspirada na resposta de Haskell, totalmente humana . Minha abordagem original foi mais longa e provavelmente foi O (2 ^ n). : ^ P
Ungolfed
A lista de retorno começa com
(1 2)
. Depois disso, para gerar o restante (leitura de dentro para fora):(kolakoski)
para obter a lista de sequências de Kolakoski (devido a uma avaliação lenta, não importa que a lista ainda não tenha sido totalmente gerada)(cycle (list 1 2))
cria uma lista infinita(1 2 1 2 1 2 ...)
repeat-val
. Isso repetirá a1
ou2
dacycle
lista uma ou duas vezes, dependendo do valor associado na lista Kolakoski. Resultado:((1) (2 2) (1 1) ...)
flatten
essa lista em(1 2 2 1 1 ...)
(concat (list 1 2)
, portanto,drop
os dois primeiros da lista gerada para evitar duplicação.fonte
Stax , 12 bytes
Execute e depure
Esta é a representação ascii do mesmo programa.
Ele expande a sequência x vezes em que x é a entrada. Em seguida, ele gera o x º elemento, indexado em 0.
Aqui está uma solução bônus de 12 bytes que produz saída como um fluxo infinito. Pressione Executar para iniciar.
fonte
R, 63 bytes ou 61 bytes
Implementação 1: imprime o n th termo da sequência.
Implementação 2: imprime os primeiros n termos da sequência.
(A diferença está apenas na última linha.)
Sim, sim, você pode reclamar que minha solução é ineficiente, que calcula realmente mais termos do que o necessário, mas ainda assim ...
Atualização: Obrigado a @ Giuseppe por cortar 9 bytes.
fonte
a=c(a,rep(2-n%%2,a[n]))
vez do segundofor
loop para remover alguns bytes.Linguagem de programação de Shakespeare, 575 bytes (mas com defeito) ou 653 ou 623 bytes
Na categoria SPL muito disputada, isso superaria a entrada atual de Jo King (583 bytes), exceto por estar com defeito: primeiro, não é executado na versão TIO (implementando o site do SPL) - mas é executado no Perl versão , então talvez esse não seja um defeito sério. Segundo, porém, ele não imprime os dois primeiros dígitos. Se permitíssemos esse defeito na solução de Jo King, essa solução defeituosa seria de 553 bytes, superando minha solução defeituosa.
Minha solução falha no TIO por dois motivos: tentamos confiar em uma pilha vazia retornando zero quando exibida; e nós vamos para a primeira cena, com "[Enter Ford and Puck]", mesmo que ninguém tenha saído do palco. Estes são meramente avisos na versão Perl. Se eu corrigir esses erros e colocar os dois primeiros dígitos, chegarei a 653 bytes:
Experimente online!
Eu posso gerar a sequência completa na implementação Perl usando 623 bytes:
No entanto, gostaria de salientar que esta solução é rápida em comparação com muitas outras soluções e usa quantidades logarítmicas de memória em vez de armazenar a lista inteira. (Isso é semelhante à solução C do vazt, à qual está distante.) Isso não faz diferença para o golfe, mas ainda assim estou satisfeito. Você pode gerar um milhão de dígitos em cerca de um minuto em Perl (por exemplo, se você canaliza para sed e wc para obter uma contagem de dígitos), onde a outra solução pode fornecer alguns milhares de dígitos.
Explicação
Armazenamos uma sequência de variáveis em ordem: pilha de Puck (de baixo para cima), valor de Puck, valor de Ford, pilha de Ford (de cima para baixo). Além dos valores zero nas extremidades (com o zero à esquerda talvez de uma pilha vazia), cada valor é o dígito gerado a seguir nessa geração, com 2 adicionados se a próxima geração precisar ter outro filho desse pai. Quando temos N valores diferentes de zero na sequência, geramos todos os filhos até a N-ésima geração, inclusive em uma espécie de travessia de árvore em profundidade. Nós imprimimos valores somente da N-ésima geração. Quando a N-ésima geração é completamente gerada, os valores armazenados são, de fato, os valores iniciais das gerações 2 a (N + 1), portanto, adicionamos um 2 à esquerda e começamos novamente, desta vez gerando o (N + 1 ) -a geração.
Então, um esboço: Cena X: Quando chegamos aqui, este é o começo de uma nova travessia. Puck == 0. Opcionalmente, pressionamos esse zero na pilha de Puck e definimos Puck = 2. Cena L: Se Ford == 0, chegamos à geração de impressão. Caso contrário, vá para V. Para imprimir, se o valor em Puck tiver 2 adicionados, remova o 2 e imprima-o duas vezes; caso contrário, imprima-o uma vez. Cena M: Este é um loop em que alternamos repetidamente o valor de Puck e voltamos à sequência. Repetimos até chegarmos ao final (Puck == 0), nesse caso, ir para X, ou atingirmos um valor que precisa de outro filho (Puck> 2); nesse caso, subtrair os 2 extras e avançar na V. Cena V: Aqui vamos em frente. Se Puck for 2 ou 4, a próxima geração conterá dois filhos do pai atual, então Ford + = 2. Avance pela sequência. Vá para L para verificar o término.
fonte
axo , 13 bytes
Experimente online!
Explicação
Isso começou como uma porta de uma solução alternativa na minha resposta do Wumpus :
Isso resultou em 18 bytes. Acabei jogando os 13 bytes que você vê acima para ajustá-lo mais à maneira como o axo funciona. Essa versão de 13 bytes acabou inspirando a melhoria de até 11 bytes no Wumpus, e agora está mais próxima dessa versão.
Como no Wumpus, na iteração i , a parte inferior da pilha contém a (i) -1 e a parte superior contém o primeiro elemento da i- ésima execução, mas estamos trabalhando com 0 e 1 , exceto a impressão.
fonte
Ruby ,
4539 bytesimprime indefinidamente
Experimente online!
Experimente com uma função de impressão sobrecarregada que permite escolher um separador e o número de elementos impressos
fonte