Incertidumbre en la línea de tiempo de un día

12

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 8y se 9está 8 min 59 secconvirtiendo 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/27posibilidad de que estuvieras dormitando en 0/27cualquier 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-bcon 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 cadena 0/27 0/27 0/27 24/27 3/27
  • myfunc(1, "8 15-17 2 3-5 6-8") devuelve la cadena 27/27 0/27 0/27 0/27 0/27
  • myfunc(38, "8 15-17 2 3-5 6-8") devuelve la cadena 0/10 0/10 0/10 0/10 10/10
  • myfunc(40, "8 15-17 2 3-5 6-8") devuelve la cadena 0/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.

Pasatiempos de Calvin
fuente
La pregunta no especifica una distribución de probabilidad particular para el tiempo dedicado a cada tarea. ¿Debería distribuirse normalmente? ¿Puedo asumir cualquier distribución que quiera?
fiesta
1
@ Calvin que no es una distribución normal. ¿Quizás quisiste tener una distribución uniforme?
feersum
¿Cada tarea incluye la izquierda |, la derecha |o la mitad de cada una?
Peter Taylor
Todos los problemas mencionados resueltos en cuestión. ¿Algún otro problema?
Aficiones de Calvin
1
¿Qué sucede si existe la posibilidad de que no haya ninguna tarea?
orgulloso Haskeller

Respuestas:

3

CJam, 124115100 92 89 bytes

Esto se puede jugar mucho, pero tengo que dormir, así que publica ahora mismo :)

l~\:N;S/{'-/2*2<~i),\i>}%_{m*{(\+}%}*{[0\{1$+}*]}%:B;,,{0B{I>2<~N<!\N<*+}/}fI]_:+m*'/f*S*

Pruébalo en línea aquí

La entrada es como:

29 "8 15-17 2 3-5 6-8"

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:

0/27 0/27 0/27 24/27 3/27
Optimizador
fuente
Aceptaré esto si puedes hacer que siga las reglas actualizadas.
Hobbies de Calvin
Todos los otros ejemplos dan 0/27's.
Hobbies de Calvin
Ahora es un montón de `0 / 0's.
Hobbies de Calvin
@ Calvin'sHobbies Vamos a llevarlo al chat: chat.stackexchange.com/rooms/18161/…
Optimizer
No importa, lo siento, solo estaba dando la entrada equivocada.
Hobbies de Calvin
3

Mathematica, 237 216 bytes

Estoy seguro de que puedo acortar esto un poco, pero no ahora. ¡Al menos finalmente pude usar las nuevas asociaciones de Mathematica 10! :)

f=(j=#;s=StringSplit;r=ToString;t=Lookup[Counts@Flatten[FirstPosition[#,n_/;n>=j]&/@Accumulate/@Tuples@i],#,0]&/@Range@Length[i=ToExpression[#~s~"-"&/@s@#2]/.{a_,b_}:>a~Range~b];Riffle[r@#<>"/"<>r@Tr@t&/@t," "]<>"")&

Sin golf:

    f = (
   j = #;
   s = StringSplit;
   r = ToString;
   t = Lookup[
       Counts@Flatten[
         FirstPosition[#, n_ /; n >= j] & /@ 
          Accumulate /@ Tuples@i], #, 0] & /@ 
     Range@Length[
       i = ToExpression[#~s~"-" & /@ s@#2] /. {a_, b_} :> a~Range~b];
   Riffle[r@# <> "/" <> r@Tr@t & /@ t, " "] <> "") &

Uso como se especifica en el desafío:

f[29, "8 15-17 2 3-5 6-8"]

Devuelve 0/1para todos los elementos si la primera entrada es mayor que el lapso de tiempo máximo.

Martin Ender
fuente
Creo que Cases[]no es necesario dado cómo Tuplesfunciona. Si es así, entonces t = Lookup[Counts[Join @@(FirstPosition[#, n_ /; n >= j] & /@ Accumulate /@ Tuples@i)], #, 0].
DavidC
Lookupy Countsson bienvenidos adiciones al idioma.
DavidC
@DavidCarraher Gracias, pero tuve que cambiar a Flatten(en lugar de Join@@) porque FirstPositionahora puedo regresar Missing[NotFound]que no se puede unir.
Martin Ender
1

Haskell, 232

f=(\(a,b)->[a..fst$head$reads(tail$b++" ")++[(a,b)]]).head.reads
n%l=(tail>>=zipWith(-))(0:map(\i->drop i&l*e[x|x<-map sum$mapM f$take i$w l,x>=n])[1..e$w l])>>=(++'/':show(id&l)++" ").show
(&)i=product.map(e.f).i.w
w=words
e=length

corre así:

*Main> putStrLn $ 1 % "8 15-17 2 3-5 6-8"
27/27 0/27 0/27 0/27 0/27 
orgulloso Haskeller
fuente
1

APL, 162

{{⍵,'/',y}¨⌊|-2-/0,(y←+/,⍺≤⊃⌽x)×1,⍨¯1↓⍺{+/÷∘⍴⍨⍺≤,⍵}¨x←∘.+\{⊃{⍺,⍺↓⍳⍵}/⍎('-'⎕R' ')⍵}¨('\S+'⎕S'\0')⍵}

Ejecuciones de ejemplo

      f←{{⍵,'/',y}¨⌊|-2-/0,(y←+/,⍺≤⊃⌽x)×1,⍨¯1↓⍺{+/÷∘⍴⍨⍺≤,⍵}¨x←∘.+\{⊃{⍺,⍺↓⍳⍵}/⍎('-'⎕R' ')⍵}¨('\S+'⎕S'\0')⍵}
      29 f '8 15-17 2 3-5 6-8'
 0 / 27  0 / 27  0 / 27  24 / 27  3 / 27 

      1 f '8 15-17 2 3-5 6-8'
 27 / 27  0 / 27  0 / 27  0 / 27  0 / 27 

      38 f '8 15-17 2 3-5 6-8'
 0 / 10  0 / 10  0 / 10  0 / 10  10 / 10 

      40 f '8 15-17 2 3-5 6-8'
 0 / 1  0 / 1  0 / 1  0 / 1  1 / 1

Espero que no te importe el espacio extraño

TwiNight
fuente
Esto es solo 98 bytes. APL tiene su propia página de códigos de tal manera que todos sus símbolos encajan en el rango ASCII.
Optimizador