Неопределенность в графике дня


12

Предположим, ваш будильник разбудит вас однажды утром, но вы включите сон, чтобы вы могли спать еще 8 минут. Когда он снова зазвонит, вы неохотно встаете и принимаете душ, который, по вашим оценкам, занимает от 15 до 17 минут. Затем вы чистите зубы ровно 2 минуты и одеваетесь, что занимает от 3 до 5 минут. Наконец, вы едите поспешный завтрак через 6-8 минут и выбегаете за дверь.

Мы можем обозначить эту временную последовательность как 8 15-17 2 3-5 6-8.

Учитывая неопределенность вашего утреннего распорядка, какова вероятность того, что вы выполняли каждое задание в определенное количество минут с момента вашего первого пробуждения?

Предполагая, что каждая задача занимает целое количество минут, мы можем наметить каждую возможную комбинацию неопределенных интервалов времени (например, 3, 4 и 5 минут для чистки зубов). На этой диаграмме показаны все 27 возможностей, причем время увеличивается вправо, и каждая задача из N минут представлена ​​(N - 1) штрихами и одной вертикальной чертой, чтобы отметить его окончание. Границы минутные происходят между персонажами, поэтому пространство между 8и 9колонной 8 min 59 secпревращается 9 min.

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

Ясно, что процедура могла занять не более 40 минут и не менее 34 минут.

Вопрос в конкретную минуту, скажем, в минуту 29, какова вероятность того, что вы выполняли каждое из 5 заданий? Предположим, что каждый неопределенный период времени равномерно распределен по точным минутам. Таким образом, задача 4-7 имеет 25% -ный шанс занять 4, 5, 6 или 7 минут.

Из графика видно, что на 29 минуте произошло ...

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)

Точно так же на 27/27первой минуте был шанс, что вы спали с кем- 0/27то еще.

Например, на 38-й минуте 17 потенциальных процедур уже закончились. Таким образом, в 10 из 10 случаев вы будете есть. Это означает, что вероятности выглядят как

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

Вызов

Напишите функцию, которая принимает целочисленное значение для минутного значения, и строку, состоящую из последовательности отдельных целых чисел или пар целых чисел a-bс b> a, разделенных пробелами (точно так же, как 8 15-17 2 3-5 6-8). Все целые числа положительны. Входная минута будет меньше или равна максимально возможному времени (например, 40).

Функция должна возвращать еще одну строку, обозначающую невосстановленный дробный шанс присутствия в каждой задаче в данную минуту.

Примеры

  • myfunc(29, "8 15-17 2 3-5 6-8") возвращает строку 0/27 0/27 0/27 24/27 3/27
  • myfunc(1, "8 15-17 2 3-5 6-8") возвращает строку 27/27 0/27 0/27 0/27 0/27
  • myfunc(38, "8 15-17 2 3-5 6-8") возвращает строку 0/10 0/10 0/10 0/10 10/10
  • myfunc(40, "8 15-17 2 3-5 6-8") возвращает строку 0/1 0/1 0/1 0/1 1/1

Если в вашем языке нет строк или функций, вы можете использовать именованные переменные, stdin / stdout, командную строку или все, что кажется наиболее подходящим.

счет

Это код гольф. Самое короткое решение в байтах побеждает.


Вопрос не определяет конкретное распределение вероятностей за время, затраченное на каждую задачу. Должно ли оно быть нормально распределено? Могу ли я принять любой дистрибутив, который я хочу?
feersum

1
@ Calvin, это не нормальное распределение. Может быть, вы хотели иметь равномерное распределение?
feersum

Включает ли каждое задание левое |, правое |или половину каждого?
Питер Тейлор

Все упомянутые проблемы исправлены в вопросе. Есть еще проблемы?
Увлечения Кельвина,

1
что произойдет, если есть вероятность, что не было никакой задачи?
гордый haskeller

Ответы:


3

CJam, 124 115 100 92 89 байт

Это может быть много в гольфе, но я должен спать, поэтому выкладывать сейчас сам :)

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

Попробуйте онлайн здесь

Ввод похож на:

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

Где первое целое число - входная минута, а вторая строка - последовательность временного диапазона (как показано в примерах в вопросе, только без ,)

Выход для вышеупомянутого ввода:

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

Я приму это, если вы сможете заставить его следовать обновленным правилам.
Увлечения Кэлвина

Все остальные примеры дают 0/27.
Увлечения Кэлвина

Теперь это куча `0/0.
Увлечения Кэлвина

@ Calvin'sHobbies Давайте поговорим: chat.stackexchange.com/rooms/18161/…
Оптимизатор

Не берите в голову, извините, я просто вводил неправильные данные.
Увлечения Кэлвина

3

Mathematica, 237 216 байт

Я уверен, что могу немного сократить это, но не сейчас. По крайней мере, я наконец получил возможность использовать новые ассоциации от 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, " "] <> "") &

Использование, как указано в вызове:

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

Возвращается 0/1для всех элементов, если первый вход превышает максимальный промежуток времени.


Я думаю, что Cases[]это не обязательно, учитывая, как Tuplesработает. Если так, тогда t = Lookup[Counts[Join @@(FirstPosition[#, n_ /; n >= j] & /@ Accumulate /@ Tuples@i)], #, 0].
DavidC

Lookupи Countsприветствуются дополнения к языку.
DavidC

@DavidCarraher Спасибо, но мне пришлось переключиться на Flatten(вместо Join@@), потому что FirstPositionтеперь можно вернуть, Missing[NotFound]который не может быть присоединен.
Мартин Эндер,

1

Хаскелл, 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

беги так:

*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')⍵}

Пример работает

      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

Я надеюсь, что вы не возражаете против странного расстояния


Это всего 98 байт. У APL есть своя собственная кодовая страница, так что все их символы вписываются в диапазон ASCII.
Оптимизатор
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.