Предположим, ваш будильник разбудит вас однажды утром, но вы включите сон, чтобы вы могли спать еще 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, командную строку или все, что кажется наиболее подходящим.
счет
Это код гольф. Самое короткое решение в байтах побеждает.
источник
|
, правое|
или половину каждого?Ответы:
CJam,
124 115 100 9289 байтЭто может быть много в гольфе, но я должен спать, поэтому выкладывать сейчас сам :)
Попробуйте онлайн здесь
Ввод похож на:
Где первое целое число - входная минута, а вторая строка - последовательность временного диапазона (как показано в примерах в вопросе, только без
,
)Выход для вышеупомянутого ввода:
источник
0/27
.Mathematica,
237216 байтЯ уверен, что могу немного сократить это, но не сейчас. По крайней мере, я наконец получил возможность использовать новые ассоциации от Mathematica 10! :)
Ungolfed:
Использование, как указано в вызове:
Возвращается
0/1
для всех элементов, если первый вход превышает максимальный промежуток времени.источник
Cases[]
это не обязательно, учитывая, какTuples
работает. Если так, тогдаt = Lookup[Counts[Join @@(FirstPosition[#, n_ /; n >= j] & /@ Accumulate /@ Tuples@i)], #, 0]
.Lookup
иCounts
приветствуются дополнения к языку.Flatten
(вместоJoin@@
), потому чтоFirstPosition
теперь можно вернуть,Missing[NotFound]
который не может быть присоединен.Хаскелл, 232
беги так:
источник
APL, 162
Пример работает
Я надеюсь, что вы не возражаете против странного расстояния
источник