Générez un caractère aléatoire pour chaque caractère du code source (comme illustré ci-dessous). La probabilité de chaque caractère est sa fréquence dans le code source d'origine. Ainsi, la sortie sera un faux code source ressemblant à un quine.
spécification
- Restrictions
- Des contraintes de quine standard s'appliquent. Aucun programme ou fonction vide. Pas non plus de lecture de votre propre source.
- Sortie
- Le nombre de caractères émis doit être exactement le nombre de caractères dans le code source
- Chaque caractère de sortie doit être choisi au hasard
- La probabilité de choisir un caractère est égale à
(occurrences in source) / (length of source)
- Cela signifie que même une solution unaire doit choisir «au hasard» 1avec probabilité
1
. Cela signifie que la sortie ne peut pas être codée en dur.
- Gagnant
- C'est le golf de code, donc le moins d'octets gagne
Exemple
Program Frequency Probability Possible Output
------- --------- ----------- ---------------
a@!@ a - 1 a - 25% @@a@
! - 1 ! - 25%
@ - 2 @ - 50%
Program Frequency Probability Possible Output
------- --------- ----------- ---------------
caBaDBcDaBDB a - 3 a - 25% aaaBBBBccDDD
B - 4 B - 33%
c - 2 c - 17%
D - 3 D - 25%
Réponses:
CJam , 14 octets
Essayez-le en ligne!
Explication
Chaque caractère apparaît exactement deux fois, donc les probabilités des caractères doivent toutes être identiques.
la source
Gelée , 13 octets
Essayez-le en ligne!
Comment ça marche
la source
Perl, 59 octets
J'ai utilisé une quine existante comme base et l'ai modifiée pour imprimer des caractères aléatoires à partir du contenu source.
Usage
Enregistrer sous
faux-source-code.pl
et exécuter en utilisant:Produit quelque chose comme ceci:
Dans un bref test, ~ 3% des résultats du programme ont
eval
réussi. Je ne sais pas ce que cela dit sur Perl ...la source
eval
! Joli! ;-)'
ouq//
,q{}
etc.)!Japt , 22 octets
Testez-le en ligne!
Comment ça marche
la source
Pyth, 16 octets
essayez-le en ligne!
Contient chaque caractère deux fois donc la probabilité est la même que si chacun n'y était qu'une fois.
la source
PHP,
71140110124140120 octetscourir avec
php -d
ord
(même probabilité que si je doublais la chaîne et ajoutais deux guillemets);
Peut éventuellement être golfé plus loin, mais mes tentatives sur eval ont été vaines jusqu'à présent.
Je n'irai probablement pas plus loin ici.
la source
The probability of each character is its frequency in the original source code.
Je peux me tromper, mais il ne semble pas que cette entrée réponde à cette exigence.syntax error, unexpected '<'
. Mais je ne connais pas PHP, comment puis-je tester cela?php
ouphp-cgi
sans indicateur. Vous pouvez peut-être utiliser un hérédoc.<?
pour une utilisation avec-d
.Python 2, 88 octets
Tout le mérite réel d'aller aussi loin revient à mbomb007 - merci pour votre aide (et le pointeur sur les contre-obliques)
la source
n
long), vous devez imprimern
des caractères aléatoires. Où la probabilité qu'un symbolec
soit choisi est égale à(number of times c occurs in your solution) / n
.exec("""s = 'from random import choice; print "".join([choice(s) for c in s])'; exec(s)""")
join
.s='''from random import*;print"".join(choice(s)for c in s+"s='';''exec s''")''';exec s
. J'aimerais avoir pensé à ça.Rubis, 47 octets
Ceci est basé sur le
eval
quine standard :C'est un octet plus long que le quine le plus court, mais c'est généralement le meilleur choix pour les quines généralisés, car tout calcul effectué sur la chaîne de code source n'a pas besoin d'être dupliqué. Alors que dans le quine habituel, chaque calcul supplémentaire doit aller à l'intérieur et à l'extérieur de la chaîne principale, il n'est nécessaire qu'à l'intérieur de la chaîne principale pour ce type de quine.
Quant à ce que fait réellement le code: après avoir obtenu une chaîne représentant tout le code source, nous sélectionnons simplement un caractère aléatoire (en sélectionnant un index aléatoire) 47 fois et imprimons chaque caractère séparément.
la source
Wolfram Language / Mathematica, 109 octets
exemple de sortie:
Oh ces crochets.
la source
Gelée, 44 octets
J'espère avoir interprété toutes les règles correctement (je ne suis pas tout à fait sûr de ce que la chose « charge utile carry » est en méta ou si elle est encore pertinente à ce défi).
Testez-le sur TryItOnline
Cela construit une chaîne parmi laquelle choisir les caractères. La chaîne initiale a tous les caractères utilisés sauf les guillemets ouverts et fermés. Il double ensuite cette chaîne et concatène l' une de chacune des guillemets ouverts et fermés des ordinaux (d'où la nécessité de doubler les autres caractères). Enfin, il sélectionne à plusieurs reprises des caractères aléatoires de la chaîne composée jusqu'à la longueur du programme.
la source
Pyke, 35 octets
Essayez-le ici!
Pour vérifier: supprimez la finale
H
et la chaîne résultante contient le bon numéro de chaque caractère (avec le supplémentH
)Cela n'utilise PAS de quine généralisé ou en fait un quine du tout. Il repose sur la possibilité de créer une chaîne contenant tous les caractères de la source. Il devrait pouvoir le faire pour n'importe quel code, mais chaque caractère augmente logarithmiquement la taille du code. Le seul nombre de fois où un personnage est autorisé dans la source est 2 ou 7
la source
Rubis,
8167 octetsEnregistré un tas d'octets en volant quelques astuces de la solution de Martin
Je ne savais pas que vous deviez sélectionner au hasard à chaque fois; Je pensais qu'un shuffle ferait l'affaire. Cela peut probablement être joué au golf, mais c'est le plus court possible.
Quine Ruby standard avec quelques modifications pour qu'il imprime la chaîne mélangée. Je suis triste parce qu'il a fallu quinze minutes pour comprendre les bizarreries de formatage avant de réaliser que je le volais inconsciemment de toute façon.
Je pense que le réarrangement des cordes peut être raccourci mais je ne sais pas comment; Je pourrais également être en mesure de préciser la mise en forme pour être plus courte une fois que j'y ai réfléchi. De l'aide serait appréciée.
Essayez-le en ligne!
la source
64.times{$><<"64.times{$><<.inspect[rand 32]}".inspect[rand 32]}
eval r="47.times{$><<('eval r=%p'%r)[rand 47]}"
C, 125 octets
C, 60 octets pour le code golfé mais pas quine prenant n'importe quelle chaîne
Alors que pour compter les caractères, ma solution avait besoin de 86:
la source
f
prend la chaîne et imprime sur la sortie standard: la chaîne peut être n'importe quelle séquence de caractères.rand()%LENGTH_OF_STRING
prend le caractère en fonction de la probabilité de ce caractère avec une distribution normale fournie parrand()
. Peut-être, je ne comprends pas l'quine
approche pour C ....s
a juste besoin de contenirchar*s="";
. Je pense que quelque chose comme ça lechar*s="char*s=l,i;f(){l=i=strlen(s);while(i--)putchar(s[rand()%l]);};+''"+'""'
ferait (mais je ne connais pas C).JavaScript, 128 octets
Remarque: ne fonctionne que dans Firefox en raison de l'utilisation de
uneval
.Exemples de cycles:
la source
gtraoan
qui est presque un grognement je suppose ..."
une probabilité de se présenter?Python 3,
134132 octetsJ'utilise chaque caractère de mon code source dans la chaîne le bon nombre de fois, puis je multiplie la chaîne par deux pour l'inclure. Le programme imprime un caractère aléatoire à partir de cette chaîne pour chaque caractère du code (la longueur est codée en dur.)
Essayez-le en ligne
J'ai évité les contre-obliques comme la peste. Dès que le code contient
\n
ou\"
, vous avez un problème, car la chaîne ne contient pas encore de barres obliques inverses, vous devez donc les ajouter également, mais dans une chaîne distincte multipliée par un nombre plus élevé, car il faut deux barres obliques inverses pour en représenter une (\\
).Exemple de sortie:
Je dois dire que cela me rappelle FlogScript.
la source
PowerShell v2 +, 175 octets
Les quines dans PowerShell sont nulles, car les délimiteurs de remplacement de chaîne
{}
indiquent également des boucles et autres, donc vous devez utiliser un tas dechar
s dans le-f
opérateur, ce qui gonfle le code.Similaire à ma réponse Quine on Every Line . Fondamentalement, nous bouclons de
0
à174
et chaque itération recalcule le quine$d
, lechar
transforme en un tableau et extrait unRandom
élément choisi uniformément de l'entrée. Par définition, cela donne la probabilité(occurrences in source) / (length of source)
requise. Ces caractères sont encapsulés entre parenthèses et édités-join
ensemble dans une chaîne.Exemple
(Oui, c'est une nouvelle ligne dans la sortie - quand une chaîne contenant une nouvelle ligne est
char
-array'd, la`n
est traitée comme un caractère, car unechar
-array est juste un tableau de codes d'octets, donc elle a aussi un 1 / 175e chance d'être sélectionné.)la source
Dyalog APL , 20 octets
f←{
...}
définir f comme(,⎕CR'f')
listified (,
) C haracter (table) R epresentation (⎕CR
) of f ('f'
)[?⍴⍨20]
indexé avec ([
...]
) aléatoire jusqu'à (?
) répéter-fois-fois (⍴⍨
) de vingtLançons-le (avec un argument factice) plusieurs fois:
Très bien, mais la distribution est-elle correcte? Exécutons-le sur 10 000 arguments fictifs et voyons combien de fois chaque caractère se produit:
De toute évidence,
f
et'
se produisent deux fois plus souvent que les autres caractères, tout comme dans le code source d'origine.Comment avons-nous fait ça?
⍳1E4
génère les 10 000 premiers entiersf¨
exécute f sur chacun de ces nombres∊
aplatit toutes les pseudo-quines en une seule chaîne de 200 000 caractères⌸
est une fonction d'ordre supérieur qui, pour chaque caractère unique dans les données de droite, alimente la fonction de gauche l'élément unique en argument de gauche et les indices où ce caractère apparaît comme argument de droite. La fonction de gauche est⍺
argument de gauche, c'est-à-dire le caractère unique,
suivi par1E¯4×
1 × 10⁻⁴ fois⍴⍵
la forme de l'argument de droite (les indices d'occurrence), c'est-à-dire combien de fois il se produitEnfin,
⌸
met tout cela ensemble dans une table.la source
C #,
277280268 octets.Non golfé:
Je suis sûr que cela fonctionne correctement.
Exemple de sortie:
la source
(new Random()).Next(0,134)]
travail? Cela économiserait quelques octets.C, 136 octets
Exemple de sortie:
Ce programme génère 136 caractères au hasard.
Le code source entier (moins les "guillemets) est contenu dans une chaîne. Le programme détermine la probabilité de sortie d'un guillemet comme 2/136, sinon la sortie au hasard d'un des 67 autres caractères.
Il y a deux occurrences de chaque caractère dans la chaîne du programme. La probabilité de sortir un caractère de la chaîne est 134/136. La probabilité de choisir un caractère spécifique dans la chaîne est de 1/67. La probabilité de sortie d'un caractère dans la chaîne est donc 134/136 * 1/67 = 2/136. Il y a deux occurrences de chaque caractère de chaîne dans le programme, il y a donc une probabilité de 1/136 de sortir un caractère pour chaque occurrence du programme.
L'ordre des symboles à l'intérieur de la chaîne n'a pas d'importance.
la source