Sự không chắc chắn trong Dòng thời gian của một ngày


12

Giả sử báo thức của bạn đánh thức bạn vào một buổi sáng, nhưng bạn nhấn snooze để bạn có thể ngủ thêm 8 phút nữa. Khi nó đổ chuông một lần nữa, bạn miễn cưỡng đứng dậy và đi tắm, mà bạn ước tính mất 15 đến 17 phút. Sau đó, bạn đánh răng đúng 2 phút và mặc quần áo, mất khoảng 3 đến 5 phút. Cuối cùng, bạn ăn một bữa sáng vội vàng trong 6 đến 8 phút và chạy ra khỏi cửa.

Chúng ta có thể biểu thị trình tự thời gian này là 8 15-17 2 3-5 6-8.

Với sự không chắc chắn của thói quen buổi sáng của bạn, xác suất bạn thực hiện mỗi nhiệm vụ ở một số phút cụ thể kể từ khi bạn thức dậy là gì?

Giả sử mỗi tác vụ mất toàn bộ số phút, chúng ta có thể lập biểu đồ cho mọi sự kết hợp có thể của các khoảng thời gian không chắc chắn (ví dụ 3, 4 và 5 phút để đánh răng). Biểu đồ này cho thấy tất cả 27 khả năng, với thời gian tăng dần về bên phải và mỗi tác vụ của N phút được biểu thị bằng (N - 1) dấu gạch ngang và một thanh dọc, chỉ để đánh dấu kết thúc của nó. Ranh giới phút xảy ra giữa các ký tự, vì vậy khoảng cách giữa cột 89cột được 8 min 59 secchuyển thành 9 min.

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

Rõ ràng là thói quen có thể mất tối đa 40 phút và ít nhất 34 phút.

Câu hỏi là, tại một phút cụ thể, giả sử phút 29, cơ hội bạn thực hiện trong 5 nhiệm vụ là bao nhiêu? Giả sử mỗi khung thời gian không chắc chắn được phân phối đồng đều trong toàn bộ số phút chính xác. Vì vậy, một nhiệm vụ 4-7 có 25% cơ hội mất 4, 5, 6 hoặc 7 phút.

Từ biểu đồ có thể thấy rằng vào phút 29 đã có một ...

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)

Tương tự như vậy ở phút 1, có một 27/27cơ hội bạn đang ngủ với 0/27mọi nơi khác.

Ví dụ, tại phút 38, 17 trong số các thói quen tiềm năng đã kết thúc. Vì vậy, trong 10 trên 10 trường hợp bạn sẽ được ăn. Điều này có nghĩa là xác suất trông giống như

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

Thử thách

Viết hàm lấy một số nguyên cho giá trị phút và một chuỗi bao gồm một chuỗi các số nguyên đơn hoặc các cặp số nguyên a-bvới b> a, tất cả được phân tách bằng dấu cách (giống như 8 15-17 2 3-5 6-8). Tất cả các số nguyên là tích cực. Số phút đầu vào sẽ nhỏ hơn hoặc bằng thời gian tối đa có thể (ví dụ 40).

Các chức năng nên trở một chuỗi biểu thị unreduced cơ hội phân đoạn trở trong mỗi công việc vào phút nhất định.

Ví dụ

  • myfunc(29, "8 15-17 2 3-5 6-8") trả về chuỗi 0/27 0/27 0/27 24/27 3/27
  • myfunc(1, "8 15-17 2 3-5 6-8") trả về chuỗi 27/27 0/27 0/27 0/27 0/27
  • myfunc(38, "8 15-17 2 3-5 6-8") trả về chuỗi 0/10 0/10 0/10 0/10 10/10
  • myfunc(40, "8 15-17 2 3-5 6-8") trả về chuỗi 0/1 0/1 0/1 0/1 1/1

Nếu ngôn ngữ của bạn không có chuỗi hoặc hàm, bạn có thể sử dụng các biến được đặt tên, stdin / stdout, dòng lệnh hoặc bất cứ thứ gì có vẻ phù hợp nhất.

Chấm điểm

Đây là mã golf. Giải pháp ngắn nhất trong byte thắng.


Câu hỏi không chỉ định phân phối xác suất cụ thể cho thời gian dành cho mỗi nhiệm vụ. Nó có nên được phân phối bình thường? Tôi có thể đảm nhận bất kỳ phân phối nào tôi muốn không?
frageum

1
@Calvin đó không phải là một bản phân phối bình thường. Có lẽ bạn muốn có một phân phối đồng phục?
frageum

Có phải mỗi nhiệm vụ bao gồm bên trái |, bên phải |hoặc một nửa của mỗi nhiệm vụ?
Peter Taylor

Tất cả các vấn đề được đề cập cố định trong câu hỏi. Bất kỳ vấn đề khác?
Sở thích của Calvin

1
Điều gì xảy ra nếu có cơ hội không có nhiệm vụ nào xảy ra?
tự hào

Câu trả lời:


3

CJam, 124 115 100 92 89 byte

Điều này có thể được chơi golf rất nhiều, nhưng tôi phải ngủ, vì vậy đăng bài ngay bây giờ :)

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

Dùng thử trực tuyến tại đây

Đầu vào giống như:

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

Trong đó số nguyên đầu tiên là phút đầu vào và chuỗi thứ hai là chuỗi phạm vi thời gian (như được hiển thị trong các ví dụ trong câu hỏi, chỉ cần không có ,)

Đầu ra cho đầu vào được đề cập ở trên:

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

Tôi sẽ chấp nhận điều này nếu bạn có thể làm cho nó tuân theo các quy tắc được cập nhật.
Sở thích của Calvin

Tất cả các ví dụ khác đưa ra 0/27.
Sở thích của Calvin

Bây giờ là một bó `0/0 '.
Sở thích của Calvin

@ Calvin'sHobbies Hãy mang nó đến trò chuyện: chat.stackexchange.com/rooms/18161/iêu
Tối ưu hóa

Không sao, xin lỗi, tôi chỉ đưa ra đầu vào sai.
Sở thích của Calvin

3

Toán học, 237 216 byte

Tôi chắc rằng tôi có thể rút ngắn điều này một chút, nhưng không phải bây giờ. Ít nhất cuối cùng tôi cũng đã sử dụng các hiệp hội mới từ Mathicala 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," "]<>"")&

Ung dung:

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

Cách sử dụng như được chỉ định trong thử thách:

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

Nó trả về 0/1cho tất cả các phần tử nếu đầu vào đầu tiên lớn hơn khoảng thời gian tối đa.


Tôi nghĩ Cases[]là không cần thiết đưa ra cách làm Tuplesviệc. Nếu vậy thì t = Lookup[Counts[Join @@(FirstPosition[#, n_ /; n >= j] & /@ Accumulate /@ Tuples@i)], #, 0].
DavidC

LookupCountsđược chào đón bổ sung cho ngôn ngữ.
DavidC

@DavidCarraher Cảm ơn, nhưng tôi đã phải chuyển sang Flatten(thay vì Join@@) vì FirstPositionbây giờ có thể trả lại Missing[NotFound]mà không thể tham gia.
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

chạy như thế này:

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

Ví dụ chạy

      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

Tôi hy vọng bạn không quan tâm đến khoảng cách kỳ lạ


Đây chỉ là 98 byte. APL có bảng mã riêng sao cho tất cả các biểu tượng của chúng phù hợp với phạm vi ASCII.
Tối ưu hóa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.