Dada una cadena de entrada S
, imprima S
seguido de un separador no vacío de la siguiente manera:
Paso 1:
S
tiene la1/2
posibilidad de imprimirse y la1/2
posibilidad de que el programa finalice.Paso 2:
S
tiene la2/3
posibilidad de imprimirse y la1/3
posibilidad de que el programa finalice.Paso 3:
S
tiene la3/4
posibilidad de imprimirse y la1/4
posibilidad de que el programa finalice....
Paso
n
:S
tiene lan/(n+1)
posibilidad de imprimirse y la1/(n+1)
posibilidad de que el programa finalice.
Notas
La cadena de entrada solo consistirá en caracteres que sean aceptables en el tipo de cadena de su idioma.
Se puede usar cualquier separador no vacío, siempre que sea siempre el mismo. Se espera que el separador se imprima después de la última impresión
S
antes de que finalice el programa.El programa tiene la
1/2
posibilidad de finalizar antes de imprimir cualquier cosa.Una nueva línea final es aceptable.
Su respuesta debe hacer un intento genuino de respetar las probabilidades descritas. Obviamente, cuando
n
es grande, esto será cada vez menos cierto. Una explicación adecuada de cómo se calculan las probabilidades en su respuesta (y por qué respetan las especificaciones, sin tener en cuenta los problemas de pseudoaleatoriedad y números grandes) es suficiente.
Tanteo
Este es el código de golf , por lo que gana la respuesta más corta en bytes.
Respuestas:
Pyth , 7 bytes
Pruébalo en línea!
Cómo funciona
Pseudocódigo:
fuente
C #,
9485 bytesMi primera respuesta!
Intento anterior (me gustó eso
goto
):Sin golf:
Nota: en C #, el
Random.Next(N)
método devuelve un entero no negativo en el rango [0, N-1], por lo que podemos verificar que el número devuelto sea mayor que 0.fuente
using System;
en su recuento de bytes. Se puede declararr
en línea, no hay necesidad de ajustar a una variable:new Random().Next(i++)
. No necesita el punto y coma final en la función de golf.new Random().Next(i++)
pero cuando intenté ejecutarlo, el resultado siempre fue que el programa se detiene sin imprimir nada o que el programa nunca se detiene. Cuando declaror=new Random()
y uso lar
variable, el programa se detiene más aleatoriamente cuando el OP pregunta.R,
474643 bytes43 bytes debido a Robin Ryder en los comentarios.
Pruébalo en línea!
Explicación
fuente
function(s)
es más corto ques=scan(,'');
pryr::f(while(runif(1)<T/(T<-T+1))print(s))
es aún más corto.T
yF
con funciones anónimas, ya que modifica una variable global y significa que la función solo se puede llamar una vez. Vea aquí : "la función de solución funciona de manera consistente independientemente de cuántas veces se haya llamado anteriormente".05AB1E , 8 bytes
Pruébalo en línea!
Explicación
fuente
Javascript,
605854 bytesProducirá una cadena
s
. El separador que se imprime si el programa termina esNaN
o0
.Math.random()
devuelve un valor entre 0 y 1. Si ese valor está por debajon/(n+1)
,s
se imprimirá.4 bytes guardados gracias a @Neil
fuente
n/++n
?alert
lugar deconsole.log
guardar 6 bytes, el fragmento podría configurarsealert = console.log
para mostrar una salida no molesta si lo desea (si está permitido, no guarda bytes, solo ayuda a mantener la cordura)Java 8,
726261 bytes-10 bytes gracias a @cliffroot .
-1 byte gracias a @JollyJoker .
Delimiter es una nueva línea.
Explicación:
Pruébalo aquí
fuente
if
condición dentro delfor
bloque de condiciones?for
bucle.for
ciclo debería terminar para que no sea explícitoreturn
. La segunda expresión dentro de la declaración.int n=2
y1f/n++
trabajaría?Mathematica, 43 bytes
JungHwan Min guardó 1 byte (arriba) y sugirió algo mejor (abajo)
Mathematica, 37 bytes
fuente
RandomInteger@n!=0
es lo mismo queRandomInteger@n<1
en este caso, yn++
se puede combinar conRandomInteger@n
. Además,For
es (casi siempre) más corto queWhile
: -5 bytesFor[n=1,RandomInteger@n++>0,Print@#]&
For[n=1,!n∣Hash[# n++],Print@#]&
también funcionaría a 34 bytes, suponiendo que el hash sea bastante aleatorio. Sin embargo, la aleatoriedad depende de la entrada. Por ejemplo, intente% /@ Alphabet[]
Clojure,
6156 bytesOh, ¿por qué no fui con un
for
en primer lugar? Pero en realidad para ser pedantedoseq
hay que usarlo comofor
se evalúa perezosamente.Original:
fuente
(>(+(rand-int n)2)0)
siempre es cierto?n
!> <> ,
124112 bytesPruébalo en línea! (También puede verlo en el área de juegos para peces , pero debido a algunos errores, debe agregar un
}
despuésl
en la cuarta línea y agregar un montón de nuevas líneas después del código para que funcione correctamente).La aleatoriedad es complicada en> <>. La única instrucción aleatoria es
x
, que selecciona la dirección del pez al azar entre cuatro opciones (izquierda, derecha, arriba y abajo), por lo que convertir eso en algo con probabilidad 1 / n no es sencillo.La forma en que lo hace este código es usando las capacidades de auto-modificación de> <> para construir una Torre de Aleatoriedad debajo del código, por lo que en la cuarta etapa, por ejemplo, el código se ve así:
El pez comienza en la parte inferior de la torre. En cada nivel de la torre,
x
está atrapado entre dos espejos, por lo que los peces solo pueden escapar yendo hacia la izquierda o hacia la derecha. Cualquiera de estas direcciones envía al pez al siguiente nivel de la torre, pero ir a la izquierda también empuja0
a la pila. Para cuando el pez llega a la cima de la torre, la pila contiene algún número de0
s, y este número sigue una distribución binomial con n intentos y p = 1/2.Si la longitud de la pila es 0 (que tiene una probabilidad de 1/2 n ), el programa se detiene. Si la longitud es 1 (con probabilidad n / 2 n ), el pez imprime la entrada y una nueva línea y construye otro nivel de la torre. Si la longitud es otra cosa, el pez descarta la pila y vuelve al fondo de la torre. De hecho, de las posibilidades que realmente hacen algo, n de ellas imprimen la cadena de entrada y una de ellas detiene el programa, dando las probabilidades requeridas.
fuente
Python 3 ,
726966 bytesPruébalo en línea!
fuente
random()<1/i
.randint
es inclusivo Entonces podría acortar esa línea awhile randint(0,i):print(s);i+=1
QBIC ,
1917 bytesCaída
=1
, cambio de condicionales, guardado 2 bytesExplicación
fuente
Braingolf , 23 bytes
Pruébalo en línea!
Genera un número aleatorio
x
donde0 <= x < n+1
, termina six
es 0, de lo contrario aumentan
y repite. El separador es|
Explicación:
fuente
Alice , 18 bytes
Pruébalo en línea!
Explicación
fuente
PHP , 31 bytes
Pruébalo en línea!
fuente
Perl, 26 bytes
Código de 24 bytes + 2 para
-nl
.Pruébalo en línea!
fuente
Carbón , 14 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Usos
_
como separador. Nota: el almacenamiento en caché de salida está desactivado, ¡así que no martillee el servidor de Dennis!fuente
MATL , 9 bytes
Pruébalo en línea!
Explicación
fuente
Perl 6 ,
50 41 38 3626 bytesIntentalo
Intentalo
Intentalo
Intentalo
(con
-n
argumento de línea de comandos)Intentalo
fuente
Python 3 , 55 bytes
Explicación
Para ahorrar tener que importar al azar, he explotado el hecho de que el hash incorporado se siembra aleatoriamente cada vez que se activa un proceso de Python (al menos en MacOS). Cada hash del último hash debería generar una serie de enteros pseudoaleatorios.
Si el hash es lo suficientemente seudoaleatorio, el módulo con
i
es cero con probabilidad1/i
.Notas
Me molesta un poco el hash redundante, pero sin una asignación temporal o en condiciones en Python, estoy un poco atascado.
fuente
I'm a little bothered...
recursividad?DO#
Esta es la misma longitud que la respuesta superior de C #, pero:
Solo quería señalar que algunas matemáticas pueden producir la probabilidad correcta.
Es equivalente a
Y la función f (x) = 1 / x-1 es:
f (1) = 0
f (1/2) = 1
f (1/3) = 2
f (1/4) = 3
Entonces, 1/2 oportunidad de ser redondeado a 0, 1/6 una oportunidad de ser redondeado a 1 y 1 / (n + 1) (n + 2) una probabilidad de ser redondeado a n.
Quizás algún otro idioma podría capitalizar esto.
EDITAR: solucionó mi error
Pensé en algo para hacerlo más pequeño.
EDITAR EDITAR: Estoy equivocado. Extrajo al azar del ciclo porque si se evalúa varias veces, no funcionará.
EDITAR EDITAR EDITAR: me deshice de la variable i. Voy a dejar de intentar reducirlo ahora. No, mintió. Se deshizo de otro byte.
fuente
Carbón de leña , 17 bytes
Pruébalo en línea! Código detallado incluido. Respeta las especificaciones porque usa un rango aleatorio de
0
an
.fuente
C, 41 bytes
Asume que
rand
está sembrado. Pruébalo en línea!fuente
rand
está sembrado". - ¿Es una suposición válida?rand
el estándar requiere que tenga un valor semilla fijo de 1 por defecto y todas las implementaciones que conozco hacen exactamente eso. Si esta función solo hace lo que el desafío pide cuando se combina con otro código, creo que se debe incluir otro código en la respuesta y en el recuento de bytes.braingasm , 22 bytes
editar: Mismo recuento de bytes, pero me di cuenta de que podía colarse en la nueva
L
función de imitación de cinta .Usos
0
como separador. Funciona así:fuente
Python , 54 bytes
Pruébalo en línea!
Genera el número de copias como
floor(1/p)-1
conp
uniformemente elegido del intervalo de la unidad. El número de copias esn
cuando1/p-1
cae entren
yn+1
, que sucede cuando1/(n+2) < p < 1/(n+1)
. Esto sucede con probabilidad1/(n+1)-1/(n+2)
o1/((n+1)*(n+2)
. Esta es la probabilidad deseada de generarn
copias:1/2
prob de 0,1/6
prob de 1,1/12
prob de 2, ...fuente
form random import*
en la parte inferior?f=
y colocarlo en el encabezado TIOC ++,
979657 bytesAquí mi primer intento en codegolf :)
Ahorré un byte usando
for
Se guardaron 39 bytes ya que nadie parece contar los incluye
sin golf
fuente
F #, 161 bytes
Definitivamente no es el mejor lenguaje para el golf, pero decidí probarlo (además, no sé nada sobre F #, por lo que cualquier consejo sobre cómo mejorar mi respuesta será bienvenido).
Ejecutar con:
Escribe una nueva línea como separador.
fuente
Rubí , 29 + 1 = 30 bytes
Usa la
-n
bandera.Pruébalo en línea!
fuente
puts$_
conprint
, pero no está claro que las reglas son compatibles.JS (ES6), 47 bytes
A diferencia de la otra respuesta de ES6, esta utiliza un bucle for y bombas de alerta en lugar de recurrencia. El separador que se imprime cuando se detiene el programa no está definido.
fuente
PowerShell, 31 bytes
Get-Random $i
genera unn
where0 <= n < $i
, el separador es una nueva línea implícita.fuente
Python, 75 bytes
La otra respuesta de Python es más corta, pero quería probarla de otra manera:
fuente