하루 일정의 불확실성


12

어느 날 아침 알람이 울린다 고하더라도 다시 알림을 누르면 8 분 더 잠을 잘 수 있습니다. 다시 울리면 격렬하게 일어나 샤워를하는데 15 분에서 17 분 정도 걸립니다. 그런 다음 정확히 2 분 동안 양치질을하고 옷을 입는데 약 3 ~ 5 분이 걸립니다. 마지막으로 6 ~ 8 분 안에 서둘러 아침 식사를하고 문을 벗어납니다.

이 타이밍 시퀀스를로 표시 할 수 있습니다 8 15-17 2 3-5 6-8.

아침 일과의 불확실성을 감안할 때, 처음 일어 났을 때 특정 시간 (분)마다 각 작업을 수행 할 확률은 얼마입니까?

모든 작업에 전체 시간이 걸린다고 가정하면 불확실한 시간 범위 (예 : 양치질의 경우 3, 4, 5 분)의 가능한 모든 조합을 차트로 표시 할 수 있습니다. 이 차트는 27 개의 가능성을 보여줍니다. 시간은 오른쪽으로 증가하고 N 분의 각 작업은 (N-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/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.