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 source
|
, la droite|
ou la moitié de chacune?Réponses:
CJam, 124115100
9289 octetsCela peut être beaucoup joué au golf, mais je dois dormir, alors affichez-vous maintenant :)
Essayez-le en ligne ici
L'entrée est comme:
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:
la source
0/27
.Mathematica,
237216 octetsJe 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! :)
Non golfé:
Utilisation telle que spécifiée dans le défi:
Il renvoie
0/1
pour tous les éléments si la première entrée est supérieure à la durée maximale.la source
Cases[]
n'est pas nécessaire compte tenu duTuples
fonctionnement. Si oui, alorst = Lookup[Counts[Join @@(FirstPosition[#, n_ /; n >= j] & /@ Accumulate /@ Tuples@i)], #, 0]
.Lookup
etCounts
sont des ajouts bienvenus à la langue.Flatten
(au lieu deJoin@@
) car jeFirstPosition
peux maintenant retournerMissing[NotFound]
ce qui ne peut pas être joint.Haskell, 232
courir comme ceci:
la source
APL, 162
Exemple d'exécutions
J'espère que vous ne vous occupez pas de l'espacement étrange
la source