Retorne o emoji do relógio mais próximo da hora atual quando executado

20

Posso ter uma if/elsecondição grande a cada 30 minutos, mas estou procurando mais soluções baseadas em matemática e Unicode.

Aqui estão os emojis de relógio: 🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜🕝🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧. Se você não tiver suporte de renderização adequado, poderá vê-los abaixo (eles não estão na mesma ordem e podem parecer diferentes do que você vê) ou no gráfico Unicode , página 4. Eles correspondem aos pontos de código Unicode U + 1F550 (RELÓGIO ENFRENTE UM RELÓGIO) a U + 1F567 (RELÓGIO RELÓGIO DOZE TRINTA E TRINTA).

Seu desafio é escrever um programa que produza para STDOUT o emoji do relógio mais próximo da hora atual do sistema (AM e PM devem ser tratados da mesma forma). Por exemplo, se o tempo tfor [5:15 <t <5:45), você exibirá o emoji 5:30 🕠.

Isso é código-golfe, então o código mais curto em bytes vence. Você pode querer incluir uma maneira de especificar facilmente a hora de testar seu código.

Casos de teste de borda

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

insira a descrição da imagem aqui

Mohsen
fonte
7
No momento, essa pergunta não está no tópico aqui, mas provavelmente é uma solução fácil. Você precisa de uma condição de vitória objetiva, mas se você marcar a pergunta code-golf, o vencedor será quem escrever o programa mais curto. Também está um pouco sub-especificado, mas você poderia dizer "um script que gera o emoji do relógio mais próximo do horário atual quando executado" e isso deve ser suficiente. Além disso, embora não seja tecnicamente necessário, recomendo que você permita envios em outros idiomas. (Alguém provavelmente irá fazer um em Bash de qualquer maneira.)
undergroundmonorail
O prompt de comando do Windows não suporta emojis :(
stokastic
2
Editei sua postagem para tentar que ela atenda aos nossos padrões, esclarecendo as regras e fazendo com que ela codifique o golfe. Sinta-se à vontade para editá-lo se eu interpretar algo errado.
NinjaBearMonkey
3
Como xx: 15 e xx: 45 devem ser arredondados?
Peter Taylor
1
@PeterTaylor Como visto nos casos de teste, eles deverão ser arredondados para cima (isto é 1:45 => 02:00)
NinjaBearMonkey

Respostas:

9

Ruby - 61 54 bytes

Python 3-79 77 75 74 bytes

edit: Acontece que isso é muito mais curto no Ruby, porque Timenão precisa ser importado e a divisão inteira é o padrão.

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

Aritmética:

  • Time.now.to_i: Segundos desde a época.
  • /900: Combine tempo em segmentos de 15 minutos.
  • -3: -4porque os caracteres começam às 1 horas, +1para que o arredondamento seja feito na meia hora mais próxima, e não para baixo.
  • /2: Combine em segmentos de meia hora.
  • %24: Obtenha o segmento atual de meia hora em 12 horas.
  • a/2 + a%2*12: Leve em consideração o fato de que os caracteres de hora inteira vêm em um bloco antes dos caracteres de meia hora.

Versão da hora local, 69 bytes:

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

Versão original do Python 3:

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

Imprime a hora atual UTC. O Python 2 chraceita apenas 0-255 e unichrapenas 0-65535. No Python 3, /sempre existe uma divisão de ponto flutuante e //sempre uma divisão inteira.

colevk
fonte
Você pode cortar os parênteses de 12*(a%2)se fazê-lo em outra ordem: 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

Os emojis são ótimos no terminal OSX, mas no Linux (Ubuntu 14.04) você terá que sudo apt-get install ttf-ancient-fonts

Para testar horários diferentes, insira -d $timeo comando date. por exemplo, para o teste 12:59:

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

JavaScript - 137 117 107 102 95

Isso vai ser facilmente derrotado, mas vou tentar o meu melhor aqui.

EDIT 1 : Agora imprime no UTC como a resposta do Python para economizar 20 bytes.

EDIT 2: Mudou new Date().getTime()para Date.now()salvar 10 bytes.

EDIT 3: Mudou Math.round(x)para ~~(x+.5)salvar 5 bytes.

EDIT 4: Removido desnecessário (e &1023)deixado de alguma versão antiga de desenvolvimento, onde eu fiz uma codificação UTF-16 mais universal para economizar 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 não permitir emojis, mas em UTF-16 que os codifica como dois caracteres. Felizmente, podemos simplesmente defini-los como dois caracteres; o primeiro caractere também é constante ( 0xD83D), enquanto o outro é alterado.

Alternativa, imprime na hora local, 137 132 125:

PurkkaKoodari
fonte
Não é (d%2?23+d:d)o mesmo que d+d%2*23?
Neil
4

CJam, 50 bytes

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

O algoritmo é simples, arredonde o tempo para os 30 minutos mais próximos, conte quantos 30 minutos se passaram desde as 12h / PM, se o número for ímpar, adicione 24, divida o piso por 2 e aumente o unicode inicial por muitos pontos de código para obter a face do relógio correta.

Além disso, certifique-se de começar com 1 AM / PM em vez de 12, então faça um deslocamento lá.

Para fins de teste, use o seguinte código:

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

Onde a 3:H;parte é a hora atual e a 45:M;parte é o minuto atual da hora. Simplesmente substitua 3e45 pelo valor desejado.

Experimente online aqui

Nem todos os caracteres unicode podem ser impressos corretamente na versão online, dependendo do navegador, do SO e das fontes instaladas. Mas, para mim, todas as impressões são boas no Firefox com Windows 7.

Optimizer
fonte
@ user23013 Nice !. Eu acho que você deveria postar isso como uma nova resposta, já que eu não jogava golfe nisso :) #
Optimizer
3

CJam, 31 bytes

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

Você pode alterar o horário no programa a seguir para testá-lo:

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