CJam, 36 35 34 32 30 byte
riP*30/_60/_C/]2m*::-:mc:mC$3=
L'output è in radianti. Ho verificato le soluzioni per tutti gli 86400 possibili input.
Provalo online nell'interprete CJam .
Idea
Poiché i radianti 2π sono un giro completo, ogni intervallo minuto / secondo dell'orologio è largo 2π / 60 = π / 30 radianti.
Pertanto, dividendo il numero di secondi per π / 30 si ottiene la posizione della lancetta dei secondi.
La lancetta dei minuti si sposta di un sessantesimo del ritmo della lancetta dei secondi, quindi dividendo il risultato dall'alto per 60 si ottiene la posizione della lancetta dei minuti.
Allo stesso modo, dividendo l'ultimo risultato per 12 si ottiene la posizione della lancetta delle ore.
Si noti che i nostri tre quozienti dall'alto non sono necessariamente nell'intervallo [0,2π).
Calcolando tutte e nove le possibili differenze degli angoli delle mani, otteniamo tre 0 (distanza angolare tra una mano e se stessa) e le sei distanze tra le diverse mani.
Se le mani più vicine sono su una metà che non include 12 , una delle differenze dall'alto sarà l'output desiderato (mod 2π ).
Tuttavia, alle 01:55:30 (ad esempio), la lancetta delle ore si trova ad un angolo di 1,008 rad (57,75 gradi) e la lancetta dei minuti ad un angolo di 5,812 rad (333,00 gradi) da 12 , dando una differenza di 4,804 rad (275,25 gradi). Sottraendo questo risultato da un giro completo, otteniamo l'angolo misurato "nell'altra direzione", che equivale a 1.479 rad (84.75 rad).
Ora, invece di mappare ogni angolo θ in [0,2π) e sottrarre condizionalmente il risultato da π , possiamo semplicemente calcolare arccos (cos (θ)) , poiché cos è sia periodico che uniforme, e arccos produce sempre un valore in [ 0, π) .
Saltando i tre risultati più piccoli (tutti zero), il quarto più piccolo sarà l'output desiderato.
Codice
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.
Versione alternativa (34 byte)
rd6*_60/_C/]360f%2m*::m360X$f-+$6=
L'output è in gradi e non vengono utilizzate funzioni trigonometriche.
Provalo online nell'interprete CJam .