Załóżmy, że alarm budzi cię pewnego ranka, ale włączysz drzemkę, aby móc spać jeszcze 8 minut. Kiedy znów dzwoni, niechętnie wstajesz i bierzesz prysznic, który według ciebie zajmuje 15–17 minut. Następnie myjesz zęby dokładnie przez 2 minuty i ubierasz się, co zajmuje około 3 do 5 minut. Na koniec jesz pośpieszne śniadanie w ciągu 6-8 minut i wybiegasz za drzwi.
Możemy oznaczyć tę sekwencję czasową jako 8 15-17 2 3-5 6-8
.
Biorąc pod uwagę niepewność związaną z poranną rutyną, jakie jest prawdopodobieństwo wykonania każdego zadania w określonej liczbie minut od pierwszego przebudzenia?
Zakładając, że każde zadanie zajmuje całą liczbę minut, możemy sporządzić mapę każdej możliwej kombinacji niepewnych przedziałów czasowych (np. 3, 4 i 5 minut na mycie zębów). Ta tabela pokazuje wszystkie 27 możliwości, z czasem rosnącym w prawo, a każde zadanie N minut reprezentowane przez (N - 1) myślniki i jeden pionowy pasek, aby zaznaczyć jego zakończenie. Minuty granice występują między znakami, więc przestrzeń między kolumną 8
i zmienia się w .9
8 min 59 sec
9 min
1111111111222222222233333333334
1234567890123456789012345678901234567890 <-- Minute
-------|--------------|-|--|-----|
-------|--------------|-|--|------|
-------|--------------|-|--|-------|
-------|--------------|-|---|-----|
-------|--------------|-|---|------|
-------|--------------|-|---|-------|
-------|--------------|-|----|-----|
-------|--------------|-|----|------|
-------|--------------|-|----|-------|
-------|---------------|-|--|-----|
-------|---------------|-|--|------|
-------|---------------|-|--|-------|
-------|---------------|-|---|-----|
-------|---------------|-|---|------|
-------|---------------|-|---|-------|
-------|---------------|-|----|-----|
-------|---------------|-|----|------|
-------|---------------|-|----|-------|
-------|----------------|-|--|-----|
-------|----------------|-|--|------|
-------|----------------|-|--|-------|
-------|----------------|-|---|-----|
-------|----------------|-|---|------|
-------|----------------|-|---|-------|
-------|----------------|-|----|-----|
-------|----------------|-|----|------|
-------|----------------|-|----|-------|
1234567891111111111222222222233333333334 <-- Minute
0123456789012345678901234567890
Oczywiste jest, że rutyna mogła zająć maksymalnie 40 minut, a przynajmniej 34 minuty.
Pytanie brzmi, w konkretnej chwili, powiedzmy minutę 29, jaka jest szansa, że wykonałeś każde z 5 zadań? Załóżmy, że każdy niepewny przedział czasowy jest równomiernie rozłożony na dokładne całe minuty. Tak więc zadanie 4-7 ma 25% szansy na 4, 5, 6 lub 7 minut.
Z wykresu widać, że w 29 minucie nastąpił ...
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)
Podobnie w 1 minucie istniała 27/27
szansa, że drzemiesz 0/27
wszędzie.
Na przykład w 38 minucie 17 potencjalnych procedur już się zakończyło. Więc w 10 na 10 przypadków będziesz jeść. Oznacza to, że wyglądają prawdopodobieństwa
0/10 task 1, 0/10 task 2, 0/10 task 3, 0/10 task 4, 10/10 task 5
Wyzwanie
Napisz funkcję, która przyjmuje liczbę całkowitą dla wartości minuty, oraz ciąg znaków składający się z sekwencji pojedynczych liczb całkowitych lub par liczb całkowitych a-b
z b
> a
, wszystkie oddzielone spacjami (podobnie jak 8 15-17 2 3-5 6-8
). Wszystkie liczby całkowite są dodatnie. Minuta wejściowa będzie mniejsza lub równa maksymalnemu możliwemu czasowi (na przykład 40).
Funkcja powinna zwrócić kolejny ciąg oznaczający nieredukowaną ułamkową szansę bycia w każdym zadaniu w danej minucie.
Przykłady
myfunc(29, "8 15-17 2 3-5 6-8")
zwraca ciąg0/27 0/27 0/27 24/27 3/27
myfunc(1, "8 15-17 2 3-5 6-8")
zwraca ciąg27/27 0/27 0/27 0/27 0/27
myfunc(38, "8 15-17 2 3-5 6-8")
zwraca ciąg0/10 0/10 0/10 0/10 10/10
myfunc(40, "8 15-17 2 3-5 6-8")
zwraca ciąg0/1 0/1 0/1 0/1 1/1
Jeśli twój język nie ma ciągów ani funkcji, możesz użyć nazwanych zmiennych, stdin / stdout, linii poleceń lub cokolwiek, co wydaje się najbardziej odpowiednie.
Punktacja
To jest kod golfowy. Najkrótsze rozwiązanie w bajtach wygrywa.
|
, prawą |
lub połowę każdego z nich?