Konvertieren Sie das kurze Datumsformat in so wenig Byte wie möglich in das englische lange Datum.
Eingang
Die Eingabe erfolgt in Form einer Zeichenfolge mit Format yyyy-mm-dd
, wobei das Auffüllen mit Nullen für alle Werte optional ist. Sie können davon ausgehen, dass dies syntaktisch korrekt ist, jedoch nicht unbedingt ein gültiges Datum. Negative Jahreswerte müssen nicht unterstützt werden.
Ausgabe
Sie müssen das Datum in das englische Langzeitformat konvertieren (z. B. 14th February 2017
. ). Hier ist kein Auffüllen zulässig.
Wenn das Datum ungültig ist (z 2011-02-29
), muss dies auf irgendeine Weise erkannt werden. Das Auslösen einer Ausnahme ist zulässig.
Weitere Beispiele finden Sie weiter unten.
Testfälle
"1980-05-12" -> 12th May 1980
"2005-12-3" -> 3rd December 2005
"150-4-21" -> 21st April 150
"2011-2-29" -> (error/invalid)
"1999-10-35" -> (error/invalid)
code-golf
date
conversion
GarethPW
quelle
quelle
03rd
statt3rd
2016-2-29
?Antworten:
PostgreSQL, 61 Zeichen
Prepared-Anweisung, übernimmt die Eingabe als Parameter.
Probelauf:
quelle
Python 3.6,
137129 BytesProbieren Sie es online!
quelle
%-d
ist die Version ohne Auffüllen%d
, die Sie für die Formatierung von Zeichenfolgen anstelle von verwenden können{g[2]}
. Auch12
sollten sich12th
nicht12nd
(Nummern 10 bis 19 nicht den gleichen Regeln wie 1-9 folgen und 20+)f
SaitenJavaScript (ES6),
142140 ByteAusgänge
NaNth Invalid Date
für ungültige Daten.Der Code für Ordnungszahlen wurde aus dieser Antwort angepasst .
Code-Snippet anzeigen
quelle
Python 3.6 , 154 Bytes
Probieren Sie es online!(Stellen Sie den Eingabestream ein und führen Sie ihn aus.)
Dank guter Vorschläge von Kommentatoren unten.
quelle
int(x)
undfor
in Ihrer Listenkomponente entfernen .(('st','nd','rd')[b%10-1]if b<4 or 20<b<24 else'th')
anstelle Ihrer aktuellen Bedingung für -3 Bytes.(3<b<21)+(23<b<31)
für -1 Byte. Probieren Sie es online!PHP, 87 Bytes
Laufen Sie als Pipe mit
-F
oder testen Sie es online . Gibt immer eine vierstellige Jahreszahl aus. scheitert seit Jahren> 9999.keine Gültigkeitsprüfung, 35 Bytes:
quelle
Bash + Coreutils,
11578Probieren Sie es online aus .
quelle
f=thstndrd; $d"${f:t/10-1?t%10<4?t%10*2:0:0:2} %B %Y"
.C #,
147143 Bytes4 Bytes dank @The_Lone_Devil eingespart.
quelle
t.Day
mitd
einer 4 - Byte - Einsparung?mIRC Version 7.49 (197 Bytes)
quelle
Ruby ,
104103102 + 8 =112111110 BytesVerwendet
-rdate -p
Programmflags.-1 Byte von Handarbeit.
Probieren Sie es online!
quelle
d<4||d>20?"..stndrd"[d%10*2,2]:"th"
26
versucht, auf Indizes12..13
in der außerhalb der Grenzen liegenden Suchzeichenfolge zuzugreifen , und gibt diese zurücknil
. Somit macht esd<4||d>20?"..stndrd"[d%10*2,2]||"th":"th"
die Verwendung des Ternären , das um 2 Bytes länger ist."th"
→:th
.C # (.NET Core) ,
167 bis197 ByteProbieren Sie es online!
+30 Bytes für
using System;
DateTime.Parse()
quelle
!
für -1 Byte zu entfernen. Und Sie können das ändern ,&&
um&
für -3 Bytes. Da Sies.Day
7-mal verwenden, werden einige Bytes gespart, um einen temporären Wert dafür zu erstellen:s=>{var t=s.Day;return s.Equals(DateTime.MinValue)?"":t+((t%10==1&t!=11)?"st":(t%10==2&t!=12)?"nd":(t%10==3&t!=13)?"rd":"th")+" "+s.ToString("MMMM")+" "+s.Year;}
using System;
dasDateTime
Objekt auch einschließen oder vollständig qualifizieren .DateTime.MinValue
ist1-1-1
so glaube ich nicht , dass Sie , dass der Check benötigen. Das würde auch meinen vorherigen Punkt irrelevant machen.DateTime
und das Parsen außerhalb der Methode ist nicht akzeptabel. Sie sollten die gesamte Arbeit innerhalb der Methode ausführen. Oder fügen Sie eine zusätzliche Methode hinzu, um die Arbeit abzuspalten.Excel, 212 Bytes
Wenn Sie es bei jedem kaufmännischen Und in Stücke teilen, erhalten Sie die folgenden Teile:
ABS()
Ruft die Tageszahl aus den letzten beiden Zeichen der Zeichenfolge ab. Da dies einen Bindestrich enthalten kann,ABS
wird dieser in einen positiven umgewandelt.IF((ABS-12)<2,"th",SWITCH())
fügt die Ordnungszahl hinzu. Das-12
Bit ist , weil 11, 12 und 13 nicht der normale Regel folgen und sie alle bekommenth
stattst
,nd
undrd
. Das korrigiert das.SWITCH
Funktion ist nur in Excel 2016 und höher verfügbar. ( Quelle ) Es ist kürzer alsCHOOSE
in diesem Fall, da es einen Wert zurückgeben kann, wenn keine Übereinstimmung gefunden wird, währendCHOOSE
eine numerische Eingabe erforderlich ist und für jeden möglichen Wert eine entsprechende Rückgabe erfolgen muss.TEXT(MID()*30," mmmm ")
extrahiert den Monatsnamen.MID()
Zieht die Monatszahl als String heraus und multipliziert mit 30 ergibt sich eine Zahl. Excel sieht diese Zahl als Datum (1900-01-30, 1900-02-29, 1900-03-30 usw.) undTEXT()
formatiert sie als Monatsnamen mit einem Leerzeichen an beiden Enden. 28 und 29 hätten auch geklappt aber 30 sieht "schöner" aus.LEFT()
extrahiert die Jahreszahl.Angesichts dessen wäre es jetzt viel einfacher gewesen, wenn die Testfälle alle in einem Datumsbereich lagen, den Excel als aktuelles Datum behandeln kann: 1900-01-01 bis 9999-12-31. Der große Vorteil ist, dass das gesamte Datum auf einmal formatiert wird. Diese Lösung ist 133 Bytes :
Die andere große Hürde bestand darin, die Ordnungszahl aufzunehmen. Ohne das ist die Lösung nur 34 Bytes :
quelle
Schnelle 3: 298 Bytes
Probieren Sie es online!
quelle
# Language, N bytes
. Es wäre gut, wenn Sie auch eine hinzufügen könnten.T-SQL, 194 Bytes
Die Eingabe erfolgt über Textspalte i in vorbestehenden Tabelle t , gemäß unseren IO - Standards .
Funktioniert für Daten vom 1. Januar 0001 bis zum 31. Dezember 9999. Das Jahr wird mit mindestens 3 Ziffern ausgegeben (pro 150AD-Beispiel).
Ungültige Daten führen zu folgendem hässlichen Fehler:
Unterschiedliche Standardeinstellungen für Sprache / Kultur können dieses Verhalten ändern. Wenn Sie einen etwas anmutigen Fehlerausgang (NULL) mögen, fügen Sie 4 Bytes durch Änderung
PARSE()
zuTRY_PARSE()
.Format und Erklärung:
Der
DATE
in SQL 2008 eingeführte Datentyp ermöglicht einen viel größeren Bereich alsDATETIME
vom 1. Januar 0001 bis zum 31. Dezember 9999.Einige sehr frühe Daten können mit meinen US-Ländereinstellungen falsch analysiert werden ("01-02-03" wird zu "Jan 2 2003"), daher habe ich ein paar zusätzliche Nullen vorangestellt, damit festgestellt wird, dass der erste Wert das Jahr ist.
Danach ist es nur eine unordentliche
CASE
Anweisung, dem Tag das Ordnungssuffix hinzuzufügen. Es ist ärgerlich, dass der SQL-FORMAT
Befehl dies nicht automatisch ausführen kann.quelle
q / kdb + 210 Bytes, nicht konkurrierend
Lösung:
Beispiele:
Erläuterung:
Dies ist eine schreckliche Herausforderung, da es keine Datumsformatierung gibt. Daher muss ich Monate von Grund auf neu erstellen (95 Byte) und das Suffix generieren.
Ungolfed Lösung ist unten, teilen Sie im Grunde die Eingabezeichenfolge und verbinden Sie sich dann wieder, nachdem wir das Suffix hinzugefügt und den Monat umgestellt haben.
Anmerkungen:
Die Daten in q gehen nur auf ~ 1709 zurück, sodass ich keine einfache Möglichkeit habe, das Datum zu validieren. Daher ist dies ein nicht konkurrierender Eintrag. Das Beste, was ich tun kann, ist zu überprüfen, ob der Tag> 31 oder der Monat ist > 12 und gebe 0 zurück.
quelle