Rolling Quine Dice

19

Créez un programme qui sort lui-même.

Cependant, si le code source est répété n fois (ce qui signifie concaténer une copie du code source à la fin n-1 fois) , il devrait y avoir 1 / n de probabilité de sortie du code source d'origine, une probabilité de 1 / n de sortie le code source répété deux fois, une probabilité 1 / n de sortir le code source répété trois fois, ..., et une probabilité 1 / n de sortir le code source n fois.

Par exemple, si votre programme l'est foobar, alors il devrait toujours sortir exactement foobar. Toutefois, si vous exécutez foobarfoobarfoobarfoobar, il devrait y avoir une chance de ¼ chacun de produire foobar, foobarfoobar, foobarfoobarfoobaret foobarfoobarfoobarfoobar.

  • La distribution de chaque sortie possible doit être égale
  • En plus des méthodes d'E / S standard applicables et des échappatoires standard interdites, des règles de quine standard s'appliquent (ne peuvent pas accéder à sa propre source, etc.)
  • C'est le golf de code, donc la réponse la plus courte en octets gagne
JMigst
la source
Le pseudo-aléatoire est-il assez bon?
wastl
1
@wastl Oui, ça va
JMigst
2
Votre définition est légèrement décalée. Si vous le répétez 1 fois (c.-à-d. foobarfoobar), Il n'imprimera quefoobar
Veskah
1
@Veskah foobarfoobarest foobarrépété deux fois, pas une fois.
Nit
@Nit Vous commencez avec la source. Si vous l'utilisez à nouveau, vous ne l'avez répété qu'une seule fois mais vous disposez de deux instances.
Veskah

Réponses:

9

Gelée , 24 22 octets

“Ṿ;ẋŻɼLX¤¤µ”Ṿ;ẋŻɼLX¤¤µ

Essayez-le en ligne!

Essayez-le x4!

“Ṿ;ẋŻɼLX¤¤µ”Ṿ;ẋŻɼLX¤¤µ
“Ṿ;ẋŻɼLX¤¤µ”              String literal: Ṿ;ẋŻɼLX¤¤µ
            Ṿ             Uneval. Return “Ṿ;ẋŻɼLX¤¤µ” (with quotes)
             ;            Append the initial string. Yields the source code. 
                ɼ         Apply the preceding link to the register and store the 
                          result in the register.
               Ż          Prepend 0. 
                          Each time Żɼ is used when the source code is repeated
                          the register's length increases by one. 
                          We can't use ‘ because it closes string literals.
                 L        Length. Returns the number of times the source code has
                          been repeated up till now.
                  X       Random element. If ɼ results in n, X returns a random 
                          integer between 1 and n.
                   ¤      Combines ŻɼLX as a nilad. 
              ẋ           Repeat the source code a random number of times between
                          1 and n.
                    ¤     Close everything from the initial string literal as a
                          nilad. 
                     µ    Start a new monadic chain. The register gets updated
                          once for time the code is repeated but only the final
                          repetition will result in output.
dylnan
la source
5

05AB1E , 32 octets

"34çìDJ¼32ôн¾L×Ω"34çìDJ¼32ôн¾L×Ω

Essayez-le en ligne!

Explication

"34çìDJ¼32ôн¾L×Ω"                   # push this string
                 34ç                # push a "-character
                    ì               # prepend it to the string
                     DJ             # duplicate and join the copy to the string
                       ¼            # increment the counter
                        32ô         # split the string into pieces of size 32
                           н        # take the first one
                            ¾L×     # repeat it for each in [1 ... counter]
                               Ω    # pick one at random
Emigna
la source
Pourriez-vous ajouter une explication lorsque vous en avez l'occasion?
Shaggy
@Shaggy: Merci de me le rappeler :)
Emigna
2

Gol> <> , 21 octets

:QoaonC|P\Sx*F2ssS"
0

Essayez-le en ligne!

Explication:

:Q     |     If the top of stack is 0, skip to next |
             Top of stack is implicitly 0
        P    Increment top of stack
         \   Redirect pointer down]
0:QoaonC|P\Sx*F2ssS"  Increment for each copy of the source code
0:QoaonC|P\Sx*F2ssS"


         \   Redirect back to the right
          Sx*  Multiply the number of copies of the source code by a random number between 0 and 1
             F      Repeat that many times
              2ss   Push a double quote
                 S" Print the source code minus the quote, newline and 0
 :Q       If top of stack is not 0
   oaonC  Print the quote, a newline and a 0 to complete the source code and continue the loop
        \Sx*   Error on the * for some reason
Jo King
la source
1

Alice , 35 octets

"d3a*h-&;adddd12h&}Uh*t&w.odt,k@
 !

Essayez-le en ligne!

Explication

"

Comme dans beaucoup de quines dans les langages 2D, cela commence par un "qui s'enroule autour de lui et pousse la première ligne entière sauf le "lui - même.

d3a*h-&;

L'ajout d'une ou plusieurs copies supplémentaires du code source placera des espaces implicites à la fin du littéral de chaîne. Pour en faire un quine, nous tronquons la pile à 31 caractères.

addd

Appuyez sur une nouvelle ligne, puis sur la hauteur de la pile trois fois. Les valeurs poussées comme hauteur de pile sont 32 (l'espace dans la deuxième ligne), 33 (le !dans la deuxième ligne) et 34 (l'initiale ").

d

Poussez à nouveau la hauteur de la pile, cette fois comme la longueur du code source d'origine (35).

1

Initialiser un compteur à 1. Ceci comptera le nombre de fois que le code source est répété.

2h&}

Tournez trois fois à droite sur place (c.-à-d. Tournez à gauche). Chaque répétition supplémentaire du code source apportera un hdans la même colonne que celle-ci }, incrémentant ainsi le compteur. Lorsque l'IP revient au }, tournez à nouveau à droite pour continuer dans la même direction.

Uh

Prenez un nombre aléatoire uniforme de 0 à n-1, puis ajoutez 1 pour obtenir le nombre de fois de sortie de la source d'origine.

*t&w

Multipliez par la hauteur de pile précédemment poussée (longueur de code), puis répétez ce qui suit plusieurs fois en appuyant sur une adresse de retour plusieurs fois moins une.

.o

Sortez le haut de la pile sans la détruire.

dt,

Déplacez l'entrée de pile inférieure vers le haut.

k@

Répétez, puis terminez une fois la boucle terminée.

Nitrodon
la source
1

JavaScript (Node.js) , 62 octets

(f=a=>b=>b?f(a+.5):`(f=${f})(1)`.repeat(1+Math.random()*a))(1)

Essayez-le en ligne!

l4m2
la source
1
Soit je n'ai pas de chance, soit cela ne peut pas imprimer plus de deux copies du code source d'origine.
Nitrodon
@Nitrodon Thanks, fixed
l4m2
1

Fusain , 58 octets

≔´θ´⎚´×´⊕´‽´L´⊞´O´υ´ω´⁺´⪫´⁺´´´≔´θ´´´´´θθ⎚×⊕‽L⊞Oυω⁺⪫⁺´≔θ´´θ

Essayez-le en ligne! Pas de version détaillée car le déverbosificateur s'étouffe actuellement "´". Surtout basé sur la quine Charcoal de Golf, vous êtes une quine pour le bien! . Explication:

≔´θ´⎚´×´⊕´‽´L´⊞´O´υ´ω´⁺´⪫´⁺´´´≔´θ´´´´´θθ

Attribuez la chaîne littérale θ⎚×⊕‽L⊞Oυω⁺⪫⁺´≔θ´´θà θ.

Effacez toute sortie précédente, de sorte que seule la dernière sortie prenne effet.

×⊕‽L⊞Oυω

Poussez la chaîne vide dans le tableau prédéfini. Cela rend la longueur du tableau égale au nombre de répétitions traitées jusqu'à présent, alors prenez sa longueur, prenez un nombre aléatoire dans la plage exclusive implicite, ajoutez 1 et répétez la chaîne suivante autant de fois.

⁺⪫⁺´≔θ´´θ

Ajoutez la chaîne littérale à θ, puis insérez des littéraux ´entre chaque caractère, puis suffixez une autre copie de θ.

Neil
la source