Défi
Votre objectif est d'écrire un programme qui imprime un autre programme. Ce programme imprimé doit imprimer un autre programme et le nouveau programme doit imprimer un autre programme jusqu'à la fin.
Règles
- Chaque programme doit contenir moins de 256 octets. (Si cela doit être changé, laissez un commentaire)
- Le dernier programme doit être un programme vide.
- Il doit y avoir un nombre fini de programmes, donc le programme ne peut pas être une quine.
- Les programmes doivent tous s'exécuter dans la même langue.
- Aucune entrée n'est autorisée.
- Le programme gagnant est le programme qui imprime autant de programmes que possible, en se comptant.
Bonne chance!
code-challenge
code-generation
La tortue
la source
la source
2^2048
, ou3.2317e616
.a*10^b
où1<=a<10
etb
est un nombre naturel.1.2673e614
.Réponses:
CJam, 4,56 × 10 526 programmes
Score exact: 254 219 + 254 192 + 254 166 + 254 140 + 254 114 + 254 88 + 254 63 + 254 38 + 254 13 + 3
Tous les programmes doivent être enregistrés à l'aide de l'encodage ISO-8859-1 pour respecter la taille limite des fichiers.
Merci à @ChrisDrost qui a signalé un bug et suggéré l'approche d'imbrication.
Essayez-le en ligne dans l' interpréteur CJam .
254 219 + 2 ≈ 4,56 × 10 526 programmes
La part de ligne du score peut être obtenue par le programme suivant, beaucoup plus simple 1 .
L'exécution de ce programme produit le programme
et après 254 219 - 1 itérations supplémentaires, le programme
Ce dernier programme non vide se termine avec une erreur 2 et n'imprime rien (le programme vide).
Comment ça fonctionne
Supposons que la chaîne se trouve déjà sur la pile.
254 192 ≈ 5,35 × 10 461 autres programmes
C'est là que les choses deviennent un peu folles.
Le premier programme est hautement compressible. En écrivant un programme similaire qui, au lieu du programme vide, produit éventuellement le premier programme de la section ci-dessus, nous pouvons améliorer le score de 254 192 programmes 3 .
Le programme
est similaire au premier programme de la section précédente, et l'exécution du premier et de sa sortie pour 254 192 itérations produit le second.
Supposons que la chaîne se trouve déjà sur la pile:
Programmes Moar
Le premier programme de la section précédente est encore très compressible, nous pouvons donc appliquer une méthode similaire et écrire un programme qui, après 254 166 itérations, produit le programme susmentionné.
En répétant cette technique encore et encore jusqu'à ce que nous atteignions la limite de 255 octets, nous pouvons ajouter un total de 254 166 + 254 140 + 254 114 + 254 88 + 254 63 + 254 38 + 254 13 + 1 ≈ 1,59 × 10 399 programmes à celles des sections précédentes.
1 Nouvelle ligne ajoutée pour plus de clarté.
2 Par consensus sur Meta , cela est autorisé par défaut.
3 ou 0.0000000000000000000000000000000000000000000000000000000000000012%
la source
JavaScript, 1000 programmes
Sa validité dépend précisément de la manière de comprendre la troisième règle.
la source
Ruby, 1,628 × 10 ^ 237 programmes
Même approche que ma réponse Perl, mais parce que Ruby gère déjà les gros volumes, il est plus facile de stocker en hexadécimal.
Ruby, 9.277 × 10 ^ 90 programmes
Donc, cette tentative est une variation légèrement différente de la précédente quine-like, mais à cause de toutes les fonctions supplémentaires, je n'obtiens pas un nombre aussi élevé que l'autre ... C'était intéressant d'essayer une autre approche!
la source
Python 2, programmes 9.7 * 10 ^ 229
la source
Programmes C, 2.2 * 10 ^ 177
Ce n'est pas parfait, mais plutôt bon. Je veux dire qu'il fait exactement des
255
octets de long et génère des programmes de la même longueur. Vous pourriez probablement jouer un peu plus pour gagner d'autres programmes, mais je vais le laisser tel quel pour l'instant.Le programme est basé sur une simple quine C. De plus, il existe un algorithme de comptage assez simple qui compte toutes les valeurs possibles du tableau char
n
. Nous avons autant de programmes que de permutations de la chaînen
.La plage des ombles est limitée à une plage de
#
(= 35) à[
= (91). C'est parce que je n'en veux pas"
ou\
dans la chaîne, car ils doivent être échappés.La génération du programme se termine lorsque toutes les valeurs du tableau char
n
sont[
. Ensuite, il génère un programme factice simplemain(){}
, qui lui-même ne produit rien.Pour démontrer que cela devrait fonctionner, je viens de changer les limites, donc seuls les caractères entre le code ASCII
35
et36
sont utilisés et seulement 4 éléments de tableau.Les programmes résultants sont
Cela génère
2^4 + 1 = 17
différents programmes.Ainsi, le programme ci-dessus génère
((91-35)+1)^101 + 1 = 57^101 + 1 ~= 2.2 * 10^177
différents programmes. Je ne suis pas entièrement sûr si cela compte, ou si mon calcul est même correctla source
2.2 * 10^177
(pour ceux qui veulent comparer)?Perl, 1 × 10 ^ 163
Sinon, c'est un quine assez basique, réduit à aussi peu de caractères que possible, qui ne fonctionne que pendant que le compteur ne l'est pas
0
.la source
Common Lisp, 10 113 -1
Le nombre de neuf est limité par la taille maximale du code, 256, en tenant compte des espaces introduits par l'imprimante.
la source
Perl, 1,4 * 10 ^ 225
Approche similaire à python; même résultat!
la source
> <> , 65534 (?) Programmes
J'ai ajouté un point d'interrogation à côté de 65533 car je n'ai pas encore vérifié qu'il peut imprimer 65533 (même si j'ai des raisons de croire qu'il devrait). Une fois qu'il me reste un peu de temps, je vais trouver un moyen de le tester.
Vous pouvez l'essayer en ligne ici .
L'essentiel de ce programme est qu'il modifie la sortie du caractère à la toute fin, puis décrémente sa valeur numérique avant l'impression. J'ai reçu 65534 programmes car la valeur ascii du caractère à la fin du code est 65533, donc en comptant le premier programme, nous avons 65534 (si vous comptez le programme vide 65535, je suppose). Le dernier programme "retourné" n'est rien; il se termine simplement lorsque la valeur du caractère est 0.
Je suis sûr qu'il pourra imprimer un caractère pour toutes les itérations: je n'ai pas pu trouver de source définitive pour combien de caractères> <> peut imprimer, mais il y a des caractères directement en dessous de 65533, numériquement.
Faites-moi savoir s'il y a des problèmes avec cette mise en œuvre; Je ne suis pas certain de la validité de mon entrée.
Explication
J'ai volé sans vergogne l'idée d'utiliser un guillemet simple pour créer une pseudo-quine à partir du wiki> <> et un commentaire que j'ai vu ici une fois.
Ce qu'il fait, c'est tout analyser après le guillemet en tant que caractères, puis décrémenter le dernier. De là, il inverse simplement la pile (afin d'imprimer dans le bon ordre), pousse un guillemet sur la pile, puis imprime jusqu'à ce que la pile soit vide.
la source
Python, 1 × 10 ^ 194 programmes
Cela doit être exécuté à partir d'un fichier, pas d' une réplique interactive. Ce n'est pas une quine.
Merci à @The Turtle de m'avoir aidé à économiser 3 octets, ce qui est plus de place pour neuf!
Merci à @poke de m'avoir aidé à économiser 2 octets, ce qui est plus de place pour neuf!
la source
if n!=0
est redondant. Vous pouvez simplement écrireif n
.if n:
et entre lesreplace
arguments.Bash, 52 programmes
Absolument sans inspiration et (espérons-le) solidement à la dernière place.
la source