Geben Sie die Uhrzeit zurück, die der aktuellen Uhrzeit am nächsten kommt, wenn Sie ausgeführt werden

20

Ich kann eine große if/elseBedingung für jede 30 Minuten haben, aber ich suche mehr Mathe und Unicode-basierte Lösung.

Hier sind Uhr Emojis::. Wenn Sie keine ordnungsgemäße Renderunterstützung haben, können Sie diese unten (sie sind nicht in derselben Reihenfolge angeordnet und können anders aussehen als die angezeigten) oder im Unicode-Diagramm auf Seite 4 anzeigen. Sie entsprechen den Unicode-Codepunkten U + 1F550 (CLOCK FACE ONE OCLOCK) bis U + 1F567 (CLOCK FACE TWELVE-THIRTY).

Ihre Herausforderung besteht darin, ein Programm zu schreiben, das an STDOUT das Zifferblatt ausgibt, das der aktuellen Systemzeit am nächsten kommt (AM und PM sollten gleich behandelt werden). Wenn zum Beispiel die Zeit t[5:15 <t <5:45) ist, würden Sie das 5:30 Emoji 🕠 anzeigen.

Das ist Code-Golf, also gewinnt der kürzeste Code in Bytes. Möglicherweise möchten Sie eine Möglichkeit angeben, die Zeit zum Testen des Codes auf einfache Weise festzulegen.

Edge-Testfälle

Time   Output  Written
----------------------
11:48  🕛       12:00
3:15   🕞       3:30
9:45   🕙       10:00

Bildbeschreibung hier eingeben

Mohsen
quelle
7
Diese Frage ist derzeit nicht zum Thema hier, aber wahrscheinlich eine einfache Lösung. Sie brauchen eine objektive Gewinnbedingung, aber wenn Sie die Frage Code-Golf markieren, wird der Gewinner derjenige sein, der das kürzeste Programm schreibt. Es ist auch ein bisschen unter angegeben, aber man könnte sagen "ein Skript, das die Emoji-Uhr ausgibt, die der aktuellen Zeit am nächsten ist, wenn es ausgeführt wird" und das sollte reichen. Auch wenn dies technisch nicht erforderlich ist, würde ich empfehlen, dass Sie Einreichungen in anderen Sprachen zulassen. (Jemand wird wahrscheinlich sowieso eine in Bash machen.)
undergroundmonorail
Die Windows-Eingabeaufforderung unterstützt keine Emojis :(
stokastic
2
Ich habe Ihren Beitrag bearbeitet, um zu versuchen, dass er unseren Standards entspricht, indem ich die Regeln klarstelle und ihn zum Code Golf mache. Fühlen Sie sich frei, es zu bearbeiten, wenn ich etwas falsch interpretiert habe.
NinjaBearMonkey
3
Wie sollen xx: 15 und xx: 45 gerundet werden?
Peter Taylor
1
@PeterTaylor Wie in den Testfällen zu sehen, sollten sie aufgerundet werden (dh 1:45 => 2:00)
NinjaBearMonkey

Antworten:

9

Rubin - 61 54 Bytes

Python 3 - 79 77 75 74 Bytes

edit: Es stellt sich heraus, dass dies in Ruby viel kürzer ist, da Timees nicht importiert werden muss und die Ganzzahldivision die Standarddivision ist.

a=(Time.now.to_i/900-3)/2%24
puts""<<128336+a/2+a%2*12

Arithmetik:

  • Time.now.to_i: Sekunden seit der Epoche.
  • /900: Kombinieren Sie die Zeit in 15-Minuten-Segmente.
  • -3: -4weil die Zeichen um 1 Uhr beginnen, +1sodass auf die nächste halbe Stunde gerundet wird und nicht abwärts.
  • /2: In halbstündigen Abschnitten kombinieren.
  • %24: Aktuelles halbstündiges Segment von 12 Stunden abrufen.
  • a/2 + a%2*12: Berücksichtigen Sie, dass Zeichen für eine ganze Stunde in einem Block vor Zeichen für eine halbe Stunde stehen.

Ortszeitversion, 69 Bytes:

n=Time.now
a=((n.to_i+n.gmtoff)/900-3)/2%24
puts""<<128336+a/2+a%2*12

Ursprüngliche Python 3-Version:

import time
a=int((time.time()/900-3)/2%24)
print(chr(128336+a//2+a%2*12))

Druckt die aktuelle Uhrzeit UTC. Python 2 chrakzeptiert nur 0-255 und unichrnur 0-65535. In Python 3 /ist dies immer eine Gleitkommadivision und //eine Ganzzahldivision.

colevk
quelle
Sie können die Pars von schneiden , 12*(a%2)wenn Sie es in der anderen Reihenfolge tun: a%2*12.
Xnor
7

Bash + Coreutils, 60 Bytes

date +%I\ 60*%M+45-30/24%%2+2~C*+C8335+0PP|dc|iconv -f ucs-4

Emojis rendern gut auf dem OSX-Terminal, aber für Linux (Ubuntu 14.04) müssen Sie sudo apt-get install ttf-ancient-fonts

Fügen Sie zum Testen verschiedener Zeiten -d $timeden Befehl date ein. zB zum Testen 12:59:

date -d 12:59 +%I\ 60*%M+45-30/24%%2+2~C*+C8335+0PP|dc|iconv -f ucs-4
Digitales Trauma
quelle
5

JavaScript - 137 117 107 102 95

Dies wird leicht zu übertreffen sein, aber ich werde hier einfach mein Bestes geben.

EDIT 1 : Druckt jetzt in UTC wie die Python-Antwort, um 20 Bytes zu sparen.

EDIT 2: Geändert new Date().getTime()zu Date.now(), um 10 Bytes zu sparen.

EDIT 3: Geändert Math.round(x)zu ~~(x+.5), um 5 Bytes zu sparen.

BEARBEITUNG 4: Unnötig entfernt (und &1023)aus einer alten Entwicklungsversion entfernt, in der ich eine universellere UTF-16-Codierung durchgeführt habe, um 7 Bytes zu sparen.

d=~~(Date.now()/18e5+.5)%24;d+=d<2?24:0;alert(String.fromCharCode(55357,56655+(d%2?23+d:d)/2));

JavaScript ist für Emojis erlauben, aber in UTF-16 , die sie als zwei Zeichen kodiert. Zum Glück können wir sie einfach als zwei Zeichen definieren. Das erste Zeichen ist ebenfalls konstant ( 0xD83D), während sich das andere ändert.

Alternativ, Drucke in Ortszeit, 137 132 125

PurkkaKoodari
quelle
Ist das nicht (d%2?23+d:d)dasselbe wie d+d%2*23?
Neil
4

CJam, 50 Bytes

"🕐":i~et3=C%60*et4=+30d/mo2m24+24%_2%24*+2/+]:c

Der Algorithmus ist einfach, rund um die Zeit auf die nächsten 30 Minuten, zählen Sie, wie viele 30 Minuten seit 12 Uhr / nachmittags vergangen sind. Wenn die Zahl ungerade ist, addieren Sie 24 dazu, teilen Sie den Floor durch 2 und erhöhen Sie den anfänglichen Unicode um so viele Codepunkte, um das richtige Zifferblatt zu erhalten.

Stellen Sie außerdem sicher, dass Sie mit 1 Uhr morgens / nachmittags statt mit 12 Uhr beginnen, und nehmen Sie dort einen Versatz vor.

Verwenden Sie zu Testzwecken den folgenden Code:

3:H;45:M;"🕐":i~HC%60*M+30d/mo2m48+48%_2%24*+2/+]:c

Dabei ist der 3:H;Teil die aktuelle Stunde und der 45:M;Teil die aktuelle Minute der Stunde. Einfach ersetzen 3und 45mit dem gewünschten Wert.

Probieren Sie es hier online aus

Abhängig von Ihrem Browser und Betriebssystem sowie den installierten Schriftarten werden möglicherweise nicht alle Unicode-Zeichen in der Online-Version korrekt gedruckt. Aber für mich drucken alle gut auf Firefox mit Windows 7.

Optimierer
quelle
@ user23013 Schön !. Ich denke, du solltest das als neue Antwort posten, da ich darin nicht
Optimizer
3

CJam, 31 Bytes

"🕐")et5<60b675+30/24%2mdC*++

Sie können die Zeit in dem folgenden Programm ändern, um es zu testen:

"🕐")[2014 12 19 22 14 1 901 5 -28800000]5<60b675+30/24%2mdC*++
jimmy23013
quelle