Desde que vi el primero hace unos años, siempre me subyugó este tipo de reloj de palabras en el que el tiempo se deletrea con palabras que se iluminan o no en una oración significativa.
El texto que se muestra en ese reloj es el siguiente.
IT IS HALF TEN
QUARTER TWENTY
FIVE MINUTES TO
PAST TWO THREE
ONE FOUR FIVE
SIX SEVEN EIGHT
NINE TEN ELEVEN
TWELVE O'CLOCK
Su tarea es escribir un reloj que funcione. Las palabras se iluminan si y solo si son relevantes para imprimir la hora actual. De lo contrario, están encendidos. Las palabras se "iluminan" al imprimirse y se "iluminan" al ser reemplazadas por varios espacios que son la longitud de la palabra.
Ejemplo: si la hora actual es 17:23, el texto impreso debe ser exactamente el siguiente:
IT IS
TWENTY
FIVE MINUTES
PAST
FIVE
Reglas
- El tiempo impreso es la variante 12h, pero sin AM / PM.
- El redondeo se realiza en base a minutos solamente (los segundos son totalmente irrelevantes). El redondeo se realiza al múltiplo más cercano de 5. Entonces, por ejemplo, aunque 17:52:38 realmente es más cercano a 17:55, pero dado que los segundos son irrelevantes, 17:52 se redondea a 17:50, y el texto impreso es "ES DIEZ MINUTOS A SEIS" (con espacios relevantes). Entonces, si
XX
es un múltiplo de cinco,XX
se utilizará desde HH: (XX-2): 00 hasta HH: (XX + 2): 59. La palabraMINUTES
debe aparecer siFIVE
,TEN
oTWENTY
se iluminan en la sección minutos (antes de "A" o "pasado"). - Todas las palabras irrelevantes se reemplazan por tantos espacios como sea necesario para mantener el texto donde se encuentra en la plantilla de arriba. Los espacios finales pueden recortarse. Deben mantenerse los espacios relevantes para mantener el texto en la posición esperada.
Las líneas finales también se pueden recortar. Las líneas vacías relevantes aún deben aparecer. Ejemplo:
IT IS TEN MINUTES PAST TWO
No encienda
TEN
en la primera línea oFIVE
en la tercera línea cuando estos valores se refieren a las horas.- Puede aceptar una entrada. Si acepta una entrada, la entrada será el momento de imprimir en cualquier formato válido que desee (cadena, lista de enteros, hora nativa, escriba su soporte de idioma, ...), pero no se permiten parámetros si no están relacionados a la hora de imprimir. Si no admite ninguna entrada, debe usar la hora actual. Si admite ambos, eso es mejor, pero no hay bonificación;)
- Su código puede ser un programa, una función, un lambda pero no un fragmento.
- Si su idioma admite la impresión de alguna manera, debe imprimir el resultado (en un archivo, en la salida estándar, no me importa). Si su idioma no admite la impresión de ninguna manera, se le permite simplemente "devolver" el texto esperado. El resultado puede ser todo en mayúsculas o todas en minúsculas, no una mezcla de ambos.
- Se aplican lagunas estándar.
- Este es el código de golf, por lo que gana el código más corto.
- En la medida de lo posible, proporcione un enlace a un intérprete en línea de su idioma.
Casos de prueba
Input: <no input> (the current local time is 19:20)
Output:
IT IS
TWENTY
MINUTES
PAST
SEVEN
Input: 13:15
Output: (empty line is being printed)
IT IS
QUARTER
PAST
ONE
Input: 13:58
Output: (rounding)
IT IS
TWO
O'CLOCK
Input: 14:30
Output: (half is always a edge-case)
IT IS HALF
PAST TWO
Input: 15:35
Output: (light up "TO")
IT IS
TWENTY
FIVE MINUTES TO
FOUR
Input: 10:00
Output: (do not use the TEN or FIVE on the first line when referring to the hours)
IT IS
TEN
O'CLOCK
Input: 12:00
Output: (O'CLOCK and a lot of empty lines)
IT IS
TWELVE O'CLOCK
Respuestas:
PHP,
387384353352342323310306298293291 bytes¡Gracias @Christoph por jugar al golf junto con sus excelentes hallazgos!
Al menos 45 bytes están en su cuenta; 16 o más inspirados por él.
¡Un equipo de Marvel!
recorre los datos y comprueba si el índice actual está en una cadena generada que contiene los índices de las palabras a iluminar (asignadas a letras); agrega salto de línea o espacio según el índice.
Puede generar avisos si no utiliza el valor predeterminado para
error_reporting
(22519).Pruébelo en línea.
Descompostura
Golfs :
$x/5+.5|0
es dos bytes más corto queround($x/5)
.date(h)
son un byte más corto que asignar eldate
resultado a una variable.$w<A
es tres bytes más corto que$w=="\n"
: ¡asegúrese de que no haya espacio después de un delimitador!abs
guardado 8 bytes en la palabra minutos.El uso de guión bajo como el primer índice permitió incluirlo en las alternativas "es"; e hizo obsoleta la cotización de las horas.
1
valor en el mapa de horas hizo que el módulo quedara obsoleto y que con el golf adicional ahorrara 10 bytes. Inspirado por @Christoph.str_pad("",strlen($w))
->$w^$w^" "
. (Christoph)strtr
el segundo parámetro no es una cadena, se interpretará como un código ascii. ahorra 5 bytes.fuente
$i++%3^($i<3)
a$i++%3^$i<3
. Estoy oficialmente completamente perdido ahora. Me tomaré un descanso hasta que alguien nos iguale. Fue realmente divertido. ¡Gracias Titus por tu trabajo en equipo!TI-Basic,
335334 bytesBastante perfecto, ya que las calculadoras TI-84 tienen pantallas de letras 8x16, y esto es 8x15. La fecha se toma como entrada para admitir cálculos anteriores a TI-84, que no tienen relojes internos. Sin argumentos,
Input
obtiene entrada por defecto enX
yY
, similar aPrompt X,Y
. Así que hagaX
horas (cualquier cosa>=0
funcionará correctamente) y tengaY
minutos.Nota 1: para TI-84 + puede reemplazar
Input
con algo comogetTime:Ans(1->X:getTime:Ans(2->Y
. Además,int(Y/5-5.6
es equivalente around(Y/5,0)-6
. Y no, en este casoint(
no se podría intercambiariPart(
.Nota 2: Esto imprime la entrada bien, pero por razones estéticas probablemente desee
Pause
al final del programa evitar elDone
mensaje al finalizar el programa.Editar: el recuento de bytes se redujo porque está tokenizado (ver nota en la revisión anterior), también se corrigió un error gracias a @Neil. En tercer lugar, solucioné un error que encontré que habría costado 2 bytes, pero la optimización en realidad ahorró 1 byte en general, y también me di cuenta de que estoy recibiendo información para que no necesite llamar
getTime
(¿duh?) Por último, para cualquiera que quiera confirmar este recuento de bytes, el único token de dos bytes essub(
.fuente
O'CLOCK
el código también se emitiráPAST
...x+(y>32) mod 12
si la comparación arroja 1 o 0 como en TI-Basic.JavaScript (ES6),
291303295 bytesToma la entrada como dos enteros con sintaxis curry
(h)(m)
Cómo funciona
El reloj completo puede verse como 23 LED que están encendidos o apagados. Entonces, el estado del reloj es un entero de 23 bits.
La lógica de minutos que necesitamos implementar para habilitar las palabras correctas no es tan simple como podría pensarse a primera vista. Puede existir una fórmula de golf mágico, pero tomé el camino fácil y decidí codificar cada configuración posible:
Casos de prueba
Mostrar fragmento de código
fuente
Lote, 789 bytes
Nota: Espacio
PAST
final después y 5 espacios finales en cada una de las dos líneas siguientes.fuente
call:c
por ejemplo)! Probablemente debería aprender algo :)JavaScript,
567 564 551 542 529 527519 bytesMostrar fragmento de código
No sé si está bien tomar horas y minutos como argumentos. Dijiste "lista de enteros". ¿Todavía cuenta?
Es mi primera vez jugando al golf, por cierto. ¿Qué piensas?
Editar: guardado algunos bytes dividiendo minutos. Gracias Olivier!
fuente
c
dentro de su función. Supongo que no debería perder ningún byte al hacerlo, pero esto lo hace más como un fragmento que como una función (para mí, al menos, tal vez los gurús de JS dirán lo contrario).JavaScript (ES6) 360
Una función con parámetros de entrada hora (0..23) y minuto (0..59).
Utilizando
alert
para la salida, ya que es la función de salida estándar en JavaScript, incluso si es inconveniente. (Y es corto)Nota de prueba : para su tranquilidad, en el fragmento de prueba, la salida de alerta se redirige al texto de la página
fuente
i
? Puedo ver que obtienes todos los grupos que no son espacios en blanco (los "LED") y los reemplazas con espacios en blanco según las condiciones que escribiste para cada uno de ellos. Por ejemplo,h-2
es falso solo cuandoh == 2
, ¿así que supongo que lo inviertes en alguna parte? ¿Puedes explicar un poco cómo funciona esto? Tal vez como una edición de su respuesta? Estaría realmente agradecido!i
para referirse al correcto incrementándolo después de cada coincidencia de expresiones regulares. Si es verdad, reemplaza la cadena coincidente con espacios en blanco, de lo contrario la deja como está. Sin embargo, no entiendo una cosa.replace()
utiliza el valor de retorno de la función especificada (función de flecha en este caso). ¿Dónde devuelves un valor? Acabo de ver un operador ternario.(a,b)=>{ return a+b }
es el mismo que(a,b)=>a+b
Python 2,
466,460,449,452,459449 bytesComo se permite que sea una función que acepte h y m como enteros, podemos guardar algunos bytes. Pruébalo en línea .
Tenía un par de errores (ahora fijo) con la lógica de
TO
/PAST
vsO'CLOCK
. También guardé algunos bytes paraenumerate
, cambiando elimport
, y en19<m<26
lugar dem in [20,25]
. Ahorró otros 8 para trabajar en fragmentos de 5 minutos en lugar de minutos. Rod señaló algunos errores más que me costaron bastante, pero me recuperé un poco con tareas más eficientes y una corrección de errores que funcionó a mi favor.fuente
==
como comparación y creo que puedo mejorar algunas de lash
pruebasprint c
en la última línea,c
ya poseea[i]
, debidoenumerate
print
agregue una nueva línea después de cada impresión, puede suprimirlo agregando un,
despuésc
. También debe imprimir espacios en blanco cuando no se imprime una palabra, puede arreglar con otra en el último sielse:print' '*len(c),
Perl 6 ,
308296293 bytesPruébalo en línea!
Explicación
La estructura básica es la siguiente:
La expresión elidida
...|...|...|...
anteriormente, es una unión de enteros que representan índices de palabras basados en 1, y se compone de la siguiente manera:fuente
Python3, (569 bytes)
Esta respuesta requiere tiempo en formato hh mm (enteros separados por espacios). Logré imprimir '\ n', inspirado en el método de Chris. ¡Gracias, Chris! Cualquier ayuda para reducir el código es apreciada.
Pruébalo en línea
fuente
.split(',')
? Debería salvar algunos.H,M=input()
donde la entrada es H, M. Se permiten dos secuencias enteras bajo las reglas, no estoy seguro de si esto funciona según lo previsto en Python 3. Todavía soy un chico 2 :-)H,M=input()
no funcionó como dudaste.Python 2 ,
443440 bytesPruébalo en línea!
Probablemente aún podría beneficiarse de un poco más de golf. La entrada es una lista de enteros, por ejemplo, 7,23 = 7:23
fuente
SimpleTemplate ,
737708 bytesSí, la verbosidad y la falta de matemáticas "reales" perjudicaron gravemente al bytecount.
Esto espera la hora y los minutos como el primer y segundo parámetro de la clase.
Sin golf:
Como correr:
Ejecute el siguiente código:
¡Hecho!
fuente
Java (OpenJDK 9) , 437 bytes
Pruébalo en línea!
Pensé que finalmente daría una oportunidad a mi desafío;)
fuente
Perl 5 ,
487449 bytesPruébalo en línea!
fuente