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.