Devuelve el emoji del reloj más cercano a la hora actual cuando se ejecuta

20

Puedo tener una if/elsecondición grande por cada 30 minutos, pero estoy buscando más soluciones basadas en matemáticas y Unicode.

Aquí hay emojis de reloj: 🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜🕝🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧. Si no tiene el soporte de renderizado adecuado, puede verlos a continuación (no están en el mismo orden y pueden verse diferentes a lo que ve) o en el gráfico Unicode , página 4. Corresponden a los puntos de código Unicode U + 1F550 (RELOJ CARA UN OCLOQUE) hasta U + 1F567 (CARA DE RELOJ DOCE TREINTA).

Su desafío es escribir un programa que envíe a STDOUT el emoji de la esfera del reloj más cercano a la hora actual del sistema (AM y PM deben tratarse de la misma manera). Por ejemplo, si el tiempo tes [5:15 <t <5:45), mostraría el emoji 5:30 🕠.

Este es el código de golf, por lo que gana el código más corto en bytes. Es posible que desee incluir una manera de especificar fácilmente el tiempo para probar su código.

Casos de prueba de borde

Time   Output  Written
----------------------
11:48  🕛       12:00
3:15   🕞       3:30
9:45   🕙       10:00

ingrese la descripción de la imagen aquí

Mohsen
fuente
77
Esta pregunta no está actualmente en el tema aquí, pero probablemente sea una solución fácil. Necesita una condición de ganancia objetiva, pero si etiqueta el código de la pregunta golf, el ganador será quien escriba el programa más corto. También está un poco por debajo de lo especificado, pero podría decir "un script que genera el emoji del reloj más cercano a la hora actual cuando se ejecuta" y eso debería ser suficiente. Además, aunque no es técnicamente necesario, le recomiendo que permita envíos en otros idiomas. (Alguien probablemente hará uno en Bash de todos modos.)
undergroundmonorail
El símbolo del sistema de Windows no admite emojis :(
stokastic
2
Edité su publicación para intentar que cumpla con nuestros estándares al aclarar las reglas y hacer que codifique el golf. Siéntete libre de editarlo si malinterpreto algo.
NinjaBearMonkey
3
¿Cómo deben redondearse xx: 15 y xx: 45?
Peter Taylor
1
@PeterTaylor Como se ve en los casos de prueba, deben redondearse (es decir, 1:45 => 2:00)
NinjaBearMonkey

Respuestas:

9

Ruby - 61 54 bytes

Python 3 - 79 77 75 74 bytes

editar: Resulta que esto es mucho más corto en Ruby, porque Timeno necesita ser importado y la división entera es la predeterminada.

a=(Time.now.to_i/900-3)/2%24
puts""<<128336+a/2+a%2*12

Aritmética:

  • Time.now.to_i: Segundos desde la época.
  • /900: Combina el tiempo en segmentos de 15 minutos.
  • -3: -4porque los caracteres comienzan a la 1 en punto, +1por lo que el redondeo se realiza a la media hora más cercana, en lugar de hacia abajo.
  • /2: Combinar en segmentos de media hora.
  • %24: Obtenga el segmento actual de media hora de 12 horas.
  • a/2 + a%2*12: Tenga en cuenta el hecho de que los caracteres de una hora completa aparecen en bloque antes de los caracteres de media hora.

Versión de hora local, 69 bytes:

n=Time.now
a=((n.to_i+n.gmtoff)/900-3)/2%24
puts""<<128336+a/2+a%2*12

Versión original de Python 3:

import time
a=int((time.time()/900-3)/2%24)
print(chr(128336+a//2+a%2*12))

Imprime la hora actual UTC. Python 2 chrsolo acepta 0-255, y unichrsolo 0-65535. En Python 3, /siempre es división de punto flotante y //siempre es división entera.

colevk
fuente
Puede cortar los parens de 12*(a%2)si lo hace en otro orden: a%2*12.
xnor
7

Bash + Coreutils, 60 bytes

date +%I\ 60*%M+45-30/24%%2+2~C*+C8335+0PP|dc|iconv -f ucs-4

Los emojis funcionan bien en el terminal OSX, pero para Linux (Ubuntu 14.04) tendrás que sudo apt-get install ttf-ancient-fonts

Para probar diferentes horas, inserte -d $timeen el comando de fecha. por ejemplo, para probar 12:59:

date -d 12:59 +%I\ 60*%M+45-30/24%%2+2~C*+C8335+0PP|dc|iconv -f ucs-4
Trauma digital
fuente
5

JavaScript - 137 117 107 102 95

Esto será fácil de superar, pero haré lo mejor que pueda aquí.

EDITAR 1 : ahora imprime en UTC como la respuesta de Python para guardar 20 bytes.

EDITAR 2: cambiado new Date().getTime()a Date.now()para guardar 10 bytes.

EDITAR 3: cambiado Math.round(x)a ~~(x+.5)para guardar 5 bytes.

EDITAR 4: Eliminado innecesario (y &1023)dejado de alguna versión de desarrollo anterior donde hice una codificación UTF-16 más universal para guardar 7 bytes.

d=~~(Date.now()/18e5+.5)%24;d+=d<2?24:0;alert(String.fromCharCode(55357,56655+(d%2?23+d:d)/2));

JavaScript no permite emojis, pero en UTF-16 que los codifica como dos caracteres. Afortunadamente, podemos simplemente definirlos como dos personajes; el primer caracter también es constante ( 0xD83D), mientras que el otro cambia.

Alternativa, impresiones en hora local, 137 132 125:

PurkkaKoodari
fuente
¿No es lo (d%2?23+d:d)mismo que d+d%2*23?
Neil
4

CJam, 50 bytes

"🕐":i~et3=C%60*et4=+30d/mo2m24+24%_2%24*+2/+]:c

El algoritmo es simple, redondee el tiempo a los 30 minutos más cercanos, cuente cuántos minutos han pasado desde las 12 AM / PM, si el número es impar, luego agregue 24, divida el piso por 2 e incremente el Unicode inicial por esa cantidad puntos de código para obtener la esfera del reloj correcta.

Además, asegúrese de comenzar con 1 AM / PM en lugar de 12, así que tome un desplazamiento allí.

Para fines de prueba, use el siguiente código:

3:H;45:M;"🕐":i~HC%60*M+30d/mo2m48+48%_2%24*+2/+]:c

Donde la 3:H;parte es la hora actual y la 45:M;parte es el minuto actual de la hora. Simplemente reemplace 3y 45con el valor deseado.

Pruébalo en línea aquí

No todos los caracteres Unicode pueden imprimirse correctamente en la versión en línea dependiendo de su navegador y sistema operativo y las fuentes instaladas. Pero para mí, todos imprimen bien en Firefox con Windows 7.

Optimizador
fuente
@ user23013 ¡Bien! Creo que deberías publicar eso como una nueva respuesta, ya que no hice golf en eso :)
Optimizer
3

CJam, 31 bytes

"🕐")et5<60b675+30/24%2mdC*++

Puede cambiar la hora en el siguiente programa para probarlo:

"🕐")[2014 12 19 22 14 1 901 5 -28800000]5<60b675+30/24%2mdC*++
jimmy23013
fuente