Wyzwanie
Biorąc pod uwagę liczbę sekund po północy, wyprowadzaj najmniejszy kąt między dowolnymi dwoma wskazówkami na tarczy zegara, używając możliwie jak najmniej bajtów.
Możesz założyć, że liczba sekund jest zawsze mniejsza niż 86400. Kąty mogą być reprezentowane w stopniach lub radianach.
Rozwiązanie referencyjne znajduje się na stronie: http://ideone.com/eVdgC0
Przypadki testowe (wyniki w stopniach)
0 -> 0
60 -> 0.5
600 -> 5
3600 -> 0
5400 -> 45
6930 -> 84.75
50000 -> 63.333
Clarificarions
- Zegar ma 3 wskazówki: godziny, minuty i sekundy.
- Wszystkie wskazówki poruszają się w sposób ciągły, dlatego wskazówki godzinowe i minutowe można znaleźć między podziałkami na tarczy zegara.
Odpowiedzi:
CJam,
3635343230 bajtówDane wyjściowe są w radianach. Sprawdziłem rozwiązania dla wszystkich 86400 możliwych wejść.
Wypróbuj online w interpretatorze CJam .
Pomysł
Ponieważ 2π radianów to pełne okrążenie, każda minuta / sekunda na zegarze ma szerokość 2π / 60 = π / 30 radianów.
Tak więc podzielenie liczby sekund przez π / 30 daje pozycję drugiej ręki.
Wskazówka minutowa porusza się o jedną szóstą tempa drugiej ręki, więc podzielenie wyniku z góry przez 60 daje pozycję wskazówki minutowej.
Podobnie podzielenie ostatniego wyniku przez 12 daje pozycję wskazówki godzinowej.
Zauważ, że nasze trzy iloraz z góry niekoniecznie mieszczą się w przedziale [0,2π).
Obliczając wszystkie dziewięć możliwych różnic kątów rąk, otrzymujemy trzy 0 (odległość kątowa między dłonią a sobą) i sześć odległości między różnymi rękami.
Jeśli najbliższe ręce znajdują się na połowie, która nie obejmuje 12 , jedną z różnic z góry będzie pożądana moc wyjściowa (mod 2π ).
Jednak o 01:55:30 (na przykład) wskazówka godzinowa znajduje się pod kątem 1,008 rad (57,75 stopni), a wskazówka minutowa pod kątem 5,812 rad (333,00 stopni) od 12 , co daje różnicę 4,804 rad (275,25 °). Odejmując ten wynik od pełnego okrążenia, otrzymujemy kąt zmierzony „w innym kierunku”, który wynosi 1,479 rad (84,75 rad).
Teraz, zamiast mapować każdy kąt θ w [0,2π) i warunkowo odejmować wynik od π , możemy po prostu obliczyć arccos (cos (θ)) , ponieważ cos jest zarówno okresowe, jak i parzyste, a arccos zawsze daje wartość w [ 0, π) .
Pomijając trzy najmniejsze wyniki (wszystkie zero), czwarta najmniejsza będzie pożądanym wynikiem.
Kod
Alternatywna wersja (34 bajty)
Dane wyjściowe wyrażone są w stopniach i nie są używane żadne funkcje trygonometryczne.
Wypróbuj online w interpretatorze CJam .
źródło
Mathematica, 40 bajtów
Objaśnienie: Niech
t
będzie liczba sekund od północy. Pozycja każdej ręki toAby obliczyć bezwzględną odległość kątową między
x
stopniami iy
stopniami, możemy zmienićy - x
o 360 stopni w zakresie,[-180, 180]
a następnie przyjąć wartość bezwzględną. (Należy pamiętać, że nie ma ograniczeńx
iy
.), Więc funkcja ta po prostu oblicza różnice w paracht/10-t/120
,6t-t/10
i6t-t/120
i robi.źródło
&
), a pierwszy argument, który przekazano, jest nazywany wewnątrz#
.Python, 65
Dystans pokonany przez godzinę, minutę i wskazówkę sekundową, w jednostkach 1/60 koła, wynosi
h,m,s = n/720, n/60, n/1
. Możemy wziąć te mod 60, aby uzyskać ich pozycję na okręgu od0
do60
.Jeśli weźmiemy ich różnicę mod 60, otrzymamy liczbę jednostek, które jedna jest przed drugą. Bierzemy wszystkie sześć możliwych różnic, znajdujemy min, a następnie mnożymy przez
6
aby przeskalować do360
stopni.Dwuwarstwowe rozumienie listy najpierw wybiera pierwszą rękę reprezentowaną przez
720
,60
lub1
, a następnie wybiera drugą rękę z tego zestawu, a pierwszy wybór jest usuwany za pomocą zestawu xor.Dokładnie przetestowałem to pod kątem kodu referencyjnego.
źródło
DO#,
163152 bajtyTworzy to każdą rękę dwa razy, aby liczyć na zawijanie, a następnie przechodzi przez każdą kombinację i znajduje minimalny kąt między rękami. Obliczenia są wykonywane w 60 działach, a następnie mnożone przez 6, aby uzyskać stopnie.
Wcięte dla jasności:
Przykładowe dane wyjściowe:
źródło
TI-BASIC, 17 bajtów
Używa Dennisa
arccos(cos(
do normalizacji odległości; jednak zamiast obliczać wszystkie odległości parami, oblicza tylko trzy potrzebne za pomocąΔList([seconds],[minutes],[hours],[seconds]
.Ten program oczekuje
Degree
trybu i zwraca odpowiedź w stopniach.EDYCJA:
5!
jest o jeden bajt krótszy niż120
.źródło