Ketidakpastian dalam Garis Waktu Sehari

12

Misalkan alarm Anda membangunkan Anda di suatu pagi, tetapi Anda menekan tiduran sehingga Anda bisa tidur selama 8 menit lagi. Ketika berdering lagi Anda dengan enggan bangun dan mandi, yang Anda perkirakan membutuhkan waktu 15 hingga 17 menit. Anda kemudian menyikat gigi selama 2 menit, dan berpakaian, yang memakan waktu sekitar 3 hingga 5 menit. Akhirnya, Anda makan sarapan terburu-buru dalam 6 hingga 8 menit dan berlari keluar.

Kami dapat menyatakan urutan waktu ini sebagai 8 15-17 2 3-5 6-8.

Mengingat ketidakpastian rutinitas pagi Anda, berapa probabilitas Anda melakukan setiap tugas pada beberapa menit tertentu sejak pertama kali Anda bangun?

Dengan asumsi setiap tugas memakan waktu beberapa menit, kita dapat memetakan setiap kemungkinan kombinasi rentang waktu yang tidak pasti (misalnya 3, 4, dan 5 menit untuk menyikat gigi). Bagan ini menunjukkan semua 27 kemungkinan, dengan waktu meningkat ke kanan, dan setiap tugas dari N menit diwakili oleh (N - 1) tanda hubung dan satu bilah vertikal, hanya untuk menandai akhirnya. Batas menit terjadi di antara karakter, sehingga ruang antara kolom 8dan berubah menjadi .98 min 59 sec9 min

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

Jelas bahwa rutinitas bisa memakan waktu paling lama 40 menit dan setidaknya 34 menit.

Pertanyaannya adalah, pada menit tertentu, katakanlah pada menit 29, berapa peluang Anda melakukan masing-masing dari 5 tugas? Asumsikan setiap kerangka waktu yang tidak pasti didistribusikan secara seragam dalam seluruh menit yang tepat. Jadi tugas 4-7 memiliki peluang 25% untuk mengambil 4, 5, 6, atau 7 menit.

Dari grafik dapat dilihat bahwa pada menit 29 ada ...

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)

Demikian pula pada menit 1 ada 27/27kemungkinan Anda tidur dengan orang 0/27lain.

Pada menit ke-38 misalnya, 17 dari rutinitas potensial telah berakhir. Jadi dalam 10 dari 10 kasus Anda akan makan. Ini berarti kemungkinan terlihat

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

Tantangan

Tulis fungsi yang mengambil integer untuk nilai menit, dan string yang terdiri dari urutan bilangan bulat tunggal, atau pasangan bilangan bulat a-bdengan b> a, semua dipisahkan oleh spasi (sama seperti 8 15-17 2 3-5 6-8). Semua bilangan bulat adalah positif. Menit input akan kurang dari atau sama dengan waktu maksimum yang dimungkinkan (misalnya 40).

Fungsi tersebut harus mengembalikan string lain yang menunjukkan peluang fraksional yang tidak berkurang dalam setiap tugas pada menit yang diberikan.

Contohnya

  • myfunc(29, "8 15-17 2 3-5 6-8") mengembalikan string 0/27 0/27 0/27 24/27 3/27
  • myfunc(1, "8 15-17 2 3-5 6-8") mengembalikan string 27/27 0/27 0/27 0/27 0/27
  • myfunc(38, "8 15-17 2 3-5 6-8") mengembalikan string 0/10 0/10 0/10 0/10 10/10
  • myfunc(40, "8 15-17 2 3-5 6-8") mengembalikan string 0/1 0/1 0/1 0/1 1/1

Jika bahasa Anda tidak memiliki string atau fungsi, Anda dapat menggunakan variabel bernama, stdin / stdout, baris perintah, atau apa pun yang tampaknya paling sesuai.

Mencetak gol

Ini golf kode. Solusi terpendek dalam byte menang.

Hobi Calvin
sumber
Pertanyaannya tidak menentukan distribusi probabilitas tertentu untuk waktu yang dihabiskan pada setiap tugas. Haruskah didistribusikan secara normal? Bisakah saya berasumsi distribusi yang saya inginkan?
feersum
1
@ Calvin itu bukan distribusi normal. Mungkin Anda ingin memiliki distribusi yang seragam?
feersum
Apakah setiap tugas termasuk kiri |, kanan |, atau setengah dari masing-masing?
Peter Taylor
Semua masalah yang disebutkan diperbaiki dalam pertanyaan. Ada masalah lain?
Calvin Hobbies
1
apa yang terjadi jika ada kemungkinan tidak ada tugas yang terjadi?
haskeller bangga

Jawaban:

3

CJam, 124 115 100 92 89 byte

Ini bisa bermain golf banyak, tapi saya harus tidur, jadi posting sekarang sendiri :)

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

Cobalah online di sini

Inputnya seperti:

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

Di mana integer pertama adalah menit input dan string kedua adalah urutan rentang waktu (seperti yang ditunjukkan dalam contoh dalam pertanyaan, hanya tanpa ,)

Output untuk input yang disebutkan di atas:

0/27 0/27 0/27 24/27 3/27
Pengoptimal
sumber
Saya akan menerima ini jika Anda bisa mengikuti aturan yang diperbarui.
Calvin Hobbies
Semua contoh lainnya memberi 0/27.
Calvin Hobi
Sekarang sekelompok `0 / 0's.
Calvin Hobbies
@ Calvin'sHobbies Mari kita bawa ke obrolan: chat.stackexchange.com/rooms/18161/…
Pengoptimal
Sudahlah, maaf, saya hanya memberikan masukan yang salah.
Hobi Calvin
3

Mathematica, 237 216 byte

Saya yakin saya bisa mempersingkat ini sedikit, tetapi tidak sekarang. Setidaknya saya akhirnya harus menggunakan asosiasi baru dari 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," "]<>"")&

Tidak Disatukan:

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

Penggunaan sebagaimana ditentukan dalam tantangan:

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

Ia mengembalikan 0/1semua elemen jika input pertama lebih besar dari rentang waktu maksimum.

Martin Ender
sumber
Saya pikir Cases[]tidak perlu diberikan cara Tupleskerjanya. Jika demikian, maka t = Lookup[Counts[Join @@(FirstPosition[#, n_ /; n >= j] & /@ Accumulate /@ Tuples@i)], #, 0].
DavidC
Lookupdan Countsmerupakan tambahan yang diterima untuk bahasa ini.
DavidC
@DavidCarraher Terima kasih, tetapi saya harus beralih ke Flatten(bukan Join@@) karena FirstPositionsekarang dapat kembali Missing[NotFound]yang tidak dapat bergabung.
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

jalankan seperti ini:

*Main> putStrLn $ 1 % "8 15-17 2 3-5 6-8"
27/27 0/27 0/27 0/27 0/27 
haskeller bangga
sumber
1

APL, 162

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

Contoh berjalan

      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

Saya harap Anda tidak keberatan dengan jarak yang aneh

TwiNight
sumber
Ini hanya 98 byte. APL memiliki codepage sendiri sehingga semua simbol mereka sesuai dengan rentang ASCII.
Pengoptimal