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.
źródło
|
, prawą|
lub połowę każdego z nich?Odpowiedzi:
CJam,
124 115 100 9289 bajtówMożna w to dużo grać w golfa, ale muszę spać, więc teraz sam się zamieszczam :)
Wypróbuj online tutaj
Dane wejściowe są jak:
Gdzie pierwsza liczba całkowita to minuta wejściowa, a druga to sekwencja zakresu czasu (jak pokazano w przykładach w pytaniu, tylko bez
,
)Dane wyjściowe dla wyżej wymienionych danych wejściowych:
źródło
0/27
.Mathematica,
237216 bajtówJestem pewien, że mogę to trochę skrócić, ale nie teraz. Przynajmniej w końcu mogłem skorzystać z nowych skojarzeń z Mathematica 10! :)
Nie golfowany:
Użycie określone w wyzwaniu:
Zwraca
0/1
wszystkie elementy, jeśli pierwsze wejście jest dłuższe niż maksymalny okres.źródło
Cases[]
nie jest to konieczne, biorąc pod uwagę, jak toTuples
działa. Jeśli tak, tot = Lookup[Counts[Join @@(FirstPosition[#, n_ /; n >= j] & /@ Accumulate /@ Tuples@i)], #, 0]
.Lookup
iCounts
są mile widzianymi dodatkami do języka.Flatten
(zamiastJoin@@
), ponieważFirstPosition
mogę teraz powrócić, doMissing[NotFound]
którego nie można się przyłączyć.Haskell, 232
biegnij tak:
źródło
APL, 162
Przykład działa
Mam nadzieję, że nie masz nic przeciwko dziwnym odstępom
źródło