Ustawić
Załóżmy, że masz n bezpieczników, z 1 ≤ n ≤ 5, z których każdy ma metr długości, a każdy bezpiecznik ma powiązaną szybkość spalania N metrów na D godzin.
Bezpiecznik można zapalić na jednym lub obu końcach, a następnie zgasić na jednym lub obu końcach, ponownie zapalić, ponownie zgasić itp. Tyle razy, ile potrzeba, aż do pełnego zużycia bezpiecznika. Jesteś w stanie natychmiast zapalić i zgasić bezpieczniki, i możesz obserwować dokładnie moment, w którym bezpiecznik jest całkowicie zużyty (spalony).
Bezpiecznik nie mogą być cięte ani nie może się świecić wszędzie z wyjątkiem na jego końcach.
Taka konfiguracja pozwala na nieskończenie dokładny system pomiaru czasu, mierząc czas między dowolnymi dwoma zapaleniami / zużyciem bezpiecznika. Na przykład, biorąc pod uwagę dwa bezpieczniki o szybkości spalania 1 metr na godzinę, możesz zmierzyć dokładnie 45 minut (3/4 godziny) przez
- jednocześnie: zapalając pierwszy bezpiecznik na obu końcach, zapalając drugi bezpiecznik na jednym końcu i zaznaczając początek przedziału czasowego
- zapalanie drugiego końca drugiego bezpiecznika w momencie, gdy pierwszy bezpiecznik zostanie zużyty (30 minut później)
- oznaczenie końca przedziału czasowego w momencie, gdy drugi bezpiecznik zostanie zużyty (15 minut później)
Wyzwanie
Biorąc pod uwagę ułamkową liczbę godzin t oraz zbiór n ułamków reprezentujących dokładne prędkości spalania n bezpieczników, napisz program lub funkcję, która generuje / zwraca prawdziwą wartość, jeśli t godziny można dokładnie zmierzyć poprzez systematyczne spalanie bezpieczników lub inaczej wartość fałsz.
Dane wejściowe do programu mogą być dowolne z poniższych:
- argumenty wiersza polecenia formularza
TN/TD N1/D1 N2/D2 N3/D3 ...
- ciąg formularza
TN/TD N1/D1 N2/D2 N3/D3 ...
odczytany zstdin
lub równoważny - ciąg formularza
TN/TD N1/D1 N2/D2 N3/D3 ...
przekazany jako argument funkcji - tablica ciągów
["TN/TD", "N1/D1", "N2/D2", "N3/D3", ...]
przekazywanych jako argument funkcji
We wszystkich przypadkach , T = TN
/ TD
, w którym TN
, TD
∈ [1,10000].
Podobnie we wszystkich przypadkach: szybkość spalania bezpiecznika i = N i / D i = N<i>
/ D<i>
, gdzie N<i>
, D<i>
[1,10] ∀ i .
Możesz założyć, że zawsze będzie od 1 do 5 bezpieczników (włącznie) i że wszystkie dane wejściowe są prawidłowe i znajdują się w zasięgu. Możesz również założyć, że wszystkie ułamki wejściowe podano w najniższych kategoriach.
Nie można używać liczb zmiennoprzecinkowych z elementami ułamkowymi dla tego wyzwania. Oznacza to, że jeśli użyjesz liczb zmiennoprzecinkowych w dowolnym miejscu aplikacji, mogą one przyjmować tylko wartości całkowite z zerowym składnikiem ułamkowym.
Punktacja
Jest to wyzwanie polegające na grze w golfa , dlatego wygrana zostanie przyznana za najkrótszą zgodność w bajtach.
Przykładowe wejścia / wyjścia
input: 29/6 3/2 2/3 3/5 3/7 7/5
output: true
One solution:
- light both ends of fuse 1, mark start of interval
- on fuse 1 consumption: light both ends of fuse 2, light one end of fuse 5
- on fuse 5 consumption: extinguish one end of fuse 2, light both ends of fuse 3,
light both ends of fuse 4
- on fuse 2 consumption: extinguish one end of fuse 3, extinguish both ends of
fuse 4
- on fuse 3 consumption: relight one end of fuse 4
- on consumption of fuse 4: mark end of interval (29/6 hours)
input: 2/1 3/1 5/1 7/1
output: false
input: 5/1 6/1 1/6 9/1 1/9
output: true
One solution:
- light fuse 1 at one end, light fuse 2 at both ends, light fuse 4 at both ends
- on fuse 1 consumption: extinguish one end of fuse 2, mark start of interval
- on fuse 4 consumption: relight one end of fuse 2
- on fuse 2 consumption: mark end of interval (5 hours)
Miłego łączenia! :)