1日のタイムラインの不確実性


12

ある朝、目覚ましで目覚めたが、スヌーズすると、さらに8分間眠ることができたとします。再び鳴ったら、しぶしぶ起きてシャワーを浴びます。これには15〜17分かかります。その後、正確に2分間歯を磨き、服を着ます。これには約3〜5分かかります。最後に、急いで朝食を6〜8分で食べてドアを使い果たします。

このタイミングシーケンスを次のように示すことができます。 8 15-17 2 3-5 6-8

あなたの朝のルーチンの不確実性を考えると、あなたが最初に目を覚ましてから特定の分数で各タスクを行っていた確率は何ですか?

すべてのタスクに整数分かかると仮定すると、不確実な時間範囲の可能な組み合わせをすべてグラフ化できます(たとえば、歯を磨くのに3、4、5分)。このチャートには、27の可能性がすべて示されています。時間は右に増加し、N分ごとのタスクは(N-1)ダッシュと1つの垂直バーで表され、終了を示すだけです。文字間に微小な境界が生じるため、8との間のスペース9はに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)

同様に、1分目に 27/270/27他の場所で居眠りをして可能性。

たとえば、38分で、17の潜在的なルーチンがすでに終了しています。したがって、10ケース中10ケースで食べることになります。これは、確率が次のように見えることを意味します

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

チャレンジ

分の値に整数を使用する関数と、単一の整数のシーケンス、または>のa-b付いた整数のペアで構成される文字列をすべて記述します。ba8 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 14

1
@Calvinは正規分布ではありません。たぶん、あなたは均一な分布を望んでいましたか?
feersum 14

各タスクには、それぞれのleft |、right |、またはhalfが含まれていますか?
ピーターテイラー14

上記のすべての問題は修正されました。他の問題はありますか?
カルバンの趣味14

1
タスクが発生していない可能性がある場合はどうなりますか?
誇りに思ってhaskeller

回答:


3

CJam、124115100 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"

(ちょうどことなく、当該実施例に示すように、第1の整数が入力分であり、第2のストリングは、時間範囲配列です,

上記の入力の出力:

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

更新されたルールに従うことができれば、これを受け入れます。
カルバンの趣味14年

他のすべての例はを与え0/27ます。
カルビンの趣味14年

現在、これは「0/0」の集まりです。
カルビンの趣味14年

@ Calvin'sHobbiesチャットに行きましょう:chat.stackexchange.com/rooms/18161/…–
オプティマイザー

気にしないで、申し訳ありませんが、入力を間違えただけです。
カルビンの趣味14年

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 14

LookupそしてCounts言語に追加を歓迎しています。
DavidC 14

@DavidCarraherありがとう、しかし、私はFlatten(代わりにJoin@@)に切り替えなければなりませんでした。なぜなら、FirstPositionMissing[NotFound]では参加できないものを返すことができるからです。
マーティンエンダー14

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範囲に収まる独自のコードページがあります。
オプティマイザー14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.