Seu trabalho é criar o período de iteração de período mais longo , em que o comprimento de cada programa na sequência é limitado por 500 bytes.
Ou seja, se você repetir as seguintes etapas:
- Comece com seu programa inicial
- Execute o programa atual
- Volte ao passo 2
Você retornará ao seu programa original. O número de programas no ciclo é sua pontuação, que você está tentando maximizar.
Nenhum dos programas pode gerar erros. Cada programa também deve ser executado da mesma maneira (por exemplo, versões, implementações, opções de compilador, plataformas, etc ...) diferentes (EDIT: Sim, qualquer estado externo, como o de um gerador de números pseudo-aleatórios, foi incluído no último O estado externo deve ser "redefinido" após cada execução. Se você usar números aleatórios verdadeiros, o pior caso será assumido.)
O que separa esse desafio do período de iteração de período mais longo (que não seja 100 vs 500) é que todo programa no ciclo também deve ter 500 bytes ou menos. Isso significa que o ciclo mais longo possível é (256 ^ 501 - 1) / 255 ou menos. É claro que é um número grande, mas não tão grande em termos de quanto código é necessário para calcular. Portanto, o desafio é usar o maior número possível de possibilidades (256 ^ 501 - 1) / 255, não um desafio de castor ocupado.
Os programas não têm permissão para acessar seu próprio código-fonte. No entanto, um programa vazio é permitido se você desejar (desde que siga as outras regras).
Como a verificação manual dos programas seria difícil, você pode descobrir a pontuação usando métodos teóricos. Você deve incluir uma explicação da pontuação e correção no seu programa. Se você não conseguir descobrir a pontuação, use um limite inferior do número de programas no ciclo como uma pontuação defacto. Você pode atualizar isso à medida que encontrar melhores limites inferiores ou se encontrar a pontuação exata.
Este é um desafio de código , então a pontuação mais alta vence!
EDIT: Recomenda-se que você escreva qual é a sua pontuação em notação científica, para que as respostas sejam mais facilmente comparáveis. É perfeitamente bom ter outras formas de pontuação também, especialmente se elas estiverem mais claramente conectadas ao seu programa. Além disso, os leitores são incentivados a editar respostas anteriores para cumprir isso.
fonte
Respostas:
Perl 6 ,126398≈ 8.86 × 10835 iterações
Experimente online!
Isso itera através de todas as combinações possíveis dos primeiros 126 bytes de comprimento 398 e menos (excluindo cadeias com bytes NUL iniciais). Se quiser ver que ele realmente retorna à primeira iteração, você pode reduzir o comprimento para 1 alterando o limite dessa forma .
Explicação:
Cada iteração incrementa a string, armazenada no formato base 126 e, em seguida, a converte de volta na base 126. Isso é feito até atingir uma string com o comprimento 399 e, em seguida, redefine a string novamente para esvaziar. Se você está tendo problemas para conceber o número, imagine-o com dez bytes. A partir de104 - 1 iterações (incluindo
0
, incremente até 4 dígitos1000
e redefina. Este é0
ou string vazia no caso do meu programa).fonte
Encantos
Rúnicos,64654106; 122 387 -1 ≈ 2.638 × 10 807 iteraçõesExperimente online!
Alerta: O
€
é exibido incorretamente, deve ser `` (0x80).Em vez da pilha, use uma sequência e os operadores da pilha modificados com
͍
para modificar uma sequência em vez da pilha (consulte a revisão anterior). Como tal, cada caractere é limitado a 1 byte (intervalo de 0 a 127, menos os caracteres problemáticos), mas com mais de 3 vezes o número deles (devido a haver menos clichê de processamento devido à falta de ignorar caracteres combinados Unicode, como bem como outras economias de bytes), ele alcança um número maior de iterações.Se a codificação como um verdadeiro big endian for permitida (ou seja, ter valores de bytes acima de 127 sem interpor
0x00
bytes), isso poderá atingir 251 387 -1 ≈ 4,717 × 10 928 iterações. No entanto, a codificação latina do TIO impede isso, conforme observado por Erik, o Outgolfer, em sua resposta em Python 2. Eu precisaria verificar se funciona localmente antes de reivindicar essa pontuação.Deve ser capaz de substituir
f1+0B
com'0B
(há um unprinting0x16
lá), mas foi-me (coisas não queria filial / saltar / retorno corretamente) lutando, então eu deixei ele sozinho. Isso aumentaria a estrutura de big endian de 387 para 388.fonte
DOS COM, 49 bytes, período 2 ^ 3608
Montagem original a ser criada:
Essa pequena joia grava a próxima fase no q.com, em vez da saída padrão, devido a nulos e outras coisas que o terminal não pode lidar. A técnica de root quine é equivalente à stringification e a sala de carga útil é usada como um contador de 3608 bits. Devido à maneira como o DOS funciona, o estado inicial do contador contém detritos do que estava na memória antes de sua primeira execução.
A entrada original de 49 bytes é inacessível; portanto, se você quiser pontuar isso como 500 bytes, vá em frente.
fonte
C # (Compilador interativo do Visual C #) , sinalizadores:
/u:System.Numerics.BigInteger
e/r:System.Numerics
Pontuação: 10 332
Graças ao JoKing, que aumentou minha pontuação de 10 255 * 2 - 1 para agora!
Experimente online!
Explicação
Incrementa um BigInteger a cada iteração, até que o comprimento se torne muito grande, e nesse caso, instantaneamente voltamos ao quine original.
fonte
Observe que há uma nova linha à direita. Pode ser removido acima se o marcador de sintaxe forçar a entrada.
Infelizmente, você não pode executar este programa no TIO, pois está codificado no Latin-1.
Acima,
s
contém 219 0x01 bytes. Após a execução do programa, sua fonte é impressa, exceto por uma diferença:s
foi incrementada como um número big endian da base 252, portanto, seu caractere mais à esquerda foi "incrementado" para 0x02. Os bytes 0x00, 0x22, 0x25 e 0x5C são evitados; portanto, se algum caractere da sequência se tornar um desses após a incrementação, o próprio caractere será incrementado novamente."
): existe o risco de três bytes 0x22 se formarem em uma linha, ou seja"""
, ou o último caractere da cadeia se tornar"
, para que a cadeia seja fechada prematuramente.%
): a formatação de string do tipo printf é usada antes da conclusão do esqueleto quine, portanto, um%
não adjacente a outro%
ins
causará problemas. Infelizmente, não é possível reordenar a formatação para evitar essa ressalva.\
): existe a possibilidade de que ele\
seja usado como uma marca de escape na string, em vez de literalmente, por isso é evitado.Portanto, 252 de 256 bytes são utilizáveis. Se
s
contiver 219 0xFF (ÿ
) bytes, é simplesmente revertido para 219 0x01 bytes, concluindo assim o ciclo.fonte
251 39dependência removida deText
251 122função incrementadora de golfe251 128cadeias combinadas de origem de prefixo e sufixo251 188dependência removida deGast.GenLibTest
Apresentado no formato xxd devido a UTF-8 não imprimível / inválido:
Experimente online!
Incrementa uma cadeia de 226-byte através de todos os valores de byte excluindo
\0
,\n
,\r
,'
e\
.A razão pela qual evitamos esses caracteres é:
\0
irrita o compilador\n
e\r
não pode aparecer nas listas'
terminaria a lista\
pode causar problemas se vier antes de um caractere escapávelUma vez que a string é all
\377
s, ela se agrupa em todos os\001
s, fornecendo o programa original.fonte
C2 80
. É o mesmo que o comportamento na sua máquina local?Gol> <> , 70 bytes, 39039000 iterações
Uau, isso é muito menor do que eu pensava que seria ... Próximo passo! Fazendo com que tenha mais iterações !!!
Experimente online!
fonte