Che ora è in Unicode?


12

La sfida è semplicistica, dato un tempo di input come stringa in uno dei seguenti formati:

hh, hh:mmO hh:mm:sscon 0 ≤ hh ≤ 23, 0 ≤ mm ≤ 59e 0 ≤ ss ≤ 59.

Stampa a che ora utilizza i seguenti simboli:

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  

Nel seguente formato:

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

Esempi (compresi tutti i casi di frangia):

Caso con solo ore ...

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

Caso con ore e minuti ...

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

Caso con solo ore, ma ha minuti inclusi come 00 ...

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

Caso con ore, minuti e secondi ...

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

Caso con ore e minuti, ma ha secondi inclusi come 00 ...

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

Caso con ore e minuti, con meno di un minuto fino all'ora successiva ...

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

Non è necessario passare dal plurale al singolare.


Caso con ore e minuti, con 1 minuto all'ora successiva ...

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

Non è necessario passare dal plurale al singolare.


Caso che utilizza tempo militare (sì, devi gestirlo) ...

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

Casi non validi ...

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.

Non è necessario conformarsi a nessuno stile di output per casi non validi, gli errori vanno bene.


Nel complesso la sfida è piuttosto semplicistica, ma sembrava essere abbastanza dinamica da essere divertente secondo me. Il codice più breve qui è il vincitore in quanto non c'è molto aspetto variabile nel codice oltre alla lunghezza.



Questo dovrebbe essere un intero programma o è sufficiente una funzione / lambda?
— devRicher,

2
Penso che invece di 0 < hh < 24, 0 < mm < 60e 0 < ss < 60, volevi dire 0 ≤ hh ≤ 23, 0 ≤ mm ≤ 59e 0 ≤ ss ≤ 59.
— Erik the Outgolfer,

2
Una struttura Date / DateTime specifica della lingua è consentita come input?
— devRicher,

2
@carcusocomputing Specifica che il codice deve gestire 24 ore, il codice deve gestire AMo i PMtag?
— Taylor Scott,

Risposte:


3

Befunge, 256 250 byte

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

Provalo online!

I risultati sono codificati come utf-8, poiché funziona meglio con TIO, ma se si esegue il test in locale, potrebbe essere necessario regolare la tabella codici predefinita del sistema per vedere correttamente i quadranti dell'orologio. Altrimenti basta reindirizzare l'output su un file e aprirlo in un editor compatibile utf-8.

Spiegazione

Le prime tre righe leggono le ore, i minuti e i secondi dallo stdin, controllando EOF o un avanzamento di riga dopo ogni valore e sostituendo gli zeri con i componenti mancanti nell'input. Alla riga quattro, regoliamo il valore dei minuti se i secondi sono diversi da zero, convertiamo il valore dell'ora nell'intervallo da 0 a 11 (per abbinare il carattere unicode appropriato per ogni ora) e scriviamo la parte iniziale dell'output, tra cui il primo quadrante di orologio.

È a questo punto che dobbiamo seguire diversi rami a seconda di quali componenti sono diversi da zero. Il primo test, all'inizio della riga cinque, controlla solo se sia i minuti che i secondi sono zero. In tal caso, scriviamo un finale .e usciamo . Altrimenti le righe sei e sette trattano i casi rimanenti - scrivendo il testo e i valori appropriati, prima che i percorsi si combinino nuovamente sulla riga cinque per scrivere il quadrante finale (eseguendo da destra a sinistra).


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

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

Test

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>


Non so come selezionare un vincitore per questo, entrambi sono stati pubblicati entro 2 minuti l'uno dall'altro con 201 byte nella stessa lingua.
— Magic Octopus Urn

@carusocomputing ovviamente dovresti selezionarmi. Me. IO IO IO! ...
— edc65,

@carusocomputing oppure potresti selezionare la risposta che ha meno voti (senza motivo) solo per riguadagnare un equilibrio
— edc65

Oppure potresti sostituire la parola Stringnel tuo codice con ""una stringa vuota per salvarti 4 byte :). Ah, merda, anche lui può farlo.
— Magic Octopus Urn

Spettacoli It is currently 🕛 with 60 minutes until 🕐. Penso che dovrebbeIt is currently 🕛.
— Roman Gräf il

2

JavaScript (ES6), 201 byte

(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 byte se si prendono in considerazione i plurali:

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 byte

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

Provalo online!


1

C, 241 byte

Scrive UTF-8 su 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".");}

Provalo online!

Codice con spazi bianchi:

#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".");
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.