Encontre o Buraco 1 aqui .
Faça uma solução que, quando executada, produz seu próprio bloco de código-fonte várias vezes. De fato, ele deve produzi-lo n vezes, onde n no próximo número primo.
Eu acho que um exemplo mostra melhor.
[MY QUINE][MY QUINE]
[MY QUINE][MY QUINE][MY QUINE]
[MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE]
[MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE]
[MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE]
Cada programa emitirá seu "bloco" base (então [MY QUINE]) nos próximos números primos .
Funções internas para calcular se um número é primo (como uma função isPrime) ou para determinar o próximo primo (como uma função nextPrime ()) não são permitidas.
- Isso significa que as funções para listar o número de divisores não são permitidas
- Funções que retornam a fatoração principal também não são permitidas
Isso deve ser um problema real (exceto por uma margem de manobra, veja o próximo ponto); portanto, você não deve ler seu próprio código-fonte.
Como linguagens como Java e C # já estão em desvantagem, você não precisa gerar um código totalmente funcional. Se puder ser colocado em uma função (chamada) e gerar a próxima pergunta, você estará bem.
Isso é código-golfe, então o código mais curto vence!
Respostas:
CJam, 31 bytes
Experimente on-line no intérprete CJam .
Idéia
Para verificar a primalidade, usaremos o teorema de Wilson , que afirma que um número inteiro n> 1 é primo se e somente se (n - 1)! -1 (mod n) , o que é verdadeiro se e somente se (n - 1)! + 1% n == 0 .
Código
fonte
mp
(is prime?) existe agora, portanto, na versão mais recente do CJam, pode-se reduzir um pouco mais isso.CJam,
3635 bytesDefinitivamente,isso pode ser ainda mais jogado.Como funciona:
Obrigado a Martin por me lembrar o
]W=
truque :)Experimente online aqui
fonte
Mathematica,
248222 bytesEdit: Corrigido o uso de uma função relacionada ao prime, mas também melhorava um pouco o quining.
Edit: Obrigado a Dennis por me apresentar o teorema de Wilson.
Isso pressupõe que o kernel é encerrado entre execuções subseqüentes do quine (ou pelo menos
n
é redefinido), porque depende den
ser indefinido antes da[MyQuine]
execução da primeira instância .Provavelmente isso pode ser muito reduzido, mas não tenho muita experiência com quines, especialmente no Mathematica.
Aqui está uma explicação:
Isso não faz nada, mas se concatenado no final do quine anterior, multiplica o resultado da última expressão por
1
(que é um no-op) e o ponto e vírgula suprime a saída. Isso garante que apenas a última cópia[MyQuine]
imprima alguma coisa.Este inicializa
n
a1
na primeira cópia[MyQuine]
e, em seguida, incrementa-o1
em cada cópia adicional - ou seja, este apenas a contagem de quantas cópias existem non
.Pule para o final agora:
Este encontra o próximo primo usando o teorema de Wilson .
Este é o quine real. Ele cria
NextPrime@n
cópias do próprio código. Também é um pouco estranho. Sim, estou multiplicando duas strings por lá, e nenhuma que não tenha um resultado significativo.QUINE_PREFIX
contém todo o código antes das duas cadeias eQUINE_SUFFIX
contém todo o código após as duas cadeias. Agora normalmente você usaApply
(ou@@
) para transformar uma lista em uma série de argumentos. Mas você pode substituir qualquerHead
comApply
- por exemplo multiplicação. Portanto, apesar de ser um produto, ainda posso transformá-lo em dois argumentos para minha função. Essa função faz:Onde
#
está o primeiro argumento (a sequência do prefixo),#2
é o segundo argumento (a sequência do sufixo),##
é uma sequência dos dois argumentos. Preciso anexar1
para preservar a multiplicação - caso contrário, isso##
seria exibido na lista de argumentos paraToString
. Enfim,ToString[1##,InputForm]&@@("abc"*"def")
retorna"abc"*"def"
... exatamente o que eu preciso!Eu acho que com todas as coisas que eu preciso em torno do quine, um
eval
quine baseado em um seria mais apropriado aqui. Vou analisar isso mais tarde ou amanhã.fonte
J - 60 caracteres
Usa o método next-prime como as outras respostas. (Essa é a parte
4 p:
.)Um truque bonitinho J é que
f :g
age comof
quando dado um argumento eg
quando dado dois. Portanto, se você escrever, digaf :;'a'f :;'a'f :;'a'
que é assimf'a';'a';'a'
, o que é ótimo, porque é uma lista em caixa cujos itens são'a'
e cujo tamanho é o número de ocorrências.Para que possamos elevar isso a um tipo de coisa refinada. A
f
aparência que usamos(foo $~ bar)
, ondefoo
constrói a parte da string que repetimos repetidamente,bar
encontra o próximo número primo e o multiplica por 60, o comprimento da string emfoo
.fonte
Python 2.7, 214
fonte