Défi
Étant donné un certain nombre de secondes après minuit, affichez le plus petit angle entre deux aiguilles sur un cadran d'horloge en utilisant le moins d'octets possible.
Vous pouvez supposer que le nombre de secondes est toujours inférieur à 86 400. Les angles peuvent être représentés en degrés ou en radians.
Une solution de référence se trouve sur: http://ideone.com/eVdgC0
Cas de test (résultats en degrés)
0 -> 0
60 -> 0.5
600 -> 5
3600 -> 0
5400 -> 45
6930 -> 84.75
50000 -> 63.333
Clarifications
- L'horloge a 3 aiguilles: heures, minutes et secondes.
- Toutes les aiguilles bougent continuellement, ainsi les aiguilles des heures et des minutes peuvent être trouvées entre les graduations sur le cadran de l'horloge.
Réponses:
CJam,
3635343230 octetsLa sortie est en radians. J'ai vérifié les solutions pour toutes les 86400 entrées possibles.
Essayez-le en ligne dans l' interpréteur CJam .
Idée
Étant donné que 2π radians est un tour complet, chaque intervalle minute / seconde sur l'horloge a une largeur de 2π / 60 = π / 30 radians.
Ainsi, la division du nombre de secondes par π / 30 donne la position de la trotteuse.
L'aiguille des minutes se déplace à un soixantième du rythme de l'aiguille des secondes, donc diviser le résultat par le haut par 60 donne la position de l'aiguille des minutes.
De même, la division du dernier résultat par 12 donne la position de l'aiguille des heures.
Notez que nos trois quotients ci-dessus ne sont pas nécessairement dans la plage [0,2π).
En calculant les neuf différences possibles d'angles des mains, nous obtenons trois 0 (distance angulaire entre une main et elle-même) et les six distances entre les différentes mains.
Si les mains les plus proches sont sur une moitié qui n'inclut pas 12 , l'une des différences par rapport au dessus sera la sortie souhaitée (mod 2π ).
Cependant, à 01:55:30 (par exemple), l'aiguille des heures est à un angle de 1,008 rad (57,75 degrés) et l'aiguille des minutes à un angle de 5,812 rad (333,00 degrés) de 12 , ce qui donne une différence de 4,804 rad (275,25 degrés). En soustrayant ce résultat d'un tour complet, nous obtenons l'angle mesuré "dans l'autre sens", ce qui équivaut à 1,479 rad (84,75 rad).
Maintenant, plutôt que de cartographier chaque angle θ dans [0,2π) et de soustraire conditionnellement le résultat de π , nous pouvons simplement calculer arccos (cos (θ)) , car cos est à la fois périodique et pair, et arccos donne toujours une valeur dans [ 0, π) .
En sautant les trois plus petits résultats (tous à zéro), le quatrième plus petit sera la sortie souhaitée.
Code
Version alternative (34 octets)
La sortie est en degrés et aucune fonction trigonométrique n'est utilisée.
Essayez-le en ligne dans l' interpréteur CJam .
la source
Mathematica, 40 octets
Explication: Soit
t
un nombre de secondes depuis minuit. La position de chaque main estPour calculer la distance angulaire absolue entre
x
degrés ety
degrés, nous pouvons modifiery - x
de 360 degrés dans la plage[-180, 180]
, puis prendre la valeur absolue. (Notez qu'il n'y a aucune restriction surx
ety
.) Donc, cette fonction calcule simplement les différences par pairet/10-t/120
,6t-t/10
et6t-t/120
et le fait.la source
&
) et le premier argument qui lui est transmis est appelé à l'intérieur#
.Python, 65
La distance parcourue par les heures, les minutes et les secondes, en unités de 1/60 du cercle, est
h,m,s = n/720, n/60, n/1
. On peut prendre ces mod 60 pour obtenir leur position sur le cercle de0
à60
.Si on prend leur différence mod 60, on obtient le nombre d'unités que l'une est devant l'autre. Nous prenons les six différences possibles, trouvons le min, puis multiplions par
6
pour redimensionner en360
degrés.La compréhension de liste à deux couches choisit d'abord la première main comme représenté par
720
,60
ou1
, puis choisit l'autre main de cet ensemble avec le premier choix supprimé via l'ensemble xor.J'ai testé cela de manière exhaustive par rapport au code de référence.
la source
C #,
163152 octetsCela crée chaque main deux fois pour compter pour l'encerclement, puis parcourt chaque combinaison et trouve l'angle minimum entre les mains. Les calculs sont effectués en 60 divisions, puis multipliés par 6 pour obtenir des degrés.
En retrait pour plus de clarté:
Exemple de sortie:
la source
TI-BASIC, 17 octets
Utilise Dennis
arccos(cos(
pour normaliser les distances; cependant, plutôt que de calculer toutes les distances par paires, il ne calcule que les trois nécessaires en utilisantΔList([seconds],[minutes],[hours],[seconds]
.Ce programme attend le
Degree
mode et renvoie la réponse en degrés.EDIT:
5!
est un octet plus court que120
.la source