Desafio
Seu objetivo é escrever um programa que imprima outro programa. Esse programa impresso deve imprimir outro programa e o novo programa deve imprimir outro programa, até o final.
Regras
- Cada programa deve ter menos de 256 bytes. (Se isso precisar ser alterado, deixe um comentário)
- O último programa deve ser um programa vazio.
- Deve haver um número finito de programas, para que o programa não possa ser um problema.
- Todos os programas devem ser executados no mesmo idioma.
- Nenhuma entrada é permitida.
- O programa vencedor é o programa que imprime o maior número possível de programas, contando-se.
Boa sorte!
code-challenge
code-generation
A tartaruga
fonte
fonte
2^2048
, ou3.2317e616
.a*10^b
onde1<=a<10
eb
é um número natural.1.2673e614
.Respostas:
CJam, 4,56 × 10 526 programas
Escore exato: 254 219 + 254 192 + 254 166 + 254 140 + 254 114 + 254 88 + 254 63 + 254 38 + 254 13 + 3
Todos os programas precisam ser salvos usando a codificação ISO-8859-1 para atender ao limite de tamanho do arquivo.
Obrigado a @ChrisDrost, que apontou um erro e sugeriu a abordagem de aninhamento.
Experimente on-line no intérprete CJam .
254 219 + 2 × 4,56 × 10 526 programas
O compartilhamento de linha da pontuação pode ser alcançado pelo seguinte programa muito mais simples 1 .
A execução deste programa produz o programa
e após 254 219 - mais 1 iterações, o programa
Este último programa não vazio sai com um erro 2 e não imprime nada (o programa vazio).
Como funciona
Suponha que a string já esteja na pilha.
254 192 ≈ 5.35 × 10 461 mais programas
É aqui que as coisas ficam um pouco loucas.
O primeiro programa é altamente compressível. Ao escrever um programa semelhante que, em vez do programa vazio, eventualmente produz o primeiro programa da seção acima, podemos melhorar a pontuação em 254 192 programas 3 .
O programa
é semelhante ao primeiro programa da seção anterior e a execução do primeiro e sua saída para 254 192 iterações produz o último.
Suponha que a string já esteja na pilha:
Programas Moar
O primeiro programa da seção anterior ainda é altamente compressível; portanto, podemos aplicar um método semelhante e escrever um programa que, após 254 166 iterações, produza o programa mencionado acima.
Repetindo essa técnica várias vezes até atingirmos o limite de 255 bytes, podemos adicionar um total de 254 166 + 254 140 + 254 114 + 254 88 + 254 63 + 254 38 + 254 13 + 1 ≈ 1,59 × 10 399 programas para os das seções anteriores.
1 Nova linha adicionada para maior clareza.
2 Por consenso no Meta , isso é permitido por padrão.
3 ou 0.00000000000000000000000000000000000000000000000000000000000000000012%
fonte
JavaScript, 1000 programas
Se isso é válido depende exatamente de como entender a terceira regra.
fonte
Ruby, 1.628 × 10 ^ 237 programas
A mesma abordagem da minha resposta Perl, mas como o Ruby já lida com grandes ints, é mais fácil armazenar como hexadecimal.
Ruby, 9.277 × 10 ^ 90 programas
Portanto, essa tentativa é uma variação ligeiramente diferente da anterior, mas por causa de todas as funções extras, não estou conseguindo o número tão alto quanto o outro ... Foi interessante tentar outra abordagem!
fonte
Programas Python 2, 9,7 * 10 ^ 229
fonte
C, 2,2 * 10 ^ 177 programas
Não é perfeito, mas muito bom. Quero dizer, é exatamente
255
bytes de comprimento e gera programas do mesmo comprimento. Você provavelmente poderia mexer um pouco mais para ganhar mais alguns programas, mas vou deixar como está por enquanto.O programa é baseado em uma simples coluna C. Além disso, existe um algoritmo de contagem bastante simples que conta com todos os valores possíveis da matriz char
n
. Temos tantos programas quanto permutações da stringn
.O intervalo de caracteres é limitado a um intervalo de
#
(= 35) a[
= (91). Isso porque eu não quero nenhum"
ou\
na cadeia, porque eles precisam ser escapados.A geração do programa termina quando todos os valores na matriz char
n
são[
. Em seguida, ele gera um programa fictício simplesmain(){}
, que por si só não gera nada.Como demonstração de que deveria funcionar, mudei os limites, apenas caracteres entre o Código ASCII
35
e36
são usados e apenas 4 elementos de matriz.Os programas resultantes são
Isso gera
2^4 + 1 = 17
diferentes programas.Portanto, o programa acima gera
((91-35)+1)^101 + 1 = 57^101 + 1 ~= 2.2 * 10^177
diferentes programas. Não tenho muita certeza se isso conta ou se meu cálculo está corretofonte
2.2 * 10^177
(para aqueles que querem comparar)?Perl, 1 × 10 ^ 163
Caso contrário, este é um quine bastante básico, reduzido ao mínimo de caracteres possível, que só funciona enquanto o contador não estiver
0
.fonte
Lisp comum, 10 113 -1
O número de noves é limitado pelo tamanho máximo do código, 256, levando em consideração os espaços introduzidos pela impressora.
fonte
Perl, 1,4 * 10 ^ 225
Abordagem semelhante ao python; mesmo resultado!
fonte
> 65534 (?) Programas
Adicionei um ponto de interrogação ao lado de 65533, pois ainda tenho que verificar se ele pode imprimir 65533 (embora eu tenha motivos para acreditar que deveria). Quando tiver um pouco mais de tempo, vou descobrir uma maneira de testá-lo.
Você pode experimentá-lo online aqui .
A essência deste programa é que ele altera a saída do caractere no final e diminui seu valor numérico antes da impressão. Eu tenho 65534 programas porque o valor ascii do caractere no final do código é 65533, então contando o primeiro programa que temos 65534 (se você contar o programa vazio 65535, eu acho). O último programa "retornado" não é nada; simplesmente termina quando o valor do caractere é 0.
Tenho certeza de que ele poderá imprimir um caractere para todas as iterações: não consegui encontrar uma fonte definitiva para quantos caracteres> <> podem imprimir, mas existem caracteres diretamente abaixo de 65533, numericamente.
Deixe-me saber se há algum problema com esta implementação; Estou um pouco inseguro sobre a validade da minha inscrição.
Explicação
Eu descaradamente roubei a idéia de usar aspas simples para criar uma pseudoquina no wiki> <> e um comentário que vi aqui uma vez.
O que ele faz é analisar tudo após as aspas como caracteres e, em seguida, diminuir o último. A partir daí, apenas inverte a pilha (para imprimir na ordem correta), coloca aspas na pilha e depois imprime até que a pilha esteja vazia.
fonte
Python, 1 × 10 ^ 194 programas
Isso deve ser executado a partir de um arquivo, não de uma substituição interativa. Não é um problema.
Agradeço à @The Turtle por me ajudar a economizar 3 bytes, que é mais espaço para noves!
Agradeço ao @poke por me ajudar a economizar 2 bytes, o que é mais espaço para noves!
fonte
if n!=0
é redundante. Você pode apenas escreverif n
.if n:
e entre osreplace
argumentos.Bash, 52 programas
Totalmente sem inspiração e (esperançosamente) solidamente em último lugar.
fonte