Vamos direto ao assunto. Seu desafio é criar um programa que faça essas coisas, dependendo de sua entrada:
Se a entrada for um número, imprima "Prime" se o número for um número primo e "Not prime" se o número não for um número primo. Você pode assumir que o número é> 1.
Se a entrada for dois números, imprima todos os números primos entre o primeiro número (inclusive) e o segundo número (exclusivo). Você pode assumir que o primeiro número é menor que o segundo.
Aí vem o verdadeiro desafio: se não houver entrada, o programa deve produzir uma versão mais curta de si mesma que faz exatamente as mesmas coisas que o programa original. O programa não tem permissão para ler de nenhum arquivo ou da web. O novo programa também deve ser capaz de fazer isso. Deve funcionar por pelo menos 5 gerações. O novo programa não precisa estar no mesmo idioma que o primeiro.
Pontuação:
Sua pontuação é igual à soma do número de bytes nas cinco primeiras gerações de seu envio (o envio em si é a geração um). Se o novo código estiver codificado no primeiro programa, multiplique a pontuação por 1,5. Menor pontuação ganha. (Se você encontrar algum tipo de falha no sistema de pontuação, informe-me nos comentários)
Respostas:
CJam, 66 + 65 + 64 + 63 + 62 = 320
325355bytesAs 5 linhas a seguir são as primeiras 5 gerações:
O último produz
que ainda executa as tarefas principais corretamente.
Teste aqui.
Explicação
A solução CJam básica é
que pode ser estendido com muita facilidade a uma solução generalizada. Para uma explicação disso, veja minha resposta aqui .
As idéias básicas para esta resposta são:
Aqui está um detalhamento do código dentro do quine:
fonte
C, Pontuação: 553 + 552 + 551 + 550 + 549 = 2755,
Comprimento original: 553, Avg: 551
EDIT: Apenas 5 gerações, não 6!
Parece que Martin me venceu no tempo e no placar (quase em uma ordem de magnitude!). Ah bem.
O programa original é o seguinte:
Vou desvendá-lo um pouco para melhor compreensão, mas para que funcione corretamente, as novas linhas NÃO fazem parte do programa.
A única coisa que muda de programa para programa é o valor de
k
, que perde exatamente um dígito a cada iteração. Curiosamente, após a 5ª geração, k se torna zero e permanece lá, para que você possa iterar ad infinitum e sempre ter saída válida.fonte
Tcl 253 + 252 + 251 + 250 + 249 = 1255 bytes
O código precisa terminar com uma nova linha. Explicação:
Escreva o código em x e execute-o.
Execute o comando cujo nome é o comprimento do argumento, passando os argumentos adiante.
Retorna 1 quando a é primo, 0 mais. Usa recursão; a segunda barra invertida impede a substituição de comandos do intérprete e ativa o de
expr
(que é preguiçoso).Implementação direta dos requisitos.
Esta é a solução, removendo um espaço desde o início de cada vez.
fonte