Günün Zaman Çizelgesindeki Belirsizlik


12

Alarmınızın sizi bir sabah uyandığını, ancak 8 dakika daha uyuyabilmeniz için erteleme yaptığınızı varsayalım. Tekrar çaldığında, isteksizce kalkıyorsunuz ve duş alıyorsunuz, ki tahmin ettiğiniz 15 ila 17 dakika sürüyor. Daha sonra dişlerinizi tam olarak 2 dakika fırçalayın ve giyin, yaklaşık 3 ila 5 dakika sürer. Son olarak, 6 ila 8 dakika içinde acele bir kahvaltı yiyip kapıyı bitiriyorsunuz.

Bu zamanlama dizisini olarak gösterebiliriz 8 15-17 2 3-5 6-8.

Sabah rutininizin belirsizliği göz önüne alındığında, her bir görevi ilk uyandığınız andan itibaren belirli dakikalarda yapma olasılığınız nedir?

Her görevin bir kaç dakika sürdüğünü varsayarsak, belirsiz zaman aralıklarının olası tüm kombinasyonlarını (örneğin, diş fırçalamak için 3, 4 ve 5 dakika) grafiklendirebiliriz. Bu grafik, zamanın sağa doğru artmasıyla 27 olasılığı da gösterir ve N dakikasının her görevi (N - 1) tire ve bir dikey çubukla temsil edilir, sadece sonunu işaretlemek için. Dakika sınırları karakterler arasında oluşur , bu nedenle 8ve 9sütunu arasındaki boşluk 8 min 59 secdönüşür 9 min.

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

Rutinin en fazla 40 dakika ve en az 34 dakika alabileceği açıktır.

Soru, belirli bir dakikada, 29. dakikada, 5 görevin her birini yapma şansınız nedir? Her belirsiz zaman çerçevesinin tam dakikalar boyunca eşit olarak dağıtıldığını varsayın. 4-7 arası bir görevin 4, 5, 6 veya 7 dakika alma şansı% 25'dir.

Grafikten 29. dakikada bir ...

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)

Benzer şekilde 1. dakikada başka bir yerde 27/27erteleme şansınız oldu 0/27.

Örneğin 38. dakikada, potansiyel rutinlerin 17'si zaten sona ermiştir. Yani her 10 vakanın 10'unda yemek yiyeceksiniz. Bu, olasılıkların

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

Meydan okuma

Bir yaz fonksiyonu dakika değeri için bir tamsayıyı alır ve tek bir tam sayı ya da tam sayı çiftlerinin bir dizisinden oluşan bir dizi a-bile b> a, her (gibi boşluklarla ayrılmış 8 15-17 2 3-5 6-8). Tüm tamsayılar pozitiftir. Giriş dakikası mümkün olan maksimum süreden daha az veya ona eşit olacaktır (örnek olarak 40).

İşlev , belirli bir dakikada her görevde azaltılmayan kesirli olma şansını gösteren başka bir dize döndürmelidir .

Örnekler

  • myfunc(29, "8 15-17 2 3-5 6-8") dizeyi döndürür 0/27 0/27 0/27 24/27 3/27
  • myfunc(1, "8 15-17 2 3-5 6-8") dizeyi döndürür 27/27 0/27 0/27 0/27 0/27
  • myfunc(38, "8 15-17 2 3-5 6-8") dizeyi döndürür 0/10 0/10 0/10 0/10 10/10
  • myfunc(40, "8 15-17 2 3-5 6-8") dizeyi döndürür 0/1 0/1 0/1 0/1 1/1

Dilinizde dizeler veya işlevler yoksa adlandırılmış değişkenler, stdin / stdout, komut satırı veya en uygun olanı kullanabilirsiniz.

puanlama

Bu kod golf. En kısa çözüm bayt kazanır.


Soru, her görev için harcanan zaman için belirli bir olasılık dağılımı belirtmez. Normal olarak dağıtılmalı mı? İstediğim dağılımı varsayabilir miyim?
feersum

1
@Calvin bu normal bir dağılım değil. Belki tekdüze bir dağıtım yapmak istediniz?
feersum

Her görev, her birinin solunu |, sağını |veya yarısını içerir mi?
Peter Taylor

Bahsedilen tüm sorunlar söz konusu düzeltildi. Başka sorun var mı?
Calvin'in Hobileri

1
hiçbir görevin gerçekleşmeme şansı varsa ne olur?
gururlu haskeller

Yanıtlar:


3

CJam, 124115100 92 89 bayt

Bu çok golf olabilir, ama uyumak zorunda, bu yüzden şimdi kendini gönderme :)

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

Buradan çevrimiçi deneyin

Girdi şöyle:

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

İlk tamsayı giriş dakikası ve ikinci dize zaman aralığı dizisidir (sorudaki örneklerde gösterildiği gibi, sadece ,)

Yukarıda belirtilen girdinin çıktısı:

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

Güncellenmiş kurallara uymasını sağlayabiliyorsanız bunu kabul edeceğim.
Calvin'in Hobileri

Diğer tüm örnekler verir 0/27.
Calvin'in Hobileri

Şimdi bir grup `` 0/0 ''.
Calvin'in Hobileri

@ Calvin'sHobbies Sohbet edelim: chat.stackexchange.com/rooms/18161/…
Doktor

Boş ver, üzgünüm, sadece girdiyi yanlış veriyordum.
Calvin'in Hobileri

3

Mathematica, 237166 bayt

Eminim bunu biraz kısaltabilirim ama şimdi değil. En azından sonunda Mathematica 10'daki yeni dernekleri kullanmak zorunda kaldım! :)

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

Ungolfed:

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

Meydan okumada belirtildiği gibi kullanım:

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

0/1İlk giriş maksimum zaman aralığından daha büyükse tüm elemanlar için geri döner .


Cases[]Nasıl Tuplesçalıştığı göz önüne alındığında gerekli olmadığını düşünüyorum . Eğer öyleyse, o zaman t = Lookup[Counts[Join @@(FirstPosition[#, n_ /; n >= j] & /@ Accumulate /@ Tuples@i)], #, 0].
DavidC

Lookupve Countsdile hoş geldiniz eklemeleridir.
DavidC

@DavidCarraher Teşekkürler, ama şimdi Flatten(bunun yerine Join@@) geçmek zorunda kaldım çünkü FirstPositionşimdi katılamayacak Missing[NotFound]olan geri dönebilir .
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

şöyle koş:

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

Örnek çalıştırmalar

      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

Umarım garip aralıkları önemsemezsin


Bu yalnızca 98 bayttır. APL'nin tüm kodları ASCII aralığına sığacak şekilde kendi kod sayfasına sahiptir.
Doktor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.