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 .


¿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.


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.


-1 byte:+0 if[]else 1
Nishioka

@Nishioka Gracias. Actualizado.
Joel




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


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


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






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

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í).


¿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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.