Rolling Quine Dice

19

Crea un programa que salga solo.

Sin embargo, si el código fuente se repite n veces (lo que significa concatenar una copia del código fuente hasta el final n-1 veces) , entonces debería haber una probabilidad de 1 / n de generar el código fuente original, una probabilidad de 1 / n de generar el código fuente se repite dos veces, una probabilidad de 1 / n de generar el código fuente repetido tres veces, ..., y una probabilidad de 1 / n de generar el código fuente n veces.

Por ejemplo, si su programa es foobar, entonces siempre debería salir exactamente foobar. Sin embargo, si se ejecuta foobarfoobarfoobarfoobar, entonces debe haber una oportunidad de ¼ cada uno de salida foobar, foobarfoobar, foobarfoobarfoobary foobarfoobarfoobarfoobar.

  • La distribución de cada salida posible debe ser igual
  • Además de la aplicación de métodos de E / S estándar y las lagunas legales prohibidas, se aplican las reglas de quine estándar (no se puede acceder a su propia fuente, etc.)
  • Este es el código de golf, por lo que la respuesta más corta en bytes gana
JMigst
fuente
¿Es lo suficientemente pseudoaleatorio?
wastl
1
@ wastl Sí, está bien
JMigst
2
Tu definición está un poco apagada. Si lo repite 1 vez (es decir foobarfoobar), solo se imprimiráfoobar
Veskah,
1
@Veskah foobarfoobarse foobarrepite dos veces, no una.
Nit
@Nit Comienzas con la fuente. Si lo usa nuevamente, solo lo ha repetido una vez, pero tiene dos instancias.
Veskah

Respuestas:

9

Jalea , 24 22 bytes

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

Pruébalo en línea!

Pruébalo 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
fuente
5

05AB1E , 32 bytes

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

Pruébalo en línea!

Explicación

"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
fuente
¿Podría agregar una explicación cuando tenga la oportunidad?
Shaggy
@ Shaggy: Gracias por recordármelo :)
Emigna
2

Gol> <> , 21 bytes

:QoaonC|P\Sx*F2ssS"
0

Pruébalo en línea!

Explicación:

: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
fuente
1

Alice , 35 bytes

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

Pruébalo en línea!

Explicación

"

Al igual que en muchos quines en lenguajes 2D, esto comienza con una "envoltura y empuja toda la primera línea, excepto la "propia.

d3a*h-&;

Agregar una o más copias adicionales del código fuente colocará algunos espacios implícitos al final del literal de cadena. Para que esto sea realmente una quine, truncamos la pila a 31 caracteres.

addd

Empuje una nueva línea, luego la altura de la pila tres veces. Los valores introducidos como altura de la pila son 32 (el espacio en la segunda línea), 33 (el !en la segunda línea) y 34 (el inicial ").

d

Empuje la altura de la pila nuevamente, esta vez como la longitud del código fuente original (35).

1

Inicialice un contador en 1. Esto contará la cantidad de veces que se repite el código fuente.

2h&}

Gire a la derecha tres veces en su lugar (es decir, gire a la izquierda). Cada repetición adicional del código fuente contribuirá con una hen la misma columna que esta }, incrementando así el contador. Cuando la IP regrese a la }, gire nuevamente a la derecha para continuar en la misma dirección.

Uh

Tome un número aleatorio uniforme de 0 a n-1, luego agregue 1 para obtener el número de veces para generar la fuente original.

*t&w

Multiplique por la altura de la pila previamente empujada (longitud del código), luego repita lo siguiente tantas veces presionando una dirección de retorno tantas veces menos uno.

.o

Salida de la parte superior de la pila sin destruirlo.

dt,

Mueva la entrada de la pila inferior a la parte superior.

k@

Repita, luego termine después de que el ciclo haya terminado.

Nitrodon
fuente
1

JavaScript (Node.js) , 62 bytes

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

Pruébalo en línea!

l4m2
fuente
1
O soy muy desafortunado, o esto no puede imprimir más de dos copias del código fuente original.
Nitrodon
@Nitrodon Gracias, arreglado
l4m2
1

Carbón , 58 bytes

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

Pruébalo en línea! No hay una versión detallada porque el desverbosificador se ahoga actualmente "´". Basado principalmente en la quine de carbón vegetal de Golf, ¡una quine para un gran bien! . Explicación:

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

Asigne la cadena literal θ⎚×⊕‽L⊞Oυω⁺⪫⁺´≔θ´´θa θ.

Borre cualquier salida anterior, de modo que solo la última salida surta efecto.

×⊕‽L⊞Oυω

Empuje la cadena vacía a la matriz predefinida. Esto hace que la longitud de la matriz sea igual al número de repeticiones procesadas hasta ahora, así que tome su longitud, tome un número aleatorio como el rango exclusivo implícito, agregue 1 y repita la siguiente cadena muchas veces.

⁺⪫⁺´≔θ´´θ

Anteponga la cadena literal a θ, luego inserte ´s literales entre cada carácter, luego agregue otra copia de θ.

Neil
fuente