一天中的时间表不确定性


12

假设您的闹钟在一个早晨将您叫醒,但您打了贪睡使您可以再睡8分钟。当它再次响起时,您会苦苦地起身去洗个澡,估计需要15到17分钟。然后,您只需刷牙2分钟,然后穿好衣服,大约需要3至5分钟。最后,您在6至8分钟内吃了一份匆忙的早餐,然后跑出了门。

我们可以将该时序表示为8 15-17 2 3-5 6-8

鉴于您早上的例行活动不确定,自您第一次醒来以来在特定的分钟数内完成每项任务的概率是多少?

假设每个任务需要花费几分钟,我们可以绘制不确定时间跨度的每种可能组合(例如,刷牙需要3、4和5分钟)。该图表显示了所有27种可能性,时间在右边增加,每项N分钟的任务用(N-1)短划线和一个竖线表示,以标记其结束时间。字符之间存在微小的边界,因此89列之间的间隔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)

同样,在第一分钟,27/27您就有机会0/27在其他地方打everywhere。

例如,在第38分钟,可能的例程中的17个已经结束。因此,十分之十的人会进食。这意味着概率看起来像

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 2014年

Answers:


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

如果您可以遵循更新的规则,我会接受的。
卡尔文的爱好2014年

所有其他示例都给出0/27
卡尔文的爱好2014年

现在是一堆“ 0/0”。
加尔文的爱好2014年

@ Calvin'sHobbies让我们聊天:chat.stackexchange.com/rooms/18161/…–
Optimizer

没关系,对不起,我只是在输入错误。
加尔文的爱好2014年

3

Mathematica,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 2014年

LookupCounts欢迎加入该语言。
DavidC 2014年

@DavidCarraher谢谢,但是我不得不切换到Flatten(而不是Join@@),因为FirstPosition现在可以返回Missing[NotFound],无法加入。
Martin Ender 2014年

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范围。
Optimizer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.