CJam, 36 35 34 32 30 bajtów
riP*30/_60/_C/]2m*::-:mc:mC$3=
Dane 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
ri e# Read an integer from STDIN.
P*30/ e# Multiply by π and divide by 30.
_60/ e# Divide a copy by 60.
_C/ e# Divide a copy by 12.
]2m* e# Push the array of all pairs of quotients.
::- e# Replace each pair by its difference.
:mc e# Apply cosine to each difference.
:mC e# Apply arccosine to each cosine.
$3= e# Sort and select the fourth smallest element.
Alternatywna wersja (34 bajty)
rd6*_60/_C/]360f%2m*::m360X$f-+$6=
Dane wyjściowe wyrażone są w stopniach i nie są używane żadne funkcje trygonometryczne.
Wypróbuj online w interpretatorze CJam .