Niepewność na osi czasu jednego dnia

12

Załóżmy, że alarm budzi cię pewnego ranka, ale włączysz drzemkę, aby móc spać jeszcze 8 minut. Kiedy znów dzwoni, niechętnie wstajesz i bierzesz prysznic, który według ciebie zajmuje 15–17 minut. Następnie myjesz zęby dokładnie przez 2 minuty i ubierasz się, co zajmuje około 3 do 5 minut. Na koniec jesz pośpieszne śniadanie w ciągu 6-8 minut i wybiegasz za drzwi.

Możemy oznaczyć tę sekwencję czasową jako 8 15-17 2 3-5 6-8.

Biorąc pod uwagę niepewność związaną z poranną rutyną, jakie jest prawdopodobieństwo wykonania każdego zadania w określonej liczbie minut od pierwszego przebudzenia?

Zakładając, że każde zadanie zajmuje całą liczbę minut, możemy sporządzić mapę każdej możliwej kombinacji niepewnych przedziałów czasowych (np. 3, 4 i 5 minut na mycie zębów). Ta tabela pokazuje wszystkie 27 możliwości, z czasem rosnącym w prawo, a każde zadanie N minut reprezentowane przez (N - 1) myślniki i jeden pionowy pasek, aby zaznaczyć jego zakończenie. Minuty granice występują między znakami, więc przestrzeń między kolumną 8i zmienia się w .98 min 59 sec9 min

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

Oczywiste jest, że rutyna mogła zająć maksymalnie 40 minut, a przynajmniej 34 minuty.

Pytanie brzmi, w konkretnej chwili, powiedzmy minutę 29, jaka jest szansa, że ​​wykonałeś każde z 5 zadań? Załóżmy, że każdy niepewny przedział czasowy jest równomiernie rozłożony na dokładne całe minuty. Tak więc zadanie 4-7 ma 25% szansy na 4, 5, 6 lub 7 minut.

Z wykresu widać, że w 29 minucie nastąpił ...

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)

Podobnie w 1 minucie istniała 27/27szansa, że ​​drzemiesz 0/27wszędzie.

Na przykład w 38 minucie 17 potencjalnych procedur już się zakończyło. Więc w 10 na 10 przypadków będziesz jeść. Oznacza to, że wyglądają prawdopodobieństwa

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

Wyzwanie

Napisz funkcję, która przyjmuje liczbę całkowitą dla wartości minuty, oraz ciąg znaków składający się z sekwencji pojedynczych liczb całkowitych lub par liczb całkowitych a-bz b> a, wszystkie oddzielone spacjami (podobnie jak 8 15-17 2 3-5 6-8). Wszystkie liczby całkowite są dodatnie. Minuta wejściowa będzie mniejsza lub równa maksymalnemu możliwemu czasowi (na przykład 40).

Funkcja powinna zwrócić kolejny ciąg oznaczający nieredukowaną ułamkową szansę bycia w każdym zadaniu w danej minucie.

Przykłady

  • myfunc(29, "8 15-17 2 3-5 6-8") zwraca ciąg 0/27 0/27 0/27 24/27 3/27
  • myfunc(1, "8 15-17 2 3-5 6-8") zwraca ciąg 27/27 0/27 0/27 0/27 0/27
  • myfunc(38, "8 15-17 2 3-5 6-8") zwraca ciąg 0/10 0/10 0/10 0/10 10/10
  • myfunc(40, "8 15-17 2 3-5 6-8") zwraca ciąg 0/1 0/1 0/1 0/1 1/1

Jeśli twój język nie ma ciągów ani funkcji, możesz użyć nazwanych zmiennych, stdin / stdout, linii poleceń lub cokolwiek, co wydaje się najbardziej odpowiednie.

Punktacja

To jest kod golfowy. Najkrótsze rozwiązanie w bajtach wygrywa.

Hobby Calvina
źródło
Pytanie nie określa konkretnego rozkładu prawdopodobieństwa dla czasu spędzonego na każdym zadaniu. Czy powinien być normalnie dystrybuowany? Czy mogę założyć dowolną dystrybucję, którą chcę?
feersum
1
@ Calvin to nie jest normalny rozkład. Może chciałeś mieć jednolity rozkład?
feersum
Czy każde zadanie obejmuje lewą |, prawą |lub połowę każdego z nich?
Peter Taylor
Wszystkie wymienione problemy rozwiązane w pytaniu. Jakieś inne problemy?
Calvin's Hobbies
1
co się stanie, jeśli istnieje szansa, że ​​żadne zadanie się nie wydarzyło?
dumny haskeller

Odpowiedzi:

3

CJam, 124 115 100 92 89 bajtów

Można w to dużo grać w golfa, ale muszę spać, więc teraz sam się zamieszczam :)

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

Wypróbuj online tutaj

Dane wejściowe są jak:

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

Gdzie pierwsza liczba całkowita to minuta wejściowa, a druga to sekwencja zakresu czasu (jak pokazano w przykładach w pytaniu, tylko bez ,)

Dane wyjściowe dla wyżej wymienionych danych wejściowych:

0/27 0/27 0/27 24/27 3/27
Optymalizator
źródło
Zaakceptuję to, jeśli będziesz w stanie uzyskać zaktualizowane zasady.
Calvin's Hobbies
Wszystkie pozostałe przykłady podają 0/27.
Calvin's Hobbies
Teraz jest kilka `0/0.
Calvin's Hobbies
@ Calvin'sHobbies Weźmy to na czacie: chat.stackexchange.com/rooms/18161/...
Optymalizator
Nieważne, przepraszam, po prostu źle wpisałem dane wejściowe.
Calvin's Hobbies
3

Mathematica, 237 216 bajtów

Jestem pewien, że mogę to trochę skrócić, ale nie teraz. Przynajmniej w końcu mogłem skorzystać z nowych skojarzeń z 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," "]<>"")&

Nie golfowany:

    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, " "] <> "") &

Użycie określone w wyzwaniu:

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

Zwraca 0/1wszystkie elementy, jeśli pierwsze wejście jest dłuższe niż maksymalny okres.

Martin Ender
źródło
Myślę, że Cases[]nie jest to konieczne, biorąc pod uwagę, jak to Tuplesdziała. Jeśli tak, to t = Lookup[Counts[Join @@(FirstPosition[#, n_ /; n >= j] & /@ Accumulate /@ Tuples@i)], #, 0].
DavidC
Lookupi Countssą mile widzianymi dodatkami do języka.
DavidC
@DavidCarraher Dzięki, ale musiałem przełączyć się na Flatten(zamiast Join@@), ponieważ FirstPositionmogę teraz powrócić, do Missing[NotFound]którego nie można się przyłączyć.
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

biegnij tak:

*Main> putStrLn $ 1 % "8 15-17 2 3-5 6-8"
27/27 0/27 0/27 0/27 0/27 
dumny haskeller
źródło
1

APL, 162

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

Przykład działa

      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

Mam nadzieję, że nie masz nic przeciwko dziwnym odstępom

TwiNight
źródło
To tylko 98 bajtów. APL ma własną stronę kodową, dzięki czemu wszystkie ich symbole mieszczą się w zakresie ASCII.
Optymalizator