Como sabemos, um quine é um programa que gera seu próprio código-fonte. No entanto, também é possível escrever um programa que produza outro programa diferente, que produz o primeiro programa novamente. Por exemplo, o programa Python 2
x = '''x = {}
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3'''
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3
, quando executado, produzirá o seguinte texto:
print """x = '''x = {}
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3'''
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3"""
Quando executado como um programa Python, isso produzirá o código original novamente. Isso é chamado de quine iterativo . Como você precisa executá-lo duas vezes para recuperar o código original, dizemos que ele tem o período 2 . Mas é claro, períodos muito mais altos são possíveis.
Seu desafio é escrever um quine iterativo pelo maior período possível, em 100 bytes ou menos , no idioma de sua escolha. (Observe que meu exemplo acima não se encaixa nessa especificação, pois possui 119 bytes, incluindo a nova linha à direita.)
Observe as seguintes regras e esclarecimentos:
- As regras usuais de quine se aplicam, ou seja, seu programa não pode usar recursos de linguagem que permitiriam acessar diretamente seu próprio código-fonte.
- As saídas iteradas precisam eventualmente retornar ao código original e você deve incluir uma demonstração ou prova de que isso ocorrerá.
- Você também deve incluir uma explicação de por que o ciclo é tão longo quanto você diz. Isso não precisa estar no nível de uma prova matemática, mas deve ser convincente para alguém familiarizado com o seu idioma. (Esta regra está aqui porque espero que algumas respostas envolvam números muito, muito grandes.)
- Não há problema em dizer algo como "pelo menos 1.000.000 de iterações" em vez de fornecer o número exato, desde que você possa provar que é pelo menos esse tempo. Nesse caso, sua pontuação seria 1.000.000. Caso contrário, sua pontuação é o período da sua avaliação.
- O limite de 100 bytes se aplica apenas ao seu programa inicial - os programas que ele produz podem ser mais longos, embora, é claro, eles precisem voltar a 100 bytes para gerar o código original.
- Você pode assumir que sua máquina possui RAM e tempo de execução infinitos, mas não pode assumir tipos de dados de precisão ilimitados (como números inteiros) se o seu idioma não os possuir. Você pode assumir que não há limite para o tamanho da entrada que seu analisador pode manipular.
- A pontuação mais alta vence.
Observe: existe um desafio existente chamado Quit Whining; Comece o Quining que também envolve a iteração de quines. No entanto, além de basear-se no mesmo conceito, esses são tipos de desafios completamente diferentes. O outro é código de golfe direto, enquanto este é (intencionalmente!) Realmente um problema de castor ocupado disfarçado. As técnicas necessárias para produzir uma boa resposta a essa pergunta provavelmente serão muito diferentes daquilo que é necessário para responder à outra pergunta, e isso é basicamente por design.
fonte
Respostas:
PHP, período 2.100.000.000
Quem pensaria que isso é possível em PHP ?! :-)
Este é realmente o meu primeiro quine e tem 99 bytes de comprimento:
Embora o PHP suporte números maiores do que
2 * 10^8
mudarinteger
paradouble
, o incremento não funciona mais (leva a um loop infinito) e eu não encontrei outra solução que se encaixe nos 100 bytes. Ainda.A prova é bastante simples, pois conta apenas com cada iteração até atingir o ponto de redefinição em 2,1 bilhões.
Créditos a dave , que postou a abordagem em pseudo-código nos comentários e a Bob Twells , de quem copiei o código para obter uma quantidade mínima de PHP.
Programa de teste (sloooooow):
Bem, pelo menos eu sou o primeiro a responder.
fonte
Mathematica, período
E8.5678 # 3E2.1923 # 4~ E6.2695 # 3 # 2Observe que as pontuações são descritas na notação Hyper-E . As iterações substituem o final
Nest[#!,9,9^9^99!]
pelas expansões decimais deNest[#!,9,9^9^99!]
- 1,Nest[#!,9,9^9^99!]
- 2,Nest[#!,9,9^9^99!]
- 3, ..., 3, 2, 1 e de volta aNest[#!,9,9^9^99!]
.fonte
ToString[#0, InputForm]
{"_~"}_~
, então eu acho que ele deve ser válido ...R, período aleatório com expectativa 2 ^ 19936-0.5
O gerador de números aleatórios padrão de R possui um período de 2 ^ 19937-1 e equidistribuição em 623 dimensões consecutivas. Assim, em algum lugar (mas apenas uma vez) em seu período haverá um vetor de zeros com 623 longos. Quando chegamos lá (e estamos alinhados com o início da sequência), a soma dos próximos 623 números U aleatórios [0,1] será zero e retornamos ao nosso programa original.
Observe que o programa passará com o mesmo estado diferente de zero várias vezes antes de retornar a zero. Por exemplo, a soma 311,5 é a mais provável, e existem muitas maneiras de isso acontecer, mas o RNG permite que o período 0 seja mais longo que o período 311,5.
fonte
JavaScript, período 9.007.199.254.700.000
Não vou ganhar, mas foi divertido trabalhar com JavaScript neste desafio:
Segue o seguinte ciclo:
Nota: Você pode torná-lo 18 bytes mais curto, enquanto remove apenas apenas 0,08% da pontuação, assim:
fonte
C, período 2.100.000.000
Baseado na resposta do PHP (obviamente). Será atualizado com explicação quando tiver tempo.
fonte
C (gcc) , 66 bytes, período 2 ^ 64
Experimente online!
2 ^ 64 números estão disponíveis em um
unsigned long
número inteiro. Portanto, um período de 2 ^ 64.fonte
Python 2
Experimente online!
No código, as
b=0
alterações parab=1
entãob=2
e assim por diante até chegarb=decimal expansion of the period
e redefinir parab=0
fonte
9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9
é muito maior que9**9**99**99**99**99**99**99**99**99**99**99**99**99
. Dito isto, você poderia fazer algo parecidoeval('9**9'*eval('9**9'*eval('9**9'*9**9**9**9**9)))
com números MUITO mais altos.Gol> <> , 70 bytes, período 325883196621297064957600206175719056476804879488288708188003274919860959534770101079512433396348062803055739640225395758790852315876868469390603793729639715908136196505908165227136154287969475839017544811926036808089596209081885772040898530121921794489026069641113281250
Outro sábio conhecido como realmente grande (3.25E270)
Esta é realmente a versão alterada da resposta que eu coloquei no iterador de 500 bytes
Espero que eu tenha acertado o placar e não haja bugs. Não há nenhuma maneira real para realmente calcular esse valor, é teórico. Mas cara, esse é um número enorme !!!
Experimente online!
fonte