Suponga que su alarma lo despierta una mañana, pero se queda dormido para poder dormir 8 minutos más. Cuando suena de nuevo, te levantas a regañadientes y te duchas, lo que estimas que toma de 15 a 17 minutos. Luego se cepilla los dientes durante exactamente 2 minutos y se viste, lo que demora de 3 a 5 minutos. Finalmente, comes un desayuno apresurado en 6 a 8 minutos y sales corriendo por la puerta.
Podemos denotar esta secuencia de tiempo como 8 15-17 2 3-5 6-8
.
Dada la incertidumbre de la rutina de su mañana, ¿cuál es la probabilidad de que estuviera haciendo cada tarea en un número particular de minutos desde que se despertó por primera vez?
Suponiendo que cada tarea lleva una cantidad completa de minutos, podemos trazar cada combinación posible de períodos de tiempo inciertos (por ejemplo, 3, 4 y 5 minutos para cepillarse los dientes). Este gráfico muestra las 27 posibilidades, con el tiempo aumentando a la derecha, y cada tarea de N minutos representada por (N - 1) guiones y una barra vertical, solo para marcar su finalización. Los límites de minutos se producen entre los caracteres, por lo que el espacio entre la columna 8
y se 9
está 8 min 59 sec
convirtiendo en 9 min
.
1111111111222222222233333333334
1234567890123456789012345678901234567890 <-- Minute
-------|--------------|-|--|-----|
-------|--------------|-|--|------|
-------|--------------|-|--|-------|
-------|--------------|-|---|-----|
-------|--------------|-|---|------|
-------|--------------|-|---|-------|
-------|--------------|-|----|-----|
-------|--------------|-|----|------|
-------|--------------|-|----|-------|
-------|---------------|-|--|-----|
-------|---------------|-|--|------|
-------|---------------|-|--|-------|
-------|---------------|-|---|-----|
-------|---------------|-|---|------|
-------|---------------|-|---|-------|
-------|---------------|-|----|-----|
-------|---------------|-|----|------|
-------|---------------|-|----|-------|
-------|----------------|-|--|-----|
-------|----------------|-|--|------|
-------|----------------|-|--|-------|
-------|----------------|-|---|-----|
-------|----------------|-|---|------|
-------|----------------|-|---|-------|
-------|----------------|-|----|-----|
-------|----------------|-|----|------|
-------|----------------|-|----|-------|
1234567891111111111222222222233333333334 <-- Minute
0123456789012345678901234567890
Está claro que la rutina podría haber tomado 40 minutos como máximo y 34 minutos como mínimo.
La pregunta es, en un minuto en particular, digamos el minuto 29, ¿cuál es la probabilidad de que estuvieras haciendo cada una de las 5 tareas? Suponga que cada período de tiempo incierto se distribuye uniformemente sobre los minutos completos exactos. Entonces, una tarea 4-7 tiene un 25% de posibilidades de tomar 4, 5, 6 o 7 minutos.
De la tabla se puede ver que en el minuto 29 hubo un ...
0/27 chance you were snoozing (task 1)
0/27 chance you were showering (task 2)
0/27 chance you were brushing (task 3)
24/27 chance you were dressing (task 4)
3/27 chance you were eating (task 5)
Del mismo modo, en el minuto 1 había una 27/27
posibilidad de que estuvieras dormitando en 0/27
cualquier otro lugar.
En el minuto 38, por ejemplo, 17 de las rutinas potenciales ya han finalizado. Entonces, en 10 de cada 10 casos estará comiendo. Esto significa que las probabilidades se ven como
0/10 task 1, 0/10 task 2, 0/10 task 3, 0/10 task 4, 10/10 task 5
Desafío
Escriba una función que tome un número entero para el valor de los minutos, y una cadena que consiste en una secuencia de números enteros o pares de números enteros a-b
con b
> a
, todos separados por espacios (al igual que 8 15-17 2 3-5 6-8
). Todos los enteros son positivos. El minuto de entrada será menor o igual al tiempo máximo posible (40 en el ejemplo).
La función debe devolver otra cadena que denote la posibilidad fraccional no reducida de estar en cada tarea en el minuto dado.
Ejemplos
myfunc(29, "8 15-17 2 3-5 6-8")
devuelve la cadena0/27 0/27 0/27 24/27 3/27
myfunc(1, "8 15-17 2 3-5 6-8")
devuelve la cadena27/27 0/27 0/27 0/27 0/27
myfunc(38, "8 15-17 2 3-5 6-8")
devuelve la cadena0/10 0/10 0/10 0/10 10/10
myfunc(40, "8 15-17 2 3-5 6-8")
devuelve la cadena0/1 0/1 0/1 0/1 1/1
Si su idioma no tiene cadenas o funciones, puede usar variables con nombre, stdin / stdout, la línea de comando o lo que parezca más apropiado.
Puntuación
Este es el código de golf. La solución más corta en bytes gana.
fuente
|
, la derecha|
o la mitad de cada una?Respuestas:
CJam, 124115100
9289 bytesEsto se puede jugar mucho, pero tengo que dormir, así que publica ahora mismo :)
Pruébalo en línea aquí
La entrada es como:
Donde el primer entero es el minuto de entrada y la segunda cadena es la secuencia del rango de tiempo (como se muestra en los ejemplos de la pregunta, solo que sin el
,
)Salida para la entrada mencionada anteriormente:
fuente
0/27
's.Mathematica,
237216 bytesEstoy seguro de que puedo acortar esto un poco, pero no ahora. ¡Al menos finalmente pude usar las nuevas asociaciones de Mathematica 10! :)
Sin golf:
Uso como se especifica en el desafío:
Devuelve
0/1
para todos los elementos si la primera entrada es mayor que el lapso de tiempo máximo.fuente
Cases[]
no es necesario dado cómoTuples
funciona. Si es así, entoncest = Lookup[Counts[Join @@(FirstPosition[#, n_ /; n >= j] & /@ Accumulate /@ Tuples@i)], #, 0]
.Lookup
yCounts
son bienvenidos adiciones al idioma.Flatten
(en lugar deJoin@@
) porqueFirstPosition
ahora puedo regresarMissing[NotFound]
que no se puede unir.Haskell, 232
corre así:
fuente
APL, 162
Ejecuciones de ejemplo
Espero que no te importe el espacio extraño
fuente