Desafío
Dado un número de segundos después de la medianoche, emite el ángulo más pequeño entre dos manos en una esfera del reloj, utilizando la menor cantidad de bytes posible.
Puede suponer que el número de segundos siempre es menor que 86400. Los ángulos pueden representarse en grados o radianes.
Una solución de referencia está en: http://ideone.com/eVdgC0
Casos de prueba (resultados en grados)
0 -> 0
60 -> 0.5
600 -> 5
3600 -> 0
5400 -> 45
6930 -> 84.75
50000 -> 63.333
Clarificarions
- El reloj tiene 3 manecillas: horas, minutos y segundos.
- Todas las manecillas se mueven continuamente, por lo tanto, se pueden encontrar manecillas de hora y minutos entre graduaciones en la esfera del reloj.
Respuestas:
CJam,
3635343230 bytesLa salida está en radianes. He verificado las soluciones para todas las 86400 entradas posibles.
Pruébelo en línea en el intérprete de CJam .
Idea
Dado que 2π radianes es una vuelta completa, cada intervalo de minuto / segundo en el reloj es de 2π / 60 = π / 30 radianes de ancho.
Por lo tanto, dividiendo el número de segundos por π / 30 produce la posición de la manecilla de segundos.
La manecilla de minutos se mueve a la sexagésima parte del ritmo de la manecilla de segundos, dividiendo el resultado de arriba por 60 produce la posición de la manecilla de minutos.
Del mismo modo, dividiendo el último resultado por 12 produce la posición de la manecilla de la hora.
Tenga en cuenta que nuestros tres cocientes de arriba no están necesariamente en el rango [0,2π).
Al calcular las nueve diferencias posibles de los ángulos de las manos, obtenemos tres 0 (distancia angular entre una mano y sí mismo) y las seis distancias entre las diferentes manos.
Si las manos más cercanas están en una mitad que no incluye 12 , una de las diferencias de arriba será la salida deseada (mod 2π ).
Sin embargo, a las 01:55:30 (por ejemplo), la manecilla de la hora está en un ángulo de 1.008 rad (57.75 grados) y la manecilla de los minutos en un ángulo de 5.812 rad (333.00 grados) desde 12 , dando una diferencia de 4.804 rad (275,25 grados). Al restar este resultado de una vuelta completa, obtenemos el ángulo medido "en la otra dirección", que equivale a 1.479 rad (84.75 rad).
Ahora, en lugar de mapear cada ángulo θ en [0,2π) y restar condicionalmente el resultado de π , simplemente podemos calcular arccos (cos (θ)) , ya que cos es tanto periódico como par, y arccos siempre produce un valor en [ 0, π) .
Saltando los tres resultados más pequeños (todos cero), el cuarto más pequeño será el resultado deseado.
Código
Versión alternativa (34 bytes)
La salida está en grados y no se utilizan funciones trigonométricas.
Pruébelo en línea en el intérprete de CJam .
fuente
Mathematica, 40 bytes
Explicación: Sea el
t
número de segundos desde la medianoche. La posición de cada mano esPara calcular la distancia angular absoluta entre
x
grados yy
grados, podemos modificary - x
360 en el rango[-180, 180]
y luego tomar el valor absoluto. (Tenga en cuenta que no hay ninguna restricción enx
ey
.) Así que esta función solo calcula las diferencias por parest/10-t/120
,6t-t/10
y6t-t/120
, y lo hace.fuente
&
) y el primer argumento que se pasa se denomina adentro como#
.Python, 65
La distancia recorrida por hora, minuto y segundero, en unidades de 1/60 del círculo, son
h,m,s = n/720, n/60, n/1
. Podemos tomar estos mod 60 para obtener su posición en el círculo de0
a60
.Si tomamos su diferencia mod 60, obtenemos el número de unidades que una está frente a la otra. Tomamos las seis diferencias posibles, encontramos el mínimo y luego lo multiplicamos
6
para reescalar a360
grados.La comprensión de la lista de dos capas primero elige la primera mano como representada por
720
,60
o1
, luego, elige la otra mano de ese conjunto con la primera opción eliminada a través del conjunto xor.Probé esto exhaustivamente contra el código de referencia.
fuente
C #,
163152 bytesEsto crea cada mano dos veces para contar para envolver, luego recorre cada combinación y encuentra el ángulo mínimo entre manos. Los cálculos se realizan en 60 divisiones, luego se multiplican por 6 para obtener grados.
Sangrado por claridad:
Salida de ejemplo:
fuente
TI-BASIC, 17 bytes
Utiliza Dennis's
arccos(cos(
para normalizar distancias; sin embargo, en lugar de calcular todas las distancias por pares, solo calcula las tres necesarias usandoΔList([seconds],[minutes],[hours],[seconds]
.Este programa espera
Degree
modo y devuelve la respuesta en grados.EDITAR:
5!
es un byte más corto que120
.fuente