Seit ich den ersten vor ein paar Jahren gesehen habe, war ich immer unterworfen von dieser Art von Wortuhr, bei der die Zeit tatsächlich durch Wörter ausgedrückt wird, die in einem aussagekräftigen Satz aufleuchten oder nicht.
Der auf dieser Uhr angezeigte Text ist der folgende.
IT IS HALF TEN
QUARTER TWENTY
FIVE MINUTES TO
PAST TWO THREE
ONE FOUR FIVE
SIX SEVEN EIGHT
NINE TEN ELEVEN
TWELVE O'CLOCK
Ihre Aufgabe ist es, eine solche Uhr zu schreiben. Wörter leuchten nur dann auf, wenn sie für das Drucken der aktuellen Uhrzeit relevant sind. Ansonsten sind sie beleuchtet. Wörter werden "beleuchtet", indem sie gedruckt werden, und "beleuchtet", indem sie durch eine Anzahl von Leerzeichen ersetzt werden, die der Länge des Wortes entsprechen.
Beispiel: Wenn die aktuelle Uhrzeit 17:23 Uhr ist, muss der gedruckte Text genau wie folgt lauten:
IT IS
TWENTY
FIVE MINUTES
PAST
FIVE
Regeln
- Die gedruckte Zeit ist die 12-Stunden-Variante, jedoch ohne AM / PM.
- Die Rundung erfolgt nur auf der Basis von Minuten (Sekunden sind völlig irrelevant). Die Rundung wird auf das nächste Vielfache von 5 durchgeführt. Obwohl also 17:52:38 wirklich am nächsten zu 17:55 liegt, wird 17:52 tatsächlich auf 17:50 abgerundet, da die Sekunden irrelevant sind. und der gedruckte Text ist "ES IST ZEHN MINUTEN ZU SECHS" (mit relevantem Abstand). Wenn
XX
also ein Vielfaches von fünf ist,XX
wird von HH: (XX-2): 00 bis HH: (XX + 2): 59 verwendet. Das WortMINUTES
muss erscheinen wennFIVE
,TEN
oderTWENTY
sind im Abschnitt Minute (vor „TO“ oder „PAST“) beleuchtet. - Alle irrelevanten Wörter werden durch so viele Leerzeichen ersetzt, wie erforderlich sind, damit der Text dort bleibt, wo er sich in der obigen Vorlage befindet. Nachgestellte Leerzeichen können abgeschnitten werden. Leerzeichen, die relevant sind, um den Text an der erwarteten Position zu halten, müssen beibehalten werden.
Nachlaufende Linien können ebenfalls abgeschnitten werden. Relevante Leerzeilen müssen noch erscheinen. Beispiel:
IT IS TEN MINUTES PAST TWO
Leuchten Sie nicht
TEN
in der ersten oderFIVE
dritten Zeile, wenn sich diese Werte auf die Stunden beziehen.- Sie können eine Eingabe akzeptieren. Wenn Sie eine Eingabe akzeptieren, ist die Eingabe die Zeit zum Drucken in einem beliebigen gültigen Format (Zeichenfolge, Liste der Ganzzahlen, native Zeit, geben Sie Ihre Sprachunterstützung ein, ...), aber keine Parameter sind zulässig, wenn sie nicht zusammenhängen zu der Zeit zu drucken. Wenn Sie keine Eingabe unterstützen, müssen Sie die aktuelle Uhrzeit verwenden. Wenn Sie beide unterstützen, ist das besser, aber es gibt keinen Bonus;)
- Ihr Code kann ein Programm, eine Funktion, ein Lambda, aber kein Snippet sein.
- Wenn Ihre Sprache das Drucken in irgendeiner Weise unterstützt, muss sie das Ergebnis drucken (in einer Datei, auf der Standardausgabe, macht es mir nichts aus). Wenn Ihre Sprache das Drucken in keiner Weise unterstützt, kann der erwartete Text einfach "zurückgegeben" werden. Das Ergebnis kann entweder nur Groß- oder Kleinschreibung sein, nicht eine Mischung aus beiden.
- Es gelten Standardlücken.
- Das ist Code-Golf, also gewinnt der kürzeste Code!
- Bitte geben Sie, soweit möglich, einen Link zu einem Online-Dolmetscher Ihrer Sprache an.
Testfälle
Input: <no input> (the current local time is 19:20)
Output:
IT IS
TWENTY
MINUTES
PAST
SEVEN
Input: 13:15
Output: (empty line is being printed)
IT IS
QUARTER
PAST
ONE
Input: 13:58
Output: (rounding)
IT IS
TWO
O'CLOCK
Input: 14:30
Output: (half is always a edge-case)
IT IS HALF
PAST TWO
Input: 15:35
Output: (light up "TO")
IT IS
TWENTY
FIVE MINUTES TO
FOUR
Input: 10:00
Output: (do not use the TEN or FIVE on the first line when referring to the hours)
IT IS
TEN
O'CLOCK
Input: 12:00
Output: (O'CLOCK and a lot of empty lines)
IT IS
TWELVE O'CLOCK
Antworten:
PHP,
387384353352342323310306298293291 BytesVielen Dank an @Christoph für das Golfen und seine hervorragenden Ergebnisse!
Mindestens 45 Bytes sind auf seinem Konto; 16 oder mehr von ihm inspiriert.
Ein Marvel Team Up!
durchläuft die Daten und prüft, ob sich der aktuelle Index in einer generierten Zeichenfolge befindet, die die Indizes der Wörter enthält, die aufleuchten sollen (Buchstaben zugeordnet); hängt Zeilenumbruch oder Leerzeichen an, je nach Index.
Gibt möglicherweise Hinweise, wenn Sie den Standardwert für
error_reporting
(22519) nicht verwenden.Testen Sie es online.
Nervenzusammenbruch
Golfplätze :
$x/5+.5|0
ist zwei Bytes kürzer alsround($x/5)
.date(h)
sind ein Byte kürzer als die Zuweisung vondate
Ergebnisses zu einer Variablen.$w<A
ist drei Bytes kürzer als$w=="\n"
- stellen Sie sicher, dass hinter einem Begrenzer kein Leerzeichen steht!abs
8 Bytes im Minutenwort gespeichert.Verwenden des Unterstrichs als ersten Index, der in die "es ist" -Alternativen aufgenommen werden darf; und es machte das Stundenangebot hinfällig.
1
Wertes in der Stundenkarte wurde das Modulo überflüssig und durch zusätzliches Golfen wurden 10 Bytes eingespart. Inspiriert von @Christoph.str_pad("",strlen($w))
->$w^$w^" "
. (Christoph)strtr
der zweite Parameter keine Zeichenfolge ist, wird er als ASCII-Code interpretiert. spart 5 Bytes.quelle
$i++%3^($i<3)
zu$i++%3^$i<3
. Ich bin jetzt offiziell völlig verschwendet. Ich mache eine Pause, bis jemand zu uns passt. Das hat wirklich Spaß gemacht. Vielen Dank, Titus, für deine Teamarbeit!TI-Basic,
335334 BytesZiemlich perfekt, da die TI-84-Rechner 8x16-Buchstaben-Displays haben und dies 8x15 sind. Das Datum wird als Eingabe verwendet, um Berechnungen vor TI-84 zu unterstützen, die keine internen Uhren haben. Wird ohne Argumente
Input
standardmäßig inX
und eingegebenY
, ähnlich wie inPrompt X,Y
. Machen SieX
also Stunden (alles>=0
wird korrekt funktionieren) undY
Minuten.Hinweis 1: Für TI-84 + können Sie
Input
mit etwas wie ersetzengetTime:Ans(1->X:getTime:Ans(2->Y
. Auchint(Y/5-5.6
ist gleichbedeutend mitround(Y/5,0)-6
. Und nein, in diesem Fallint(
konnte nicht mit ausgetauscht werdeniPart(
.Hinweis 2: Hiermit wird die Eingabe einwandfrei gedruckt, aber aus asethischen Gründen möchten Sie wahrscheinlich
Pause
am Ende des Programms dieDone
Meldung beim Programmende vermeiden .Bearbeiten: Die Anzahl der Bytes wurde gesenkt, weil sie tokenisiert waren (siehe Hinweis zur vorherigen Version). Dank @Neil wurde auch ein Fehler behoben. Drittens habe ich einen Fehler behoben, der 2 Byte gekostet hätte, aber durch die Optimierung wurde insgesamt 1 Byte gespart. Außerdem wurde mir klar, dass ich Eingaben
getTime
erhalte , sodass ich nicht anrufen muss (duh?). Für jeden, der diese Byteanzahl bestätigen möchte, ist das einzige Zwei-Byte-Tokensub(
.quelle
O'CLOCK
der Code nach der Ausgabe auch weiterhin ausgegebenPAST
wird ...x+(y>32) mod 12
wenn der Vergleich 1 oder 0 ergibt, wie in TI-Basic.JavaScript (ES6),
291303295 BytesNimmt Eingaben als zwei Ganzzahlen mit aktueller Syntax an
(h)(m)
Wie es funktioniert
Die gesamte Uhr kann als 23 LEDs gesehen werden, die entweder EIN oder AUS sind. Der Taktstatus ist also eine 23-Bit-Ganzzahl.
Die Minuten Logik , die wir die richtigen Worte implementieren müssen , damit ist nicht so einfach , wie man auf den ersten Blick denken könnte. Möglicherweise gibt es eine Magic-Golfing-Formel, aber ich habe mich auf die einfache Art und Weise entschieden, jede mögliche Konfiguration nur hart zu codieren:
Testfälle
Code-Snippet anzeigen
quelle
Batch, 789 Bytes
Hinweis: Nachgestellte Leerzeichen nach
PAST
und 5 nachgestellte Leerzeichen in jeder der folgenden beiden Zeilen.quelle
call:c
zum Beispiel)! Ich sollte wahrscheinlich etwas lernen :)JavaScript,
567 564 551 542 529 527519 BytesCode-Snippet anzeigen
Ich weiß nicht, ob es in Ordnung ist, Stunden und Minuten als Argumente zu nehmen. Sie sagten "Liste der ganzen Zahlen". Zählt es noch?
Ich spiele übrigens zum ersten Mal Golf. Was denkst du?
Bearbeiten: Einige Bytes durch Teilen von Minuten gespeichert. Danke, Olivier!
quelle
c
innerhalb Ihrer Funktion bewegen . Sie sollten kein Byte verlieren, wenn Sie das tun, denke ich, aber das macht es eher zu einem Snippet als zu einer Funktion (zumindest für mich werden JS-Gurus vielleicht etwas anderes sagen).JavaScript (ES6) 360
Eine Funktion mit den Eingabeparametern Stunde (0..23) und Minute (0..59).
Verwendung
alert
für die Ausgabe, da dies die Standardausgabefunktion in Javascript ist, auch wenn dies unpraktisch ist. (Und es ist kurz)Test Hinweis: Aus Sicherheitsgründen wird die Warnmeldung im Test-Snippet auf den Seitentext umgeleitet
quelle
i
? Ich kann sehen, dass Sie alle Nicht-Whitespace-Gruppen (die "LEDs") erhalten und sie durch Whitespace ersetzen, basierend auf den Bedingungen, die Sie für jede dieser Gruppen geschrieben haben. Zum Beispiel isth-2
es nur wann falschh == 2
, also nehme ich an, dass Sie es irgendwo invertieren? Können Sie ein bisschen erklären, wie das funktioniert? Vielleicht als Bearbeitung Ihrer Antwort? Ich wäre sehr dankbar!i
, um nach jeder Regex-Übereinstimmung auf das richtige zu verweisen, indem Sie es inkrementieren. Wenn es wahr ist, ersetzen Sie die übereinstimmende Zeichenfolge durch Leerzeichen, andernfalls belassen Sie es so, wie es ist. Eines verstehe ich allerdings nicht.replace()
Verwendet den Rückgabewert der angegebenen Funktion (in diesem Fall die Pfeilfunktion). Wo geben Sie einen Wert zurück? Ich sehe nur einen ternären Operator.(a,b)=>{ return a+b }
ist das gleiche wie(a,b)=>a+b
Python 2,
466,460,449,452,459,449 BytesDa es eine Funktion sein darf, die h und m als Ganzzahlen akzeptiert, können wir ein paar Bytes sparen. Probieren Sie es online aus .
Ich hatte ein paar Bugs (jetzt fest) mit der Logik für
TO
/PAST
vsO'CLOCK
. Außerdem wurden ein paar Bytes für dasenumerate
Ändern vonimport
und19<m<26
anstelle von gespeichertm in [20,25]
. Sparte weitere 8 für die Arbeit in 5-Minuten-Stücken, die länger als Minuten dauern. Rod wies auf einige weitere Fehler hin, die mich einiges gekostet haben, aber ich habe mich ein wenig erholt, mit effizienteren Aufgaben und einem Bugfix, der zu meinen Gunsten wirkte.quelle
==
als Vergleich gegen Python und ich gehe davon aus, dass ich einige derh
Tests verbessern kannprint c
in der letzten Zeile,c
hält bereitsa[i]
fälligenumerate
print
eine neue Zeile nach jedem Druck hinzufügen, können Sie unterdrücken es eine Zugabe,
nachc
. Auch sollte es Leerzeichen drucken, wenn ein Wort nicht gedruckt wird, können Sie mit einem anderen in der letzten ifelse:print' '*len(c),
Perl 6 ,
308296293 BytesProbieren Sie es online!
Erläuterung
Die Grundstruktur ist wie folgt:
Der wie
...|...|...|...
oben beschriebene Ausdruck ist eine Kreuzung von Ganzzahlen, die auf 1 basierende Wortindizes darstellen , und setzt sich wie folgt zusammen:quelle
Python3 (569 Byte)
Diese Antwort benötigt Zeit im Format hh mm (durch Leerzeichen getrennte Ganzzahlen). Ich habe es geschafft, '\ n' zu drucken, was von Chris ' Methode inspiriert ist. Danke, Chris! Jede Hilfe, die den Code reduziert, ist willkommen.
Probieren Sie es online
quelle
.split(',')
? Sollte ein paar retten.H,M=input()
wo die Eingabe H, M ist. Zwei Integer-Sequenzen sind nach den Regeln zulässig. Ich bin mir nicht sicher, ob dies unter Python 3 wie beabsichtigt funktioniert. Ich bin immer noch einH,M=input()
hat nicht funktioniert, wie Sie bezweifelt haben.Python 2 ,
443.440BytesProbieren Sie es online!
Es könnte wahrscheinlich immer noch von etwas mehr Golf profitieren. Die Eingabe ist eine Liste von ganzen Zahlen, zB 7,23 = 7:23
quelle
SimpleTemplate ,
737708 BytesJa, Ausführlichkeit und das Fehlen "echter" Mathematik haben dem Bytecount sehr geschadet.
Dies erwartet die Stunden und Minuten als 1. und 2. Parameter für die Klasse.
Ungolfed:
Wie läuft man:
Führen Sie den folgenden Code aus:
Getan!
quelle
Java (OpenJDK 9) , 437 Byte
Probieren Sie es online!
Ich dachte, ich würde endlich eine Chance auf meine Herausforderung geben;)
quelle
Perl 5 ,
487449 BytesProbieren Sie es online!
quelle