Écrivez un programme capable de se générer aléatoirement.
Il doit le faire en fonction des jetons utilisés dans son code source. Si le code source de votre programme est composé de 50 jetons uniques et a une longueur de 60 jetons, alors le programme devrait produire 60 jetons où chaque jeton est choisi au hasard parmi l'un des 50 jetons uniques.
Par exemple, ce programme aurait une chance sur 50 ^ 60 de se reproduire.
Qu'est-ce qu'un jeton? Cela dépend de la langue. Par exemple, les identifiants ( foo_bar
), les mots-clés ( while
) et les nombres ( 42
) comptent comme des jetons dans la plupart des langues. Les espaces blancs ne comptent pas dans la plupart des langues.
Règles supplémentaires:
- La sortie ne peut contenir que des jetons trouvés dans le code source du programme, séparés par le délimiteur approprié
- La sortie doit être de la même longueur que le code source du programme, comptée par les jetons
- Un seul langage de programmation peut être utilisé
- Le code source doit avoir au moins 3 jetons uniques
- Exclure des commentaires du code source
- Le programme ne devrait avoir qu'une chance sur U ^ L de se reproduire
Notation: le programme qui a les meilleures chances de se reproduire gagne.
la source
Réponses:
Python 2, 3 ^ -3 = 0,037
exec
l'abus est assez pratique pour réduire le nombre de jetons. Maintenant mis à jour pour ne pas lire le fichier source!Le supplément
''
entreexec
et la chaîne géante entre guillemets triples consiste simplement à remplir le nombre de jetons au minimum requis de 3. Il est fusionné dans la deuxième chaîne en raison de la concaténation implicite littérale de la chaîne.Version originale, ouverture du fichier source:
À proprement parler, la grammaire Python place un jeton ENDMARKER à la fin du fichier source, et nous ne pouvons pas produire un fichier source avec ENDMARKERs aléatoirement éparpillés. Nous prétendons que cela n'existe pas.
la source
".]';(?3 3 3){]`".;~({:,],{:,],6#{:)'';(?3 3 3){]`".;~({:,],{:,],6#{:)'''''''
.Javascript, 102 jetons, 33 uniques, 7,73 × 10-154
Remarque, ceci est une vraie quine. Il ne lit pas le fichier ni n'utilise
eval
ouFunction.toString
la source
Python: P (programme de génération en 1 essai) = 3.0317 * 10 ^ -123
34 jetons uniques, 80 jetons au total. Notez qu'il y a un espace à la fin de chaque ligne.
Exemple de sortie:
Merci à l'autre solution Python de user2357112 pour m'avoir rappelé de jeter le dernier jeton et d'utiliser
__file__
ce que j'ignorais auparavant.la source
J - 1 à 11 17 = 1,978 x 10 -18
J a un tas de petits outils pratiques pour faire ce genre de travail.
Tout d'abord, toute chaîne de nombres séparés par des espaces est un jeton . Cela signifie un tableau unidimensionnel de ces nombres. C'est ainsi que fonctionne le lexer de J. Soit dit en passant, c'est dix-sept
11
, si quelqu'un est curieux.(,,,{:,{:)'QUINE'''
est une astuce courante en J, conçue pour utiliser le moins de jetons possible:{:
signifie Tail , donc il ajoute la chaîne à lui-même, puis ajoute deux copies du dernier caractère à la fin de cela. Puisque le dernier caractère est un guillemet simple (J utilise des chaînes de style Pascal), le résultat estQUINE'QUINE'''
.;:
est un tokenizer, et décompose une chaîne d'entrée comme si c'était du code J, renvoyant une liste de cases. La longueur de ce résultat est de 17.~.
prend tous les éléments uniques de ce tableau. La longueur de ce résultat est de 11.?
s'appelle Roll . Pour chaque entier de son argument, il sélectionne un nombre positif aléatoire supérieur ou égal à zéro, inférieur à ce nombre. Donc ici, J va générer 17 nombres de 0 à 10 inclus.{
utilise les indices aléatoires pour sélectionner des éléments de notre liste de jetons uniques dans des boîtes.;
ouvre toutes ces boîtes et exécute le résultat ensemble.Quelques exemples suivent. Les lignes en retrait sont les invites d'entrée et les lignes alignées avec le côté gauche sont la sortie de l'interpréteur.
la source
Postscript
C'était amusant
Il y a 17 jetons uniques et 54 jetons au total pour environ 1 chance sur 3,6e-67.
la source
Espace,
3 ^ -2053 ^ -1893 ^ -1813 ^ -132 ~ = 10 ^ -63Il s'agit d'un programme Whitespace qui, lorsqu'il est semé de caractères aléatoires, a une chance de 1 sur 3 ^ 132 de se reproduire (3 jetons distincts, répétés 132 fois). Il doit être ensemencé avec au moins 132 caractères aléatoires lors de son exécution (l'espace blanc n'a pas de fonction aléatoire ou de date intégrée pour l'amorçage), par exemple
some_whitespace_interpreter my_quine.ws <some_random_source >quine_output.ws
. Le score serait amélioré si le programme pouvait être joué au golf plus longtemps, mais c'est mon premier "vrai" programme Whitespace, donc je vais le laisser avec ma maigre quantité de golf.Code d'espace blanc clair, ou voyez-le s'exécuter : (pour l'essayer, cliquez sur "modifier", copiez le contenu à l'intérieur des balises <pre>; devrait être 132 caractères avec EOL de style Unix)
Code annoté avec quelle commande est quoi (pas techniquement un quine, car il ne reproduira pas les commentaires):
Si la graine se trouve être équivalente (les personnages sont pris mod 3 pour être convertis en jetons), cela réussira:
C'est un programme assez simple, à peu près équivalent à ce programme Ruby:
la source
Perl, 27 jetons, P = 1,4779 x 10 -34
Dernière modification: utilisez
@ARGV=$0
au lieu deopen*ARGV,$0
pour enregistrer un jeton.=
,/
,@
,$
)W
)Je pense donc que cela rend la probabilité (pow (2,2 * 4) * pow (4,4)) / pow (27,27), environ 1,48E-34.
Si le code source se trouve dans un fichier appelé
ARGV
, vous pouvez utiliser cette solution à 26 jetons avec P = ~ 2.193 x 10 -31 :la source
P = (4 * 2! + 4!) / 27!
qui se situe aux alentours de 1,7632684538487448 x 10 ^ -26Perl 6 ,1 dans 33 = 0,037037 ...
(Je sais que ce n'est pas du golf de code, mais ...)
Essayez-le en ligne!
Tout comme la réponse Python, où le premier jeton est un littéral de chaîne évalué. Les jetons sont
Explication:
la source