Quelle heure est-il en unicode?


12

Le défi est simpliste, étant donné un temps d'entrée sous forme de chaîne dans l'un des formats suivants:

hh, hh:mmou hh:mm:ssavec 0 ≤ hh ≤ 23, 0 ≤ mm ≤ 59et 0 ≤ ss ≤ 59.

Afficher l'heure à laquelle il utilise actuellement les symboles suivants:

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  

Dans le format suivant:

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

Exemples (y compris tous les cas marginaux):

Cas avec seulement des heures ...

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

Affaire avec heures et minutes ...

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

Boîtier avec seulement des heures, mais avec des minutes incluses comme 00 ...

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

Boîtier avec heures, minutes et secondes ...

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

Affaire avec heures et minutes, mais avec secondes incluses comme 00 ...

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

Affaire avec heures et minutes, avec moins d'une minute jusqu'à l'heure suivante ...

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

Il n'est pas nécessaire de passer du pluriel au singulier.


Affaire avec heures et minutes, avec 1 minute à l'heure suivante ...

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

Il n'est pas nécessaire de passer du pluriel au singulier.


Cas utilisant le temps militaire (oui, vous devez gérer cela) ...

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

Cas non valides ...

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.

Vous n'avez à vous conformer à aucun style de sortie pour les cas non valides, les erreurs sont correctes.


Dans l'ensemble, le défi est plutôt simpliste, mais semblait être suffisamment dynamique pour être amusant à mon avis. Le code le plus court ici est le gagnant car il n'y a pas beaucoup d'aspect variable du code autre que la longueur.



Devrait-il s'agir d'un programme complet ou est-ce qu'une fonction / lambda est suffisante?
devRicher

2
Je pense qu'au lieu de 0 < hh < 24, 0 < mm < 60et 0 < ss < 60, vous vouliez dire 0 ≤ hh ≤ 23, 0 ≤ mm ≤ 59et 0 ≤ ss ≤ 59.
Erik the Outgolfer

2
Une structure Date / DateTime spécifique à la langue est-elle autorisée en entrée?
devRicher

2
@carcusocomputing Vous spécifiez que le code doit gérer 24 heures, le code doit-il gérer AMou PMbalises?
Taylor Scott

Réponses:


3

Befunge, 256 250 octets

>&~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!#^

Essayez-le en ligne!

Les résultats sont encodés en utf-8, car cela fonctionne mieux avec TIO, mais si vous testez localement, vous devrez peut-être ajuster la page de codes par défaut de votre système pour voir correctement l'horloge. Sinon, redirigez simplement la sortie vers un fichier et ouvrez-le dans un éditeur compatible utf-8.

Explication

Les trois premières lignes lisent les heures minutes et secondes à partir de stdin, vérifiant EOF ou un saut de ligne après chaque valeur et substituant des zéros aux composants manquants dans l'entrée. Sur la ligne quatre, nous ajustons la valeur des minutes si les secondes ne sont pas nulles, convertissons la valeur des heures dans la plage de 0 à 11 (pour faire correspondre le caractère unicode approprié pour chaque heure) et écrivons la partie initiale de la sortie, y compris le premier cadran d'horloge.

C'est à ce stade que nous devons suivre différentes branches en fonction des composants non nuls. Le premier test, au début de la ligne cinq, vérifie simplement si les minutes et les secondes sont égales à zéro. Si oui, nous écrivons une finale .et sortons . Sinon, les lignes six et sept traitent des cas restants - en écrivant le texte et les valeurs appropriés, avant que tous les chemins ne se combinent à nouveau sur la ligne cinq pour écrire le cadran final (exécution de droite à gauche).


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):''))

Moins 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)
      : ''
    )
)

Tester

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>


Je ne sais pas comment sélectionner un gagnant pour cela, vous avez tous deux posté à moins de 2 minutes l'un de l'autre avec 201 octets dans la même langue.
Urne de poulpe magique

@carusocomputing vous devez bien sûr me sélectionner. Moi. MOI MOI MOI! ...
edc65

@carusocomputing ou bien vous pouvez sélectionner la réponse qui a le moins de votes (sans raison) juste pour retrouver un équilibre
edc65

Ou vous pouvez remplacer le mot Stringdans votre code par ""une chaîne vide pour vous épargner 4 octets :). Ah, merde, il le peut aussi.
Urne de poulpe magique du

Spectacles It is currently 🕛 with 60 minutes until 🕐. Je pense que cela devraitIt is currently 🕛.
Roman Gräf

2

JavaScript (ES6), 201 octets

(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 octets si vous prenez en compte les pluriels:

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>


1

PowerShell , 250 243 octets

$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})."

Essayez-le en ligne!


1

C, 241 octets

Écrit UTF-8 sur 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".");}

Essayez-le en ligne!

Code avec espace:

#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".");
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.