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 8
e 9
está se 8 min 59 sec
transformando 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/27
chance de você estar cochilando em 0/27
qualquer 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-b
com 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 string0/27 0/27 0/27 24/27 3/27
myfunc(1, "8 15-17 2 3-5 6-8")
retorna a string27/27 0/27 0/27 0/27 0/27
myfunc(38, "8 15-17 2 3-5 6-8")
retorna a string0/10 0/10 0/10 0/10 10/10
myfunc(40, "8 15-17 2 3-5 6-8")
retorna a string0/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.
fonte
|
, a direita|
ou a metade de cada uma?Respostas:
CJam,
124 115 100 9289 bytesIsso pode ser muito jogado, mas eu tenho que dormir, então postando agora em si :)
Experimente online aqui
A entrada é como:
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:
fonte
0/27
's.Mathematica,
237216 bytesTenho certeza de que posso diminuir um pouco isso, mas não agora. Pelo menos finalmente consegui usar as novas associações do Mathematica 10! :)
Ungolfed:
Uso conforme especificado no desafio:
Ele retorna
0/1
para todos os elementos se a primeira entrada for maior que o período máximo de tempo.fonte
Cases[]
não é necessário, dado comoTuples
funciona. Se sim, entãot = Lookup[Counts[Join @@(FirstPosition[#, n_ /; n >= j] & /@ Accumulate /@ Tuples@i)], #, 0]
.Lookup
eCounts
são adições bem-vindas ao idioma.Flatten
(em vez deJoin@@
) porqueFirstPosition
agora posso retornarMissing[NotFound]
que não pode ser associado.Haskell, 232
execute assim:
fonte
APL, 162
Execuções de exemplo
Espero que você não se importe com o espaçamento estranho
fonte