Incertezza nella linea temporale di un giorno


12

Supponi che la sveglia ti svegli una mattina, ma premi snooze in modo da poter dormire per altri 8 minuti. Quando suona di nuovo, ti alzi malvolentieri e fai una doccia, che secondo te dura da 15 a 17 minuti. Quindi ti lavi i denti esattamente per 2 minuti e ti vesti, il che richiede circa 3-5 minuti. Alla fine, fai una colazione affrettata in 6-8 minuti e corri fuori dalla porta.

Possiamo indicare questa sequenza temporale come 8 15-17 2 3-5 6-8.

Data l'incertezza della routine mattutina, qual è la probabilità che stavi facendo ogni compito in un determinato numero di minuti dalla prima volta che ti sei svegliato?

Supponendo che ogni attività richieda un numero intero di minuti, possiamo tracciare ogni possibile combinazione di intervalli di tempo incerti (ad esempio 3, 4 e 5 minuti per lavarsi i denti). Questo grafico mostra tutte e 27 le possibilità, con il tempo che aumenta a destra e ogni attività di N minuti rappresentata da trattini (N - 1) e una barra verticale, solo per segnarne la fine. I contorni dei minuti si verificano tra i caratteri, quindi lo spazio tra la colonna 8e si 9sta 8 min 59 sectrasformando 9 min.

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

È chiaro che la routine avrebbe potuto richiedere al massimo 40 minuti e almeno 34 minuti.

La domanda è, ad un particolare minuto, diciamo minuto 29, qual è la possibilità che stavi facendo ognuno dei 5 compiti? Supponiamo che ogni intervallo di tempo incerto sia distribuito uniformemente sull'intero minuto esatto. Quindi un'attività 4-7 ha il 25% di probabilità di impiegare 4, 5, 6 o 7 minuti.

Dal grafico si può vedere che al minuto 29 c'era un ...

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)

Allo stesso modo al minuto 1 c'era una 27/27possibilità con cui dormivi 0/27ovunque.

Ad esempio al minuto 38, 17 delle potenziali routine sono già terminate. Quindi in 10 casi su 10 mangerai. Ciò significa che le probabilità sembrano

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

Sfida

Scrivi una funzione che accetta un numero intero per il valore dei minuti e una stringa costituita da una sequenza di singoli numeri interi o coppie di numeri interi a-bcon b> a, tutti separati da spazi (proprio come 8 15-17 2 3-5 6-8). Tutti i numeri interi sono positivi. Il minuto in ingresso sarà inferiore o uguale al tempo massimo possibile (40 in esempio).

La funzione dovrebbe restituire un'altra stringa che indica la probabilità frazionaria non ridotta di essere in ciascuna attività in un determinato minuto.

Esempi

  • myfunc(29, "8 15-17 2 3-5 6-8") restituisce la stringa 0/27 0/27 0/27 24/27 3/27
  • myfunc(1, "8 15-17 2 3-5 6-8") restituisce la stringa 27/27 0/27 0/27 0/27 0/27
  • myfunc(38, "8 15-17 2 3-5 6-8") restituisce la stringa 0/10 0/10 0/10 0/10 10/10
  • myfunc(40, "8 15-17 2 3-5 6-8") restituisce la stringa 0/1 0/1 0/1 0/1 1/1

Se la tua lingua non ha stringhe o funzioni puoi usare variabili nominate, stdin / stdout, la riga di comando o qualunque cosa sembri più appropriata.

punteggio

Questo è il codice golf. Vince la soluzione più breve in byte .


La domanda non specifica una distribuzione di probabilità particolare per il tempo impiegato per ciascuna attività. Dovrebbe essere normalmente distribuito? Posso assumere la distribuzione che desidero?
feersum,

1
@Calvin non è una distribuzione normale. Forse volevi avere una distribuzione uniforme?
feersum,

Ogni attività include la sinistra |, la destra |o la metà di ciascuna?
Peter Taylor,

Tutti i problemi menzionati sono stati risolti in questione. Altri problemi?
Hobby di Calvin il

1
cosa succede se esiste la possibilità che non si verifichino attività?
orgoglioso haskeller il

Risposte:


3

CJam, 124 115 100 92 89 byte

Questo può essere giocato a golf molto, ma devo dormire, quindi pubblicare ora stesso :)

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

Provalo online qui

L'input è come:

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

Dove primo intero è il minuto di input e la seconda stringa è la sequenza dell'intervallo di tempo (come mostrato negli esempi nella domanda, solo senza il ,)

Uscita per l'ingresso sopra menzionato:

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

Accetterò questo se riesci a farlo seguire le regole aggiornate.
Calvin's Hobbies,

Tutti gli altri esempi danno 0/27.
Calvin's Hobbies,

Ora è un gruppo di `0/0.
Calvin's Hobbies,

@ Calvin'sHobbies Portiamolo in chat: chat.stackexchange.com/rooms/18161/…
Optimizer,

Poco male, mi dispiace, stavo solo dando un input sbagliato.
Calvin's Hobbies,

3

Mathematica, 237 216 byte

Sono sicuro di poterlo abbreviare un po ', ma non ora. Almeno finalmente ho potuto usare le nuove associazioni di 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," "]<>"")&

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

Utilizzo come specificato nella sfida:

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

Restituisce 0/1per tutti gli elementi se il primo input è maggiore dell'intervallo di tempo massimo.


Penso che Cases[]non sia necessario dato come Tuplesfunziona. Se è così, allora t = Lookup[Counts[Join @@(FirstPosition[#, n_ /; n >= j] & /@ Accumulate /@ Tuples@i)], #, 0].
DavidC,

Lookupe Countssono gradite aggiunte alla lingua.
DavidC,

@DavidCarraher Grazie, ma ho dovuto passare a Flatten(anziché Join@@) perché FirstPositionora può tornare a Missing[NotFound]cui non è possibile unirsi.
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

correre così:

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

L'esempio funziona

      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

Spero non ti dispiaccia la strana spaziatura


Questo è solo 98 byte. APL ha una propria codepage in modo tale che tutti i suoi simboli si adattino all'intervallo ASCII.
Ottimizzatore
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.