Introdução
A sequência de Gijswijt ( A090822 ) é famosa, MUITO REALMENTE lenta. Ilustrar:
- Os três primeiros aparecem no nono termo (certo).
- Os quatro primeiros aparecem no 220º termo (muito longe, mas viável).
- Os 5 primeiros aparecem (aproximadamente) no 10º (10 ^ 23) termo (apenas não).
- Ninguém sabe mesmo onde estão os 6 primeiros ... suspeita-se que esteja no ...
2 ^ (2 ^ (3 ^ (4 ^ 5))) th termo.
Você pode assumir que não precisará lidar com um número de dois dígitos.
A sequência é gerada da seguinte maneira:
- O primeiro termo é 1.
- Cada termo depois disso é a quantidade de "blocos" repetidos anteriores a ele (se houver vários "blocos" repetidos, a maior quantidade de blocos repetidos será usada).
Para esclarecer, aqui estão os primeiros termos.
1 -> 1, 1
(um bloco de repetição ( 1
), portanto, o dígito gravado é 1
)
1, 1 -> 1, 1, 2
(dois blocos repetidos ( 1
), então o dígito registrado é 2
)
1, 1, 2 -> 1, 1, 2, 1
(um bloco de repetição ( 2
ou 1, 1, 2
), portanto, o dígito gravado é 1
)
1, 1, 2, 1 -> 1, 1, 2, 1, 1
(Você entendeu a ideia)
1, 1, 2, 1, 1 -> 1, 1, 2, 1, 1, 2
1, 1, 2, 1, 1, 2 -> 1, 1, 2, 1, 1, 2, 2
(dois blocos repetidos ( 1, 1, 2
), então o dígito registrado é 2
)
Tarefa
Sua tarefa é, como indicado na pergunta, gerar n dígitos da sequência Gijswijt.
Instruções
- A entrada será um número inteiro
n
. - Seu código pode gerar os dígitos de qualquer forma (uma lista, várias saídas etc.).
Este é o código golf, pelo que o código mais curto em bytes vence.
._
função e outras funções úteis no Pyth.CJam,
33313027 bytesAgradecemos a Peter Taylor por economizar 1 byte.
Teste aqui.
Explicação
fonte
CJam (
30 29 2724 bytes)Demonstração online
Este é um esforço conjunto com Martin.
e`
) para identificar repetições é oW$
para simplificar o gerenciamento de pilha$W>+
revestimento especial, conforme explicado na dissecção abaixoMinha primeira abordagem de 30 bytes:
Demonstração online
Dissecação
fonte
Haskell, 97 bytes
A terceira linha define uma função anônima que pega um número inteiro e retorna uma lista de números inteiros. Veja em ação.
Explicação
A função auxiliar
f
constrói a sequência ao contrário, verificando recursivamente se a sequência anterior começa com um bloco repetido.k
é o número de repetições ep
o comprimento do bloco.fonte
Pitão,
4138 bytesExperimente online!
fonte
Retina ,
6660 bytesA entrada é um número inteiro unário usando
!
como dígito (embora isso possa ser alterado para qualquer outro caractere não numérico). A saída é simplesmente uma sequência de dígitos.Experimente online! (Como alternativa, por conveniência, aqui está uma versão que aceita entrada decimal. )
Para fins de teste, esta pode ser acelerado um lote com uma pequena modificação, o que permite testar de entrada 220 em menos de um minuto:
Experimente online! ( Versão decimal. )
Se você quiser testar números ainda maiores, é melhor fornecer uma entrada massiva e colocar um
:
após a inicial+
. Isso fará com que o Retina imprima a sequência atual sempre que terminar de calcular um novo dígito (com todos os dígitos desativados um por um).Explicação
A solução consiste em uma única substituição de regex, que é aplicada à entrada repetidamente até que o resultado pare de mudar, o que nesse caso acontece porque o regex não corresponde mais. O
+
no início apresenta esse loop. O1
é um limite que diz Retina só para substituir o primeiro jogo (isto só é relevante para a primeira iteração). Em cada iteração, o estágio substitui um!
(da esquerda) pelo próximo dígito da sequência.Como de costume, se você precisar de uma cartilha sobre grupos de balanceamento, remeto para a minha resposta SO .
Aqui está uma versão anotada do regex. Observe que o objetivo é capturar o número máximo de blocos repetidos no grupo
1
.Finalmente, depois que tudo estiver pronto, escrevemos de volta
$1
(excluindo a!
) e também o número de capturas no grupo com o$#1
qual corresponde ao número máximo de repetições.fonte
Ruby, 84 bytes
A resposta Retina me inspirou a fazer uma solução baseada em regex para encontrar a melhor sequência, em vez de contar de alguma maneira as seqüências em uma matriz, mas com menos genialidade (olhares negativos com quantificadores não parecem permitidos no Ruby, por isso duvido Eu poderia portar diretamente a resposta da Retina de qualquer maneira)
Dada uma sequência já gerada
s
, ele mapeia tudoi
de1
atés.length
(n
foi usado neste caso para salvar bytes desde entãon>=s.length
) e, em seguida, usa esse regex para ajudar a calcular o número de repetições de uma subsequência com comprimentoi
:Se for encontrada uma correspondência dessa duração, ele calculará o número de repetições dividindo a duração da correspondência fornecida
$&
pori
, a duração da subsequência; se nenhuma correspondência foi encontrada, ela será tratada como1
. A função encontra o número máximo de repetições desse mapeamento e adiciona esse número ao final da sequência.fonte