Wie spät ist es in Unicode?

12

Die Herausforderung ist einfach, wenn eine Eingabezeit als Zeichenfolge in einem der folgenden Formate angegeben wird:

hh, hh:mmoder hh:mm:ssmit 0 ≤ hh ≤ 23, 0 ≤ mm ≤ 59und 0 ≤ ss ≤ 59.

Mit den folgenden Symbolen können Sie die aktuelle Uhrzeit ausgeben:

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  

Im folgenden Format:

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

Beispiele (einschließlich aller Randfälle):

Fall mit nur Stunden ...

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

Fall mit Stunden und Minuten ...

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

Fall mit nur Stunden, hat aber Minuten als 00 enthalten ...

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

Fall mit Stunden, Minuten und Sekunden ...

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

Fall mit Stunden und Minuten, hat aber Sekunden als 00 enthalten ...

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

Fall mit Stunden und Minuten, mit weniger als einer Minute bis zur nächsten Stunde ...

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

Sie müssen nicht vom Plural zum Singular wechseln.


Fall mit Stunden und Minuten, mit 1 Minute bis zur nächsten Stunde ...

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

Sie müssen nicht vom Plural zum Singular wechseln.


Fall mit militärischer Zeit (ja, Sie müssen damit umgehen) ...

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

Ungültige Fälle ...

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.

Für ungültige Fälle müssen Sie sich nicht an einen Ausgabestil halten. Fehler sind in Ordnung.


Insgesamt ist die Herausforderung eher simpel, schien aber meiner Meinung nach dynamisch genug zu sein, um Spaß zu machen. Der kürzeste Code ist hier der Gewinner, da der Code außer der Länge nur wenig variable Aspekte aufweist.

Magic Octopus Urn
quelle
1
Eng verwandt.
Martin Ender
Sollte dies ein ganzes Programm sein oder ist eine Funktion / Lambda ausreichend?
DevRicher
2
Ich denke , dass statt 0 < hh < 24, 0 < mm < 60und 0 < ss < 60bedeutete ihr 0 ≤ hh ≤ 23, 0 ≤ mm ≤ 59und 0 ≤ ss ≤ 59.
Erik der Outgolfer
2
Ist eine sprachspezifische Date / DateTime-Struktur als Eingabe zulässig?
DevRicher
2
@carcusocomputing Sie geben an, dass der Code 24 Stunden verarbeiten muss. Muss der Code AModer PMTags verarbeiten?
Taylor Scott

Antworten:

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

Probieren Sie es online!

Die Ergebnisse werden als utf-8 codiert, da dies mit TIO am besten funktioniert. Wenn Sie jedoch lokal testen, müssen Sie möglicherweise die Standard-Codepage Ihres Systems anpassen, damit die Ziffernblätter korrekt angezeigt werden. Andernfalls leiten Sie die Ausgabe einfach in eine Datei um und öffnen Sie diese in einem utf-8-kompatiblen Editor.

Erläuterung

Die ersten drei Zeilen lesen die Stunden, Minuten und Sekunden von stdin, prüfen nach jedem Wert auf EOF oder einen Zeilenvorschub und ersetzen die in der Eingabe fehlenden Komponenten durch Nullen. In Zeile 4 passen wir den Minutenwert an, wenn die Sekunden nicht Null sind, konvertieren den Stundenwert in den Bereich von 0 bis 11 (um den entsprechenden Unicode-Zeichen für jede Stunde zuzuordnen) und schreiben den anfänglichen Teil der Ausgabe aus, einschließlich das das erste Zifferblatt.

An diesem Punkt müssen wir verschiedenen Zweigen folgen, je nachdem, welche Komponenten nicht Null sind. Der erste Test am Anfang von Zeile fünf prüft nur, ob sowohl Minuten als auch Sekunden Null sind. Wenn ja, schreiben wir ein Finale aus .und verlassen es. Andernfalls behandeln die Zeilen sechs und sieben die verbleibenden Fälle - schreiben Sie den entsprechenden Text und die entsprechenden Werte aus, bevor die Pfade in Zeile fünf erneut kombiniert werden, um das letzte Ziffernblatt zu schreiben (Ausführung von rechts nach links).

James Holderness
quelle
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):''))

Weniger golfen

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

Prüfung

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
quelle
Ich weiß nicht, wie ich einen Gewinner dafür auswählen soll. Ihr habt beide innerhalb von 2 Minuten mit 201 Bytes in derselben Sprache gepostet.
Magic Octopus Urn
@carusocomputing natürlich solltest du mich auswählen. Mir. ICH ICH ICH! ...
edc65
@carusocomputing oder Sie könnten die Antwort auswählen, die weniger Stimmen hat (ohne Grund), nur um ein Gleichgewicht wiederzugewinnen
edc65
Oder Sie können das Wort Stringin Ihrem Code durch ""eine leere Zeichenfolge ersetzen , um sich 4 Bytes zu sparen :). Ach, Mist, das kann er auch.
Magic Octopus Urn
Shows It is currently 🕛 with 60 minutes until 🕐. Ich denke, es sollteIt is currently 🕛.
Roman Gräf
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 Bytes unter Berücksichtigung von Pluralzahlen:

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
quelle
1

PowerShell , 250 bis 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})."

Probieren Sie es online!

Briantist
quelle
1

C 241 Bytes

Schreibt UTF-8 nach 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".");}

Probieren Sie es online!

Code mit Leerzeichen:

#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
quelle