Incerteza na linha do tempo de um dia


12

Suponha que seu alarme o acorde uma manhã, mas você pressiona a soneca para poder dormir por mais 8 minutos. Quando toca de novo, você se levanta de má vontade e toma um banho, que estima levar de 15 a 17 minutos. Você então escovar os dentes por exatamente 2 minutos e se vestir, o que leva cerca de 3 a 5 minutos. Finalmente, você toma um café da manhã apressado em 6 a 8 minutos e sai correndo pela porta.

Podemos denotar essa sequência de tempo como 8 15-17 2 3-5 6-8.

Dada a incerteza da rotina da manhã, qual é a probabilidade de você executar cada tarefa em um determinado número de minutos desde que acordou?

Assumindo que cada tarefa leva um número inteiro de minutos, podemos traçar todas as combinações possíveis de intervalos de tempo incertos (por exemplo, 3, 4 e 5 minutos para escovar os dentes). Este gráfico mostra todas as 27 possibilidades, com o tempo aumentando para a direita, e cada tarefa de N minutos representada por (N - 1) traços e uma barra vertical, apenas para marcar seu final. Os limites dos minutos ocorrem entre os caracteres; portanto, o espaço entre a coluna 8e 9está se 8 min 59 sectransformando 9 min.

         1111111111222222222233333333334
1234567890123456789012345678901234567890  <-- Minute
-------|--------------|-|--|-----|
-------|--------------|-|--|------|
-------|--------------|-|--|-------|
-------|--------------|-|---|-----|
-------|--------------|-|---|------|
-------|--------------|-|---|-------|
-------|--------------|-|----|-----|
-------|--------------|-|----|------|
-------|--------------|-|----|-------|
-------|---------------|-|--|-----|
-------|---------------|-|--|------|
-------|---------------|-|--|-------|
-------|---------------|-|---|-----|
-------|---------------|-|---|------|
-------|---------------|-|---|-------|
-------|---------------|-|----|-----|
-------|---------------|-|----|------|
-------|---------------|-|----|-------|
-------|----------------|-|--|-----|
-------|----------------|-|--|------|
-------|----------------|-|--|-------|
-------|----------------|-|---|-----|
-------|----------------|-|---|------|
-------|----------------|-|---|-------|
-------|----------------|-|----|-----|
-------|----------------|-|----|------|
-------|----------------|-|----|-------|
1234567891111111111222222222233333333334  <-- Minute
         0123456789012345678901234567890

É claro que a rotina poderia levar 40 minutos no máximo e 34 minutos no mínimo.

A questão é, em um minuto específico, digamos, minuto 29, qual é a chance de você estar realizando cada uma das 5 tarefas? Suponha que cada período de tempo incerto seja uniformemente distribuído por todos os minutos exatos. Portanto, uma tarefa de 4-7 tem 25% de chance de levar 4, 5, 6 ou 7 minutos.

A partir do gráfico, pode ser visto que, no minuto 29, houve uma ...

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)

Da mesma forma, no minuto 1, havia uma 27/27chance de você estar cochilando em 0/27qualquer outro lugar.

No minuto 38, por exemplo, 17 das rotinas em potencial já foram encerradas. Assim, em 10 de 10 casos, você estará comendo. Isso significa que as probabilidades parecem

0/10 task 1, 0/10 task 2, 0/10 task 3, 0/10 task 4, 10/10 task 5

Desafio

Escreva uma função que utilize um número inteiro para o valor de minuto e uma sequência que consiste em uma sequência de números inteiros únicos ou pares de números inteiros a-bcom b> a, todos separados por espaços (exatamente como 8 15-17 2 3-5 6-8). Todos os números inteiros são positivos. O minuto de entrada será menor ou igual ao tempo máximo possível (40 no exemplo).

A função deve retornar outra string, indicando a chance fracionária não reduzida de estar em cada tarefa no minuto especificado.

Exemplos

  • myfunc(29, "8 15-17 2 3-5 6-8") retorna a string 0/27 0/27 0/27 24/27 3/27
  • myfunc(1, "8 15-17 2 3-5 6-8") retorna a string 27/27 0/27 0/27 0/27 0/27
  • myfunc(38, "8 15-17 2 3-5 6-8") retorna a string 0/10 0/10 0/10 0/10 10/10
  • myfunc(40, "8 15-17 2 3-5 6-8") retorna a string 0/1 0/1 0/1 0/1 1/1

Se seu idioma não possui strings ou funções, você pode usar variáveis ​​nomeadas, stdin / stdout, linha de comando ou o que parecer mais apropriado.

Pontuação

Isso é código de golfe. A solução mais curta em bytes vence.


A pergunta não especifica uma distribuição de probabilidade específica para o tempo gasto em cada tarefa. Deveria ser normalmente distribuído? Posso assumir qualquer distribuição que eu queira?
feersum

1
@ Calvin que não é uma distribuição normal. Talvez você queira ter uma distribuição uniforme?
feersum 26/09/14

Cada tarefa inclui a esquerda |, a direita |ou a metade de cada uma?
Peter Taylor

Todos os problemas mencionados foram corrigidos em questão. Algum outro problema?
Hobbies de Calvin

1
o que acontece se houver uma chance de que nenhuma tarefa esteja acontecendo?
proud haskeller

Respostas:


3

CJam, 124 115 100 92 89 bytes

Isso pode ser muito jogado, mas eu tenho que dormir, então postando agora em si :)

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

Experimente online aqui

A entrada é como:

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

Onde o primeiro número inteiro é o minuto de entrada e a segunda sequência é a sequência do intervalo de tempo (como mostrado nos exemplos da pergunta, apenas sem o ,)

Saída para a entrada acima mencionada:

0/27 0/27 0/27 24/27 3/27

Aceito isso se você puder seguir as regras atualizadas.
Passatempos de Calvin

Todos os outros exemplos dão 0/27's.
Passatempos de Calvin

Agora é um monte de 0 / 0's.
Passatempos de Calvin

@ Calvin'sHobbies Vamos levá-lo ao bate-papo: chat.stackexchange.com/rooms/18161/…
Optimizer

Não importa, desculpe, eu estava apenas dando a entrada errada.
Passatempos de Calvin

3

Mathematica, 237 216 bytes

Tenho certeza de que posso diminuir um pouco isso, mas não agora. Pelo menos finalmente consegui usar as novas associações do 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," "]<>"")&

Ungolfed:

    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 conforme especificado no desafio:

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

Ele retorna 0/1para todos os elementos se a primeira entrada for maior que o período máximo de tempo.


Eu acho que Cases[]não é necessário, dado como Tuplesfunciona. Se sim, então t = Lookup[Counts[Join @@(FirstPosition[#, n_ /; n >= j] & /@ Accumulate /@ Tuples@i)], #, 0].
DavidC

Lookupe Countssão adições bem-vindas ao idioma.
26914

@DavidCarraher Obrigado, mas eu tive que mudar para Flatten(em vez de Join@@) porque FirstPositionagora posso retornar Missing[NotFound]que não pode ser associado.
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

execute assim:

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

1

APL, 162

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

Execuções de exemplo

      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 você não se importe com o espaçamento estranho


Isso é apenas 98 bytes. O APL possui sua própria página de códigos, de forma que todos os seus símbolos se ajustem ao intervalo ASCII.
Optimizer
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.