Antecedentes
Tengo una colección de "calcetines entre semana", que son siete pares de calcetines etiquetados por los días de la semana. Cuando lavo mis calcetines, terminan en una pila, y debo organizarlos en los pares correctos antes de ponerlos en el armario. Mi estrategia es sacar un calcetín al azar de la pila a la vez y ponerlo en un cajón. Cada vez que hay un par de calcetines a juego en el cajón, los ato y los guardo en el armario. Su tarea es simular este proceso aleatorio y devolver el número de sorteos necesarios para encontrar el primer par coincidente.
Entrada
Su entrada es un entero N ≥ 1 . Representa el "número de días en una semana": hay N pares de calcetines en la pila, y cada par tiene una etiqueta distinta. Si es necesario, también puede tomar una semilla PRNG como entrada.
Salida
Su salida es la cantidad de calcetines que tengo que dibujar antes de encontrar el primer par coincidente. Por ejemplo, si los dos primeros calcetines ya forman un par coincidente, la salida es 2
.
Por supuesto, la salida es aleatoria y depende del orden de dibujo. Suponemos que todas las órdenes de dibujo son igualmente probables , de modo que cada vez que se dibuja un calcetín, la elección es uniforme e independiente de todas las demás opciones.
Ejemplo
Deje N = 3 , para que tengamos 6 calcetines en total, etiquetados como AABBCC . Una posible ejecución del "protocolo de dibujo de calcetines" es la siguiente:
| Pile | Drawer | Pairs
Begin | AABBCC | - | -
Draw B | AABCC | B | -
Draw C | AABC | BC | -
Draw B | AAC | C | BB
Draw A | AC | AC | BB
Draw A | C | C | AA BB
Draw C | - | - | AA BB CC
El primer par coincidente se encontró después de dibujar el segundo B , que fue el tercer calcetín que se dibujó, por lo que la salida correcta es 3
.
Reglas y puntaje
Puede escribir un programa completo o una función. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten. La entrada y la salida pueden estar en cualquier formato razonable, incluido unario (cadena de 1
s).
Puede suponer que el RNG incorporado en su idioma es perfecto. No tiene que simular realmente el protocolo de dibujo de calcetines, siempre que sus salidas tengan la distribución de probabilidad correcta.
"Casos de prueba"
Estas son las probabilidades aproximadas de todas las salidas para la entrada N = 7 :
Output 2 3 4 5 6 7 8
Probability 0.077 0.154 0.210 0.224 0.186 0.112 0.037
Para probar su solución, puede ejecutarla, por ejemplo, 40 000 veces y ver si la distribución de salida está razonablemente cerca de esto.
Draw all socks. End up with an odd number.
Respuestas:
Jalea , 8 bytes
Pruébalo en línea! o verificar la distribución para N = 7 .
Antecedentes
Sea n el número de pares; Hay 2n calcetines individuales.
Para el primer sorteo, hay 2n calcetines y 0 de ellos darían como resultado un par coincidente. Por lo tanto, la probabilidad de éxito es 0 / 2n = 0 .
Como el primer sorteo no fue exitoso, hay 2n - 1 calcetines en la pila y 1 de ellos resultaría en un par coincidente. Por lo tanto, la probabilidad de éxito es 1 / (2n - 1) .
Si el segundo sorteo no tuvo éxito, hay 2n - 2 calcetines en la pila y 2 de ellos darían como resultado un par coincidente. Por lo tanto, la probabilidad de éxito es 2 / (2n - 2) .
En general, si los primeros k sorteos no tuvieron éxito, hay 2n - k calcetines en la pila y 2 de ellos darían como resultado un par coincidente. Por lo tanto, la probabilidad de éxito es k / (2n - k) .
Finalmente, si ninguno de los primeros n sorteos fue exitoso, hay 2n - k calcetines en la pila y todos darían como resultado un par coincidente. Por lo tanto, la probabilidad de éxito es n / (2n - n) = 1 .
Cómo funciona
fuente
Jalea, 8 bytes
Pruébalo en línea!
Para verificar, aquí hay una versión que muestra tanto el resultado deseado como el resultado de la operación de "lista aleatoria" (para ver en qué orden se dibujaron los calcetines).
fuente
Python, 66 bytes
Dennis pensó en una forma inteligente de reorganizar las cosas, ahorrando 5 bytes.
fuente
MATL ,
1615 bytesPruébalo en línea! O observe la distribución empírica para 1000 muestras en el caso N = 7 (lleva un tiempo).
Esto genera directamente la variable aleatoria que representa el resultado, en función de su distribución de probabilidad. Sea N el número de pares de calcetines, y sea que p ( k ) denote la probabilidad de que el k -ésimo sorteo sea exitoso, condicionado al hecho de que el k -ésimo sorteo no fue exitoso. Entonces (ver también aquí ):
Entonces el código itera para un máximo de N +1 sorteos. En el sorteo k se genera una variable aleatoria que equivale a 1 con probabilidad ( k -1) / (2 * N - k ), o 0 en caso contrario. Siempre que la variable aleatoria sea igual a 1 (el sorteo ha sido exitoso), el proceso se detiene y se genera la k actual .
fuente
MATL ,
1413 bytesPruébalo en línea! O observe la distribución empírica para 4000 muestras en el caso N = 7 (lleva un tiempo).
fuente
JavaScript,
7773 bytesExplicación
fuente
f=(n)=>
porn=>
(o dos, si desea conservar la asignación, algunos la conservan , otros la eliminan ).CJam, 17 bytes
Pruébalo aquí.
fuente
Python 3,
142105104 bytes¡Gracias a Eʀɪᴋ ᴛʜᴇ Gᴏʟғᴇʀ por guardar un byte!
Mi primera respuesta
Mi nueva respuesta:
Ambos salen con un
NameError
encendidos
.fuente
R, 49
¡Estoy seguro de que debe haber una mejor manera de hacer esto en R! Intenté hacer algo más inteligente pero no funcionó.
Editar: Mejorado por @bouncyball ya que no tiene que ser una función.
fuente
function(N)
? usarN=scan();
ahorraría 2 bytesPython 2, 101 bytes
fuente
VBA, 61 bytes
- modela la probabilidad de cambio de calcetín dada la falla previa de coincidencia. En el punto de evaluación, K es "calcetines en la mano", por lo que el número de sorteo es uno más.
fuente
Pyth, 14 bytes
Explicación:
fuente