¿Qué hora es en unicode?

12

El desafío es simplista, dado un tiempo de entrada como una cadena en cualquiera de los siguientes formatos:

hh, hh:mmo hh:mm:sscon 0 ≤ hh ≤ 23, 0 ≤ mm ≤ 59y 0 ≤ ss ≤ 59.

Salida a qué hora está usando los siguientes símbolos:

AA  LABEL FOR CHARACTER     CODE POINT   HEXADECIMAL
==  ====================    ==========   ===========
🕐  Clock Face 01 Oclock    128336       0x1F550  
🕑  Clock Face 02 Oclock    128337       0x1F551  
🕒  Clock Face 03 Oclock    128338       0x1F552  
🕓  Clock Face 04 Oclock    128339       0x1F553  
🕔  Clock Face 05 Oclock    128340       0x1F554  
🕕  Clock Face 06 Oclock    128341       0x1F555  
🕖  Clock Face 07 Oclock    128342       0x1F556  
🕗  Clock Face 08 Oclock    128343       0x1F557  
🕘  Clock Face 09 Oclock    128344       0x1F558  
🕙  Clock Face 10 Oclock    128345       0x1F559  
🕚  Clock Face 11 Oclock    128346       0x1F55A  
🕛  Clock Face 12 Oclock    128347       0x1F55B  

En el siguiente formato:

It is currently {Clock Face 1} with {mm} minutes and {ss} seconds until {Clock Face 2}.

Ejemplos (incluidos todos los casos marginales):

Estuche con solo horas ...

f("12") = "It is currently 🕛."

Estuche con horas y minutos ...

f("12:30") = "It is currently 🕛 with 30 minutes until 🕐."

Estuche con solo horas, pero tiene minutos incluidos como 00 ...

f("12:00") = "It is currently 🕛."

Caso con horas, minutos y segundos ...

f("12:30:30") = "It is currently 🕛 with 29 minutes and 30 seconds until 🕐."

Estuche con horas y minutos, pero tiene segundos incluidos como 00 ...

f("12:30:00") = "It is currently 🕛 with 30 minutes until 🕐."

Caso con horas y minutos, con menos de un minuto hasta la próxima hora ...

f("12:59:59") = "It is currently 🕛 with 1 seconds until 🕐."

No tiene que cambiar de plural a singular.


Caso con horas y minutos, con 1 minuto para la próxima hora ...

f("12:59") = "It is currently 🕛 with 1 minutes until 🕐."

No tiene que cambiar de plural a singular.


Caso usando tiempo militar (sí, debe manejar esto) ...

f("23:30:30") = "It is currently 🕚 with 29 minutes and 30 seconds until 🕛."

Casos inválidos ...

f("PPCG") = This cannot occur, you are guaranteed a valid format by the definition of the problem.
f(66:66:66) = This cannot occur, you are guaranteed valid numbers by the definition of the problem.
f(24:60:60) = This cannot occur, you are guaranteed valid numbers by the definition of the problem.

No tiene que ajustarse a ningún estilo de salida para casos no válidos, los errores están bien.


En general, el desafío es bastante simplista, pero en mi opinión parece ser lo suficientemente dinámico como para ser divertido. El código más corto aquí es el ganador ya que no hay mucho aspecto variable en el código que no sea la longitud.

Urna de pulpo mágico
fuente
¿Debería ser un programa completo o una función / lambda suficiente?
devRicher
2
Creo que en lugar de 0 < hh < 24, 0 < mm < 60y 0 < ss < 60, querías decir 0 ≤ hh ≤ 23, 0 ≤ mm ≤ 59y 0 ≤ ss ≤ 59.
Erik the Outgolfer
2
¿Se permite una estructura Date / DateTime específica del idioma como entrada?
devRicher
2
@carcusocomputing Usted especifica que el código debe manejar 24 horas, ¿tiene que manejar el código AMo las PMetiquetas?
Taylor Scott

Respuestas:

3

Befunge, 256 250 bytes

>&~85+`v
8~-&"<"_00v`+5
0v%\-&"<<"_
v>:00p!!-"<"%10p65++:66+%0" yltnerruc si tI">:#,_$"Hu 5x"2*,3*,+,2*+,10g00g+
_".",@,".",+*2,+,*3,*2"x5 uH"%+66+1$_,#!>#:<v0
" litnu  htiw ",,,,,,10g:>#v_$"sdnoces"00g.^>
_>,,,,,,,>" dna ">,,,,,00^ >."setunim"00g!#^

Pruébalo en línea!

Los resultados están codificados como utf-8, ya que eso funciona mejor con TIO, pero si está probando localmente, es posible que deba ajustar la página de códigos predeterminada de su sistema para ver las caras del reloj correctamente. De lo contrario, simplemente redirija la salida a un archivo y ábralo en un editor compatible con utf-8.

Explicación

Las primeras tres líneas leen las horas, minutos y segundos de stdin, verificando EOF o un salto de línea después de cada valor, y sustituyendo ceros por los componentes que faltan en la entrada. En la línea cuatro, ajustamos el valor de los minutos si los segundos no son cero, convertimos el valor de la hora en el rango de 0 a 11 (para que coincida con el carácter Unicode apropiado para cada hora) y escribimos la parte inicial de la salida, incluyendo La primera cara del reloj.

Es en este punto que necesitamos seguir diferentes ramas dependiendo de qué componentes son distintos de cero. La primera prueba, al comienzo de la línea cinco, solo verifica si tanto los minutos como los segundos son cero. Si es así, escribimos una final .y salimos . De lo contrario, las líneas seis y siete tratan los casos restantes: escribir el texto y los valores apropiados, antes de que todas las rutas se combinen nuevamente en la línea cinco para escribir la cara del reloj final (ejecución de derecha a izquierda).

James Holderness
fuente
3

JavaScript (ES6), 201

t=>(T=h=>String.fromCodePoint(128336+h%12),[h,m,s]=t.match(/\d+/g),'It is currently '+T(h-=~10)+((m-=-!!-s)?` with ${60-m?60-m+' minutes'+(-s?' and ':''):''}${-s?60-s+' seconds':''} until `+T(-~h):''))

Menos golf

t=>(
  T=h=>String.fromCodePoint(128336+h%12),
  [h,m,s]=t.match(/\d+/g),
  'It is currently '+T(h-=~10)
   +( 
      // if seconds is not 0, increment m else just convert to number
      // have to use '- -' to force conversion to number 
     (m -= - !!-s) 
-s?++m:m)
      ? ` with ${60-m ? 60-m+' minutes'+(-s?' and ':''):''}${-s?60-s+' seconds':''} until `+T(-~h)
      : ''
    )
)

Prueba

F=
t=>(T=h=>String.fromCodePoint(128336+h%12),[h,m,s]=t.match(/\d+/g),'It is currently '+T(h-=~10)+((m-=-!!-s)?` with ${60-m?60-m+' minutes'+(-s?' and ':''):''}${-s?60-s+' seconds':''} until `+T(-~h):'')
)


var tid=0

function getTime(t)
{
  var a=t.match(/\d+/g)
  if (a) {
    var [h,m,s]=a
    h|=0, s|=0, m|=0
    if(h>=0 & h<24 & m>=0 & m<60 & s>=0 & s<60) 
      return [h,m,s]
  }
  return null
}      

function update()
{
  clearTimeout(tid)
  var t=I.value, a=getTime(t)
  if (a) {
    O.textContent = F(t)
    tid = setTimeout(again,5000)
  }
  else {
    O.textContent = 'invalid ' + t
  }
}
function again()
{      
  var t=I.value, a=getTime(t)
  if (a) {
    var [h,m,s]=a
    ++s>59?(s=0,++m>59?(m=0,++h):0):0
    h%=24
    s<10?s='0'+s:0
    m<10?m='0'+m:0
    t = h+(-m-s?':'+m+(-s?':'+s:''):'')
    I.value = t
    O.textContent=F(t)
    tid = setTimeout(again, 1000)
  }
}

update()
#O { font-size:16px }
Time <input id=I value='12' oninput='update()' onkeydown='update()'>
(modify current time as you wish - but use valid values)
<pre id=O></pre>

edc65
fuente
No sé cómo seleccionar un ganador para esto, ambos publicaron dentro de 2 minutos el uno del otro con 201 bytes en el mismo idioma.
Magic Octopus Urn
@carusocomputing, por supuesto, deberías seleccionarme. Yo. ¡YO YO YO! ...
edc65
@carusocomputing o de lo contrario podría seleccionar la respuesta que tenga menos votos (sin razón) solo para recuperar el equilibrio
edc65
O puede reemplazar la palabra Stringen su código con ""una cadena vacía para ahorrarse 4 bytes :). Ah, mierda, él también puede hacerlo.
Urna de pulpo mágico
Muestra It is currently 🕛 with 60 minutes until 🕐. Creo que deberíaIt is currently 🕛.
Roman Gräf
2

JavaScript (ES6), 201 bytes

(i,[h,m,s]=i.split`:`,c=n=>String.fromCodePoint(128336+(n+11)%12))=>`It is currently ${c(+h)}${m|s?` with ${(m=59+!+s-m)?m+` minutes`:``}${+s&&m?` and `:``}${+s?60-s+` seconds`:``} until `+c(-~h):``}.`

226 bytes si tiene en cuenta los plurales:

f=
(i,[h,m,s]=i.split`:`,c=n=>String.fromCodePoint(128336+(n+11)%12))=>`It is currently ${c(+h)}${m|s?` with ${(m=59+!+s-m)?m+` minute`+(m-1?`s`:``):``}${+s&&m?` and `:``}${+s?60-s+` second`+(59-s?`s`:``):``} until `+c(-~h):``}.`
<input oninput=o.textContent=f(this.value)><div id=o>

Neil
fuente
1

PowerShell , 250 243 bytes

$h,$m,$s=$args-split':'
$f={[char]::ConvertFromUtf32(128336+(11+$args[0])%12)}
$u=(60-$s)%60
$v=(59-$m+!$u)%60
"It is currently $(&$f $h;"with $(("$v minutes"|?{$v}),("$u seconds"|?{$u})-match'.'-join' and ') until $(&$f (1+$h))"|?{$u-or$v})."

Pruébalo en línea!

briantista
fuente
1

C, 241 bytes

Escribe UTF-8 en stdout.

#define p printf(
c(v,h){p"%s \xf0\x9f\x95%c",v,144+h%12);}f(t){int h=0,m=0,s=0;sscanf(t,"%d:%d:%d",&h,&m,&s);m=(59-m+!s)%60;c("It is currently",h-1);m&&p" with %d minutes",m);s&&p" %s %d seconds",m?"and":"with",60-s);m|s&&c(" to",h);p".");}

Pruébalo en línea!

Código con espacios en blanco:

#define p printf(

c(v, h) {
    p"%s \xf0\x9f\x95%c", v, 144 + h % 12);
}

f(t) {
    int h = 0, m = 0, s = 0;

    sscanf(t, "%d:%d:%d", &h, &m, &s);
    c("It is currently", h - 1);
    m = (59 - m + !s) % 60;
    m && p" with %d minutes", m);
    s && p" %s %d seconds", m ? "and" : "with", 60 - s);
    m | s && c(" to", h);
    p".");
}
nwellnhof
fuente