Multiplico la fuente, ¡tú (probablemente) multiplicas la salida!

18

Tarea

La tarea es escribir un programa que genere un entero positivo consistente pero arbitrario (por lo tanto estrictamente mayor que 0). Aquí está el truco: cuando la fuente se repite veces (el código se agrega / concatena consigo mismo), el programa debe tener una probabilidad de generar y la probabilidad restante de de generar sin cambios.xNN11NNXN1norteX

Ejemplo

Supongamos que su fuente inicial es XYZy produce el entero 3. Luego:

  • Para : debería generar con una probabilidad de (50% del tiempo) y con una probabilidad de también (50 % del tiempo).norte=2XYZXYZ31223=6 612

  • Para : debería generar con una probabilidad de (66.666% del tiempo) y con una probabilidad de (33.333% de el tiempo)norte=3XYZXYZXYZ32333=913

  • Para : debería generar con una probabilidad de (75% del tiempo) y con una probabilidad de (25% de el tiempo)norte=4 4XYZXYZXYZXYZ334 443=1214 4

y así....

Reglas

  • Debes construir un programa completo . La salida debe imprimirse en STDOUT.

  • Su programa, en teoría, debería generar cada valor posible con las probabilidades indicadas anteriormente, pero una ligera desviación de esto debido a la implementación de aleatorio está bien ( siempre que la implementación no sea de una distribución diferente; no puede usar un distribución normal para guardar bytes ) .

  • El programa debería (nuevamente, en teoría) trabajar para un valor arbitrariamente grande de , pero las limitaciones técnicas debido a la precisión están bien para grande .nortenorte

  • La salida debe estar en base 10 (la salida en cualquier otra base o con notación científica está prohibida). Se permiten espacios finales / iniciales y ceros iniciales.

  • La fuente inicial debe (por supuesto) tener al menos 1 byte de longitud. Es posible que no asumirá una nueva línea entre las copias de su fuente. El programa no debe tomar entrada (o tener una entrada vacía no utilizada).

  • Este es el , por lo que la puntuación de una respuesta es la longitud de la fuente (original) en bytes, siendo mejor una puntuación más baja.

Nota: Este desafío es una versión (mucho) más difícil de esta .

Sr. Xcoder
fuente
¿Puede el programa leer su código fuente?
mi pronombre es monicareinstate el
3
@ alguien Sí, está permitido.
Sr. Xcoder

Respuestas:

16

R , 66 35 bytes

-29 bytes gracias a digEmAll .

-2 bytes gracias a Giuseppe .

+0->A
x=!0:F
F=F+1
sample(F*x+!x,1)

Pruébalo en línea!

Verifique la distribución para N = 4.

La clave es la asignación hacia la derecha ->. Cuando el código se multiplica norte veces, se asignarán las primeras norte-1 llamadas samplea A, y solo se imprimirá la última llamada.

Solución original, más complicada:

R , 66 bytes

T->TT
F=F+1
TT=0
`?`=function(x)if(x)sample(c(1,F),1,,c(1,F-1))
?T

Pruébalo en línea!

¡Pruébelo en línea (repetido 3 veces)!

Utiliza dos trucos: 1) llamar a la función principal de interés ?, para que podamos llamarla sin terminar el programa con un paréntesis, y 2) usar variables Ty TT, con un código que comienza con Ty termina con ?T.

Fes el contador de iteraciones. ?se redefine como una función que toma un argumento booleano: si la entrada de ?es TRUE(o T), realiza el muestreo aleatorio requerido; si la entrada es FALSE(o 0), no hace nada. El valor de TTse define como 0, de modo que ?Trealiza el muestreo pero ?TTno hace nada.

Cuando se repite la fuente, se ve así:

T->TT
F=F+1
TT=0
`?`=function(x)if(x)sample(c(1,F),1,,c(1,F-1))
?TT->TT
F=F+1
TT=0
`?`=function(x)if(x)sample(c(1,F),1,,c(1,F-1))
?T

entonces la llamada intermedia ?TTno genera nada más que la llamada final ?Temite el resultado aleatorio.

Robin Ryder
fuente
55
No creo que haya visto alguna vez ->utilizado en el golf de código en una situación en la <-que no podría ser; ¡¡Esto es genial!!
Giuseppe
PD: Voy a dar una recompensa a esto en algún momento.
Giuseppe
2
Absolutamente increíble!
digEmAll
@digEmAll Mucho más ordenado, ¡gracias!
Robin Ryder
11

Python 3 , 81 79 bytes

+0if[]else 1
from random import*
try:n+=1
except:n=1
print([1,n][random()*n<1])

Pruébalo en línea!

-1 byte gracias a @Nishioka

Esta es una solución de Python 3 que no accede directamente a la fuente del programa. Hacer esto en Python 3 es más desafiante que Python 2 porque las declaraciones de impresión normales terminan con un paréntesis de cierre, por lo que no hay muchas opciones para cambiar su comportamiento en el siguiente bloque de la fuente inicial. Sería interesante ver soluciones más creativas en Python 3.

Joel
fuente
-1 byte:+0 if[]else 1
Nishioka
@Nishioka Gracias. Actualizado.
Joel
11

Bash , 31 bytes

trap echo\ $[RANDOM%++n?1:n] 0;

Pruébalo en línea!

trap ... 0ejecutará el código contenido en la salida. Los repetidos trapsobrescribirán los antiguos. Lo no citado $[arithmetic expansion]se ejecuta cada vez que se establece una nueva trampa.


Zsh puede guardar un byte con <<<:

trap "<<<$[RANDOM%++n?1:n]" 0;
Función Gamma
fuente
4

Python 3 , 78 76 75 bytes

Usando el mismo truco que en el enlace que se publicó, aquí hay uno de Python (con x = 1).

from random import*;n=len(*open(__file__))//75;print(1+~-n*(random()<1/n))#

Pruébalo en línea!

-2 bytes gracias al Sr. Xcoder por su (n-1)fórmula con la ~-nque tiene mayor prioridad que *
-1 byte gracias a Nishioka

Pâris Douady
fuente
1
¡Me parece bien! import random;n=len(*open(__file__))//76;print(1+~-n*(random.random()<1/n))#debería funcionar para -2 bytes
Mr. Xcoder
1
¡Nunca había visto esta forma de hacer n-1! Me gusta, gracias :)
Pâris Douady
1
-1 byte: tio.run/##K6gsycjPM/7/…
Nishioka
Otro -1 byte pero con un enfoque un poco diferente: tio.run/##K6gsycjPM/7/…
Nishioka
sí, lo hago por el random()<1/n;-)
Pâris Douady
3

Gaia , 17 15 14 13 bytes

Øgl13÷:(1w&+ṛ

Pruébalo en línea!

Al azar, noté el comportamiento de Øgayer cuando revisé los documentos, lo que me ayudó enormemente.

Giuseppe
fuente
3

Perl 5, 28 26 bytes

-2 bytes gracias a @Grimy

1 if!++$x;say 1<rand$x||$x

TIO

Nahuel Fouilleul
fuente
26:1 if!++$x;say 1<rand$x||$x
Grimmy
gracias, buena variación
Nahuel Fouilleul
2

Encantamientos rúnicos , 31 bytes

UwR'10<;$\
I+:'RA0)?/1$;
1
l;
y

Pruébalo en línea!

Utiliza la misma estructura que esta respuesta para contar cuántas veces se ha duplicado la fuente:

Flujo de ejecución

En lugar de generar el enésimo número en una lista, usamos ese valor para generar un número al azar, si el resultado no es 0, imprime 1, de lo contrario imprime ese número.

Draco18s ya no confía en SE
fuente
2

Japt , 9 8 bytes

(°Tö)ΪT

Probarlo | Duplicado | Distribución de verificación triplicada
de 10000 carreras después de 10 repeticiones

(°Tö)ΪT
(            :Prevent the operator that follows from being implicitly applied to the first input variable, U
 °T          :Increment T (initially 0) by 1
   ö         :Random element in the range [0,T)
    )        :Closing the parentheses here instead of after the T saves a byte as there would need to be a space here to close the random method
     Î       :Sign - 0 (falsey) or 1 (truthy)
      ªT     :Logical OR with current value of T

Original, 13 11 10 9 bytes

Tenga en cuenta el espacio final.

NoÎp°T ö 

Probarlo | Duplicado | Distribución de verificación triplicada
de 10000 carreras después de 10 repeticiones

NoÎp°T ö 
N             :Initially, the (empty) array of inputs
 o            :Replace the last element with
  Î           :  Its sign (always 1)
   p          :Push
    °T        :  T (initially 0) incremented
       ö      :Random element of N
Lanudo
fuente
2

JavaScript ( JavaScript shell 71 ), 78 bytes

(async x=>x)().then(x=>f((''+f).length/78));f=x=>print(1-~x*Math.random()|0)//

Sin tio link, spidermonkey en tio es demasiado viejo ...

Firefox (Spidermonkey) considera el comentario como parte de la función f. Como resultado, (''+f).lengthserá b+79ndonde b <78, y (n + 1) es el tiempo del código fuente repetido.

Este error (? No estoy seguro. Preferiría que sea un error de la especificación de JavaScript en lugar de cualquier intérprete ) fue enviado a BMO por otra persona justo después de esta respuesta publicada: https://bugzilla.mozilla.org/ show_bug.cgi? id = 1579792 . (Ni el hilo de bmo ni el tweet son publicados por mí).

tsh
fuente
¿Qué pasa con el (async x=>x)()? ¿Por qué es asíncrono?
Tomáš Zato - Restablece a Mónica el
@ TomášZato Es literalmente asynchonesto. Por lo tanto, la devolución de llamada x=>f(...)se invocará después de fdefinir la función .
tsh
1

Carbón de leña , 12 bytes

⎚I⎇‽L⊞Oυω¹Lυ

Pruébalo en línea! Basado en mi respuesta a la pregunta vinculada. Salidas ncon probabilidad ¹/ₙ, de lo contrario 1. Explicación:

⎚               Remove output from previous iterations
       υ        Initially empty list
        ω       Empty string
     ⊞O         Push
    L           Length
   ‽            Random integer [0..length)
  ⎇             Ternary
         ¹      If nonzero then literal 1
          Lυ    If zero then the new length
 I              Cast to string for implicit print
Neil
fuente