Mi reloj despertador
Soy estadounidense, y también lo es mi despertador (digital). Para configurar la alarma, comienza en el momento en que era anteriormente. Al presionar el botón de la hora se mueve hacia arriba una hora, y al presionar el botón de los minutos se sube un minuto. Al presionar ambos botones al mismo tiempo, se restablece a la medianoche (12:00 a.m.) y cuenta como dos pulsaciones de botón.
Cuando las horas exceden su límite (12), se restablece a 1 y alterna la luz AM / PM. Cuando los minutos exceden su límite (59), se restablecen a 0, sin afectar las horas.
La tarea
Su tarea es, dada una hora de inicio y una hora objetivo, generar el número óptimo de pulsaciones de botones necesarias para configurar mi alarma en la hora objetivo.
Puede tomar información en el formato que más le convenga. Los únicos datos que su programa debería necesitar son horas y minutos, para ambas entradas. Eso significa que usted, por ejemplo, puede tomar los datos en milisegundos desde la época, y extraer las horas y minutos, pero no puede codificar nada en el año, mes, segundo, etc. Tenga en cuenta que si bien puede, por ejemplo, ingresar "hora militar" (u hora regular para la mayor parte del mundo), pero eso no cambia la forma en que funciona mi reloj.
Ejemplos
1:15 pm -> 2:30 am
Puede presionar ambos botones para restablecer a las 12:00 a.m., luego aumentar a las 2:30 a.m., que serían 2+2+30 = 34
presionar botones. También puede aumentar a las 2:30 am, que serían 13+15 = 28
presionar botones. Por lo tanto, su salida es 28
.
3:58 am -> 4:02 am
Puede restablecer e incrementar, que serían 2+4+2 = 8
presionar botones. También podría aumentar, que serían 1+4 = 5
presionar botones. Por lo tanto, su salida es 5
.
10:55 pm -> 1:00 am
Puede restablecer e incrementar, que serían 2+1 = 3
presionar botones. También podría aumentar, que serían 3+5=8
presionar botones. Por lo tanto, su salida es 3
.
1:00 am -> 1:59 pm
Puede reiniciar e incrementar, pero eso sería tres prensas más que solo aumentar. Por lo tanto, su salida es 12+59 =
71
.
Casos de prueba
Current Target = Output
1:15pm 2:30am = 28
3:58am 4:02am = 5
10:55pm 1:00am = 3
1:00am 1:59pm = 71
12:00am 12:00am = 0
6:51pm 12:00am = 2
2:01pm 11:00pm = 25
2:01pm 11:01pm = 9
12:59am 12:01am = 2
11:50am 12:00pm = 11
fuente
Respuestas:
Casco , 16 bytes
Pruébalo en línea!
Toma los argumentos como dos listas [horas, minutos], para la hora de inicio y finalización, en formato de 24 horas.
Estoy bastante contento con lo mucho que pude jugar este golf, me parece interesante cómo se manejan los argumentos en esta composición de funciones.
La función que calcula cuántas pulsaciones de teclas necesitamos si no se permite restablecer es la siguiente:
La parte interesante es que, dado que el resto de esta solución solo puede funcionar con una sola lista como argumento, esta se aplica parcialmente al primer argumento de todo el programa, "comiéndola" y dejando solo el segundo argumento visible tanto para sí mismo como para él. El resto del programa.
A continuación, calculamos cuántas pulsaciones de teclas necesitamos si restablecemos el tiempo a 0:00
Como se dijo antes, esto opera solo en el segundo argumento (el tiempo final), y calcula
hours+minutes+2
, solo de una manera más golfista.Finalmente,
§▼
es la parte que pasa el segundo argumento a ambas funciones y devuelve el menor de los dos resultados.fuente
JavaScript (ES6),
7356545250 bytesUtiliza formato de 24 horas. Toma la entrada como 4 enteros que representan las horas y minutos de cada vez.
Intentalo
Ingrese las horas en formato de 24 horas, con el
:
separador.Explicación
(Se actualizará en breve).
Función anónima teniendo los enteros como argumentos a través de parámetros
g
,l
,h
ym
, dondeg
yl
son, respectivamente, las horas y minutos de la hora actual yh
Ym
son las horas y minutos de la hora de destino.Primero, calculamos cuántas pulsaciones de botón son necesarias si solo reiniciamos el reloj, que es simplemente 2 (para el reinicio) más la hora objetivo y el minuto objetivo.
A continuación, calculamos cuántas pulsaciones de botón son necesarias para alcanzar la hora objetivo. Hacemos esto restando la hora actual de la hora objetivo. Sin embargo, si la hora actual es menor que el objetivo, esto nos dará un número negativo, por lo que rectificaremos al sumar 24 multiplicado al verificar si
h<g
(que devuelve un valor booleano pero se convierte implícitamente en entero1
, si es verdadero o0
si es falso por el Operaciones matemáticas.Usamos una fórmula similar para calcular el número de prensas para llegar desde el minuto actual al minuto objetivo y agregarlo a las prensas de hora.
Finalmente, obtenemos el mínimo de los 2 números para darnos nuestro resultado.
fuente
(h-g+24)%24+(m-l+60)%60
?Pyth , 29 bytes
Este desafío obviamente no beneficia los idiomas de golf, por eso es tan largo. Por otro lado, esto se mejora por el hecho de que Pyth está basado en Python, por lo que podemos abusar de su módulo negativo.
Banco de pruebas. Los números en Pyth no admiten ceros a la izquierda.
fuente
Jalea , 19 bytes
Pruébalo en línea!
Ingrese como 4 enteros (hora final, minuto final, hora inicial, minuto inicial)
fuente
C # (.NET Core) , 56 bytes
Pruébalo en línea!
Muy similar a la respuesta de Javascript. Los bools en C # no se convierten fácilmente en números, por lo que, en lugar de hacerlo
[diff]+24*(H<h)
, lo([diff]+24)%24
que efectivamente hace lo mismo.fuente
2+h+m
de -2 bytes.(H,M,h,m)=>Math.Min((h+24-H)%24+(m+60-M%60),2+h+m)
System.Math.Min
?Haskell, 41 bytes
Muy claro. Toma la entrada como cuatro argumentos usando el tiempo de 24 horas: hora final, minuto final, hora de inicio, minuto de inicio.
fuente
Python 3 , 43 bytes
Pruébalo en línea!
Ingrese como 4 enteros (hora de inicio, minuto de inicio, hora de finalización, minuto de finalización)
fuente
2 01 11 00
? En su respuesta, ¿cómo determina si es el momentoAM
oPM
si no lo toma como entrada?13
esa entrada usando el TIO, que es correcto (reinicio + 11 <9 + 59).%
Siempre devuelve un número positivo en Python?%
.1%24
=1
,1%-24
=-23
. Es muy útil para esta pregunta.Java 8,
5450 bytesPuerto de la respuesta C # de @KamilDrakari (después de jugar golf
26 bytes).Explicación:
Pruébalo aquí
fuente
Perl 5 , 71 +2 (-ap) = 73 bytes
Pruébalo en línea!
Toma datos en formato de 24 horas (hora militar), separados por espacios, hora de inicio primero, hora de finalización segundo: HH MM hh mm
fuente
Retina , 106 bytes
Pruébalo en línea! El enlace incluye casos de prueba. Toma la entrada como tiempos actuales y deseados en un tiempo regular de 24 horas con un espacio que separa los dos tiempos. Explicación:
Convierte a unario.
Esto hace dos cosas; agrega 24 horas y 60 minutos a las horas y minutos deseados, y también agrega 2 a la suma de las horas y minutos deseados originales, es decir, el número de pulsaciones de botón para establecer usando un reinicio.
Reste las horas actuales de las horas deseadas y reste las 24 que agregamos si podemos.
Del mismo modo para los minutos. Esto también agrega los dos resultados juntos.
Si el número de pulsaciones para configurar con la hora actual es mayor que el número de pulsaciones para configurar con un reinicio, elimínelo.
Convierta el primer número restante de nuevo a decimal.
fuente