Un modèle de Markov simple sera utilisé dans cette question. Pour plus d'informations sur les chaînes de Markov, voir http://setosa.io/ev/markov-chains/ .
Prenez une ficelle. Pour cet exemple, nous utiliserons le mot:
reader
Maintenant, pour chaque caractère, prenez les caractères qui apparaissent après chaque occurrence du caractère dans la chaîne. ( `^`
représente le début de la chaîne et `$`
représente la fin)
`^` -> {'r'} # After the start of the string, there is an `r`.
'r' -> {'e', `$`} # After the first `r` (*r*eader), there is an `e`
# after the second (reade*r*), there is the end of the string.
'e' -> {'a', 'r'}
'a' -> {'d'}
'd' -> {'e'}
Maintenant, à partir du début de la chaîne, choisissez aléatoirement l'un des caractères du jeu suivant. Ajoutez ce personnage, puis choisissez parmi les personnages de son prochain ensemble, et ainsi de suite jusqu'à la fin. Voici quelques exemples de mots:
r
rereader
rer
readereader
Si un personnage apparaît plusieurs fois après un autre personnage, il est plus susceptible d'être choisi. Par exemple, dans cocoa can
, après un c
, il y a deux tiers de chance d'obtenir un o
et un tiers de chance d'obtenir un a
.
'c' -> {'o', 'o', 'a'}
Défi
Créez un programme qui ne prend aucune entrée et génère une chaîne aléatoire générée à l'aide d'une chaîne de Markov, comme ci-dessus, où l'entrée de la chaîne est la source du programme.
- Le programme doit avoir au moins deux caractères, dont deux doivent être identiques (pour éviter les chaînes "ennuyeuses" qui n'ont qu'une seule sortie)
- Vous pouvez modifier le modèle pour utiliser des octets au lieu de caractères si vous le souhaitez, mais changer "caractères" en "octets" dans la règle 1
- Le programme devrait produire des chaînes de façon aléatoire avec la fréquence attendue en théorie
C'est du golf de code , donc le programme le plus court gagne!
la source
^
et$
entre guillemets? il pourrait être plus clair de le retirer des guillemets ou de les mettre en guillemets.Réponses:
Pip , 64 octets
C'était amusant.
<tab>
représente un caractère de tabulation littéral (0x09
). Essayez-le en ligne!Comment?
TL; DR: syntaxe de chaîne d'échappement, repr et eval.
Pour les chaînes qui doivent contenir des
"
caractères littéraux , Pip a échappé les chaînes , en utilisant\"
comme délimiteur. Un quine standard utilisant des chaînes d'échappement ressemblerait à ceci:C'est-à-dire:
Y
ank (stockage en tant quey
) une chaîne contenant"V Y".RPy
et eV
al.RPy
prend la repr dey
, à laquelle nous ajoutons la chaîne littéraleV Y
. Enfin, affichez le résultat de l'évaluation.La structure du quine Markov est similaire, sauf que nous voulons enregistrer le code au lieu de le sortir et ensuite faire quelques trucs avec.
t:V Y\"...\"
affecte le résultat de l'évaluation àt
. À l'intérieur du code évalué,m:"..."
assigne une chaîne de code àm
laquelle nous évaluerons à la finVm
.ST["t:V Y"RPy";Vm"C9]
construit une liste contenantet le convertit en une chaîne qui, par défaut, concatène tous les éléments. Cette section est équivalente à celle
"V Y".RPy
du quine d'origine. Comme il s'agit de la dernière expression de la grande chaîne d'évaluation, sa valeur correspond à ce que l'V
opérateur retourne et donc à ce qui lui est attribuét
.Ainsi, après l'évaluation et l'affectation,
t
est égal au code complet etm
contientÉvalue maintenant
Vm
cela en tant que code. Décomposons ce qui se passe.Quelques notes:
xxy
reviendrait uniquementxx
et nonxy
dans les correspondances. Heureusement, cependant, il n'y a pas de caractères doublés dans ce code, donc cela n'a pas d'importance.la source
JavaScript,
217215 octetsNotez que cela utilise
uneval
, qui n'est pris en charge que par Firefox. Exemples de cycles:Comme vous pouvez le voir, c'est surtout du charabia, mais c'est normal ;) L'OP a créé un JSFiddle qui démontre que la probabilité qu'une sortie soit JS syntaxiquement valide est d'environ 6,3%.
Si les fonctions d'auto-lecture étaient autorisées, cela pourrait être 78 octets d'ES6:
Très, très rarement, cela génère un JS syntaxiquement valide:
Mon préféré des noms de fonctions qu'il a créés est
.splendom()
(split
+length
+random
)la source
a.splerength.r()
, ce qui pourrait être valide;)Perl, 103 octets
Sur la base du quine standard et ma réponse à cette question :
Exemple de sortie
De manière similaire à l'autre question, certains résultats génèrent du Perl valide:
mais les chances sont légèrement inférieures, à ~ 2%.
la source
q{
c'est le début d'un littéral de chaîne et il n'y a pas}
à le fermer. Perl est en fait assez mauvais pour exécuter des séquences aléatoires d'octets (et quand c'est le cas, c'est normalement dû à un littéral de chaîne ou à un commentaire précoce).Code machine MS-DOS (fichier .COM), 63 octets - non concurrent
Non concurrent car un quine ne doit pas accéder à son propre code source.
Une variante de 126 octets répondrait à l'exigence "ne pas accéder à son propre code source"!
La variante de 63 octets ressemble à ceci:
Je ne suis pas sûr non plus de la distribution de probabilité du générateur aléatoire:
Le programme utilise le fait que les compteurs d'horloge et autres informations modifiées par des interruptions sont stockées dans le segment 0 pour générer des nombres aléatoires.
Voici des exemples de sorties générées:
Converti en code assembleur, le programme ressemble à ceci:
la source
C, 306
328585611615623673707octetsCode source:
Avec des nouvelles lignes et des espaces ajoutés pour plus de lisibilité / explication:
Explication
Line 01
:p[][]
contient les décomptes d'un personnage après l'autre.Line 02
:X
contient la source du programme, échappé avec%c%s%c
.Line 03
:Y
contiendra la source littérale du programme.c
,j
,*a
Sont des variables de comptage.Line 05
: EnsembleY
pour contenir le quine.Line 06
: Nombre d'occurrences de lettres dansp[][]
.Line 07
: Imprimer l'état actuel.Line 08
: Trouver le caractère suivant au hasard, proportionnel aux nombres dansp[][]
.Exemple de sortie:
p[++);p[99]=Y;putfor(aind(a++j,*a+j=j,c][c,*an(arile(pr*Y,Y[256]<<1);)][*Y,Y;)wha+++j=*aintfor*Y;prin(a+j]=j][256<1)pr(a;a;f(p[char(Y;for());};a;ma;ma=%s%chain(Y;ar(j][256<<<1)p[256<<raile(cha][9]<rin(j,34,34,Y[256]+j,Y,34,Y,c=Y,*a;*a;for(){0}
la source
Rubis, 152 octets
Exemple de sortie:
ou
Quines utilisant le formatage de chaînes via
"s%s"
, et fait le chaînage de Markov en prenant toutes les tranches de deux caractères, en les mélangeant et en les transformant en un dictionnaire de hachage, où pour les clés en double, la dernière apparence définit la valeur. Pour éviter d'ajouter de la logique supplémentaire pour le début, je surveille le dernier caractère de sortie à l'aide de$/
, qui est automatiquement initialisé sur une nouvelle ligne, et je m'assure que les nouvelles lignes sont toujours suivies dans le code par0
le même caractère que le code commence par. Pour la fin, je manipule le code source afin qu'il n'y en ait qu'un,!
donc nous finissons toujours après le coup, en l'<<33
ajoutant sans le littéral. Cela pourrait être approfondi en utilisant un caractère à un chiffre non imprimable au lieu de l'ASCII 33, mais cela semblait trop ennuyeux.la source
p<<<<<33
L'opérateur super-super-super-concat? ;-)Has(s).ears(2)
me fait rire!Rouille, 564 octets (non compétitif)
Comme j'avais déjà écrit un quine Rust assez soigné pour une autre question, j'ai pensé l'adapter pour cela, car cela semblait assez simple. Bien que l'original soit petit, pour cela, j'ai fait très peu d'efforts pour réduire la taille. Voici une version étendue pour expliquer ce qui se passe:
Exemple de sortie 1:
Exemple de sortie 2:
la source
Python 2, 211 octets
Sort le résultat vers
stderr
.Essayez-le en ligne
Exemple de sortie:
Brève explication:
s='s=%r;print s%%s';print s%s
format quine. Je crée une chaînes
qui contiendra l'ensemble du programme.X
contient la procédure à exécuter récursivement.o
, qui sera imprimée dansstderr
la fin de la chaîne de Markov.$$
, en utilisant deux caractères pour que le programme fonctionne pour toutes les chaînes. J'aurais pu utiliser un personnage qui n'était pas dans mon programme commechr(0)
, mais je pense que c'est plus long.c
lequel (aveco
) est initialisé au premier caractère du programme.c
dans la chaînet
(la variable contenant le quine du code source) estq
, qui sera choisie pour la prochaine sélection dec
.la source
PHP,
144135130 130120272220212 octetsOu, formaté pour la lisibilité:
Exemple de sortie:
et:
et:
et:
PHP Cheating, 117
Pour les curieux, si nous trichons en lisant notre propre source, nous pouvons faire 117:
la source