하루 일정의 불확실성


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)

마찬가지로 1 분에 다른 곳 27/27에서 스누즈 할 가능성이있었습니다 0/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로를 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

각 작업에 왼쪽 |, 오른쪽 |또는 절반이 포함됩니까?
피터 테일러

언급 된 모든 문제가 수정되었습니다. 다른 문제가 있습니까?
Calvin 's Hobbies

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"

첫 번째 정수는 입력 분이고 두 번째 문자열은 시간 범위 시퀀스입니다 (문제가없는 예제에서와 같이 ,)

위에서 언급 한 입력에 대한 출력 :

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

업데이트 된 규칙을 준수 할 수 있으면이를 수락합니다.
Calvin 's Hobbies

다른 모든 예제는를 제공 0/27합니다.
Calvin 's Hobbies

이제는 '0/0'의 무리입니다.
Calvin 's Hobbies

@ Calvin'sHobbies 채팅하기 : chat.stackexchange.com/rooms/18161/…
Optimizer

걱정 마세요, 죄송합니다. 입력 내용이 잘못되었습니다.
Calvin 's Hobbies

3

매스 매 티카, 237216 바이트

나는 이것을 조금 줄일 수 있다고 확신하지만 지금은 아닙니다. 적어도 나는 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

Lookup그리고 Counts언어에 오신 것을 환영합니다 추가입니다.
DavidC

@DavidCarraher 감사합니다.하지만 Flatten() 대신 () 대신에 전환 할 수 Join@@없었기 때문에 전환 할 수 없었습니다. FirstPositionMissing[NotFound]
Martin Ender

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.