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 8
et 9
se 8 min 59 sec
transforme 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/27
chance que vous somnoliez 0/27
partout 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-b
avec 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îne0/27 0/27 0/27 24/27 3/27
myfunc(1, "8 15-17 2 3-5 6-8")
renvoie la chaîne27/27 0/27 0/27 0/27 0/27
myfunc(38, "8 15-17 2 3-5 6-8")
renvoie la chaîne0/10 0/10 0/10 0/10 10/10
myfunc(40, "8 15-17 2 3-5 6-8")
renvoie la chaîne0/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 droite |
ou la moitié de chacune?