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.
Ejemplo
Supongamos que su fuente inicial es XYZ
y 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).
XYZXYZ
Para : debería generar con una probabilidad de (66.666% del tiempo) y con una probabilidad de (33.333% de el tiempo)
XYZXYZXYZ
Para : debería generar con una probabilidad de (75% del tiempo) y con una probabilidad de (25% de el tiempo)
XYZXYZXYZXYZ
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 .
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 código de golf , 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 .
fuente
Respuestas:
R ,
6635 bytes-29 bytes gracias a digEmAll .
-2 bytes gracias a Giuseppe .
Pruébalo en línea!
Verifique la distribución para N = 4.
La clave es la asignación hacia la derechanorte veces, se asignarán las primeras norte- 1 llamadas
->
. Cuando el código se multiplicasample
aA
, y solo se imprimirá la última llamada.Solución original, más complicada:
R , 66 bytes
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 variablesT
yTT
, con un código que comienza conT
y termina con?T
.F
es el contador de iteraciones.?
se redefine como una función que toma un argumento booleano: si la entrada de?
esTRUE
(oT
), realiza el muestreo aleatorio requerido; si la entrada esFALSE
(o0
), no hace nada. El valor deTT
se define como0
, de modo que?T
realiza el muestreo pero?TT
no hace nada.Cuando se repite la fuente, se ve así:
entonces la llamada intermedia
?TT
no genera nada más que la llamada final?T
emite el resultado aleatorio.fuente
->
utilizado en el golf de código en una situación en la<-
que no podría ser; ¡¡Esto es genial!!Python 3 ,
8179 bytesPrué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.
fuente
+0 if[]else 1
Bash , 31 bytes
Pruébalo en línea!
trap ... 0
ejecutará el código contenido en la salida. Los repetidostrap
sobrescribirán los antiguos. Lo no citado$[arithmetic expansion]
se ejecuta cada vez que se establece una nueva trampa.Zsh puede guardar un byte con
<<<
:fuente
Jalea , 7 bytes
Pruébalo en línea!
fuente
05AB1E , 7 bytes
Pruébalo en línea!
fuente
Python 3 ,
787675 bytesUsando el mismo truco que en el enlace que se publicó, aquí hay uno de Python (con x = 1).
Pruébalo en línea!
-2 bytes gracias al Sr. Xcoder por su
(n-1)
fórmula con la~-n
que tiene mayor prioridad que*
-1 byte gracias a Nishioka
fuente
import random;n=len(*open(__file__))//76;print(1+~-n*(random.random()<1/n))#
debería funcionar para -2 bytesrandom()<1/n
;-)Dyalog APL,
2524232221 bytesPruébalo en línea!
fuente
Gaia ,
17151413 bytesPruébalo en línea!
Al azar, noté el comportamiento de
Øg
ayer cuando revisé los documentos, lo que me ayudó enormemente.fuente
Perl 5,
2826 bytes-2 bytes gracias a @Grimy
TIO
fuente
1 if!++$x;say 1<rand$x||$x
Rubí , 40 bytes.
Pruébalo en línea!
¡Pruébelo en línea (copiado 3 veces)!
Un puerto rubí de esta respuesta de Python .
Rubí , 38 bytes.
2 bytes guardados al leer el archivo:
Pruébalo en línea!
fuente
Encantamientos rúnicos , 31 bytes
Pruébalo en línea!
Utiliza la misma estructura que esta respuesta para contar cuántas veces se ha duplicado la fuente:
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.
fuente
Japt ,
98 bytesProbarlo | Duplicado | Distribución de verificación triplicada
de 10000 carreras después de 10 repeticiones
Original,
1311109 bytesTenga en cuenta el espacio final.
Probarlo | Duplicado | Distribución de verificación triplicada
de 10000 carreras después de 10 repeticiones
fuente
JavaScript ( JavaScript shell 71 ), 78 bytes
Sin tio link, spidermonkey en tio es demasiado viejo ...
Firefox (Spidermonkey) considera el comentario como parte de la función
f
. Como resultado,(''+f).length
seráb+79n
donde 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í).
fuente
(async x=>x)()
? ¿Por qué es asíncrono?async
honesto. Por lo tanto, la devolución de llamadax=>f(...)
se invocará después def
definir la función .C # (compilador interactivo de Visual C #) ,
133114112 bytesEsta es la primera (y con suerte la última) vez que uso directivas de preprocesador de C #.
Pruébalo en línea!
fuente
Carbón de leña , 12 bytes
Pruébalo en línea! Basado en mi respuesta a la pregunta vinculada. Salidas
n
con probabilidad¹/ₙ
, de lo contrario1
. Explicación:fuente