Невпевненість у часовій шкалі дня


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)

Так само в хвилину 1 була 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's.
Захоплення Кальвіна

Зараз це купа `0/0 '.
Захоплення Кальвіна

@ Calvin'sHobbies Давайте візьмемо його на чат: chat.stackexchange.com/rooms/18161/…
Optimizer

Не зважайте, вибачте, я просто давав вклад неправильно.
Захоплення Кальвіна

3

Математика, 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," "]<>"")&

Безголівки:

    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.