Incertitude dans la chronologie d'une journée


12

Supposons que votre alarme vous réveille un matin, mais vous appuyez sur la répétition afin de pouvoir dormir pendant 8 minutes supplémentaires. Quand il sonne à nouveau, vous vous levez à contrecœur et prenez une douche, ce qui prend entre 15 et 17 minutes. Vous vous brossez ensuite les dents pendant exactement 2 minutes et vous vous habillez, ce qui prend environ 3 à 5 minutes. Enfin, vous mangez un petit déjeuner précipité en 6 à 8 minutes et sortez en courant.

Nous pouvons désigner cette séquence de synchronisation comme 8 15-17 2 3-5 6-8.

Étant donné l'incertitude de votre routine matinale, quelle est la probabilité que vous effectuiez chaque tâche à un certain nombre de minutes depuis votre premier réveil?

En supposant que chaque tâche prend un nombre entier de minutes, nous pouvons tracer toutes les combinaisons possibles d'intervalles de temps incertains (par exemple 3, 4 et 5 minutes pour se brosser les dents). Ce graphique montre les 27 possibilités, le temps augmentant vers la droite, et chaque tâche de N minutes représentée par (N - 1) tirets et une barre verticale, juste pour marquer sa fin. Les minuscules limites se produisent entre les caractères, de sorte que l'espace entre la colonne 8et 9se 8 min 59 sectransforme en 9 min.

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

Il est clair que la routine aurait pu prendre 40 minutes au maximum et 34 minutes au moins.

La question est, à une minute donnée, disons la minute 29, quelle est la chance que vous accomplissiez chacune des 5 tâches? Supposons que chaque période de temps incertaine soit uniformément répartie sur les minutes entières exactes. Ainsi, une tâche 4-7 a 25% de chances de prendre 4, 5, 6 ou 7 minutes.

Le graphique montre qu'à la minute 29, il y avait 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)

De même, à la minute 1, il y avait une 27/27chance que vous somnoliez 0/27partout ailleurs.

À la minute 38 par exemple, 17 des routines potentielles sont déjà terminées. Donc, dans 10 cas sur 10, vous mangerez. Cela signifie que les probabilités ressemblent à

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

Défi

Écrivez une fonction qui prend un entier pour la valeur des minutes et une chaîne composée d'une séquence d'entiers uniques ou de paires d'entiers a-bavec b> a, tous séparés par des espaces (comme 8 15-17 2 3-5 6-8). Tous les entiers sont positifs. La minute d'entrée sera inférieure ou égale au temps maximum possible (40 dans l'exemple).

La fonction doit renvoyer une autre chaîne indiquant la probabilité fractionnelle non réduite d'être dans chaque tâche à la minute donnée.

Exemples

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

Si votre langue n'a pas de chaînes ou de fonctions, vous pouvez utiliser des variables nommées, stdin / stdout, la ligne de commande ou ce qui semble le plus approprié.

Notation

C'est le golf de code. La solution la plus courte en octets l' emporte.


La question ne spécifie pas de distribution de probabilité particulière pour le temps passé sur chaque tâche. Doit-il être distribué normalement? Puis-je assumer la distribution que je veux?
feersum

1
@Calvin ce n'est pas une distribution normale. Peut-être que vous vouliez une distribution uniforme?
feersum

Chaque tâche comprend-elle la gauche |, la droite |ou la moitié de chacune?
Peter Taylor

Tous les problèmes mentionnés ont été résolus. D'autres problèmes?
Calvin's Hobbies

1
que se passe-t-il s'il y a une chance qu'aucune tâche ne se produise?
fier haskeller

Réponses:


3

CJam, 124115100 92 89 octets

Cela peut être beaucoup joué au golf, mais je dois dormir, alors affichez-vous maintenant :)

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

Essayez-le en ligne ici

L'entrée est comme:

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

Où le premier entier est la minute d'entrée et la deuxième chaîne est la séquence de plage de temps (comme indiqué dans les exemples de la question, juste sans le ,)

Sortie pour l'entrée mentionnée ci-dessus:

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

J'accepterai ceci si vous pouvez le faire suivre les règles mises à jour.
Calvin's Hobbies

Tous les autres exemples donnent 0/27.
Calvin's Hobbies

Maintenant, c'est un tas de `0/0.
Calvin's Hobbies

@ Calvin'sHobbies Prenons-le pour discuter: chat.stackexchange.com/rooms/18161/…
Optimizer

Tant pis, désolé, je donnais juste une mauvaise entrée.
Calvin's Hobbies

3

Mathematica, 237 216 octets

Je suis sûr que je peux raccourcir cela un peu, mais pas maintenant. Au moins, j'ai enfin pu utiliser les nouvelles associations de 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," "]<>"")&

Non golfé:

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

Utilisation telle que spécifiée dans le défi:

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

Il renvoie 0/1pour tous les éléments si la première entrée est supérieure à la durée maximale.


Je pense que ce Cases[]n'est pas nécessaire compte tenu du Tuplesfonctionnement. Si oui, alors t = Lookup[Counts[Join @@(FirstPosition[#, n_ /; n >= j] & /@ Accumulate /@ Tuples@i)], #, 0].
DavidC

Lookupet Countssont des ajouts bienvenus à la langue.
DavidC

@DavidCarraher Merci, mais j'ai dû passer à Flatten(au lieu de Join@@) car je FirstPositionpeux maintenant retourner Missing[NotFound]ce qui ne peut pas être joint.
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

courir comme ceci:

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

Exemple d'exécutions

      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

J'espère que vous ne vous occupez pas de l'espacement étrange


Il s'agit de 98 octets uniquement. APL a sa propre page de codes de sorte que tous ses symboles tiennent dans la plage ASCII.
Optimizer
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.