Konwertuj format krótkiej daty na angielską długą datę w jak najmniejszej liczbie bajtów.
Wejście
Dane wejściowe będą miały postać łańcucha o formacie yyyy-mm-dd
, z opcjonalnym wypełnieniem zerowym dla wszystkich wartości. Możesz założyć, że jest to poprawna składniowo, ale niekoniecznie poprawna data. Ujemne wartości roku nie muszą być obsługiwane.
Wynik
Musisz przekonwertować datę na angielski format długiej daty (np 14th February 2017
.). Wypełnianie zera tutaj jest niedozwolone.
Jeśli data jest nieprawidłowa (np. 2011-02-29
), Należy ją w jakiś sposób rozpoznać. Zgłaszanie wyjątku jest dozwolone.
Więcej przykładów można zobaczyć poniżej.
Przypadki testowe
"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
źródło
źródło
03rd
zamiast3rd
2016-2-29
?Odpowiedzi:
PostgreSQL, 61 znaków
Przygotowana instrukcja przyjmuje dane wejściowe jako parametr.
Przykładowy przebieg:
źródło
Python 3.6,
137129 bajtówWypróbuj online!
źródło
%-d
jest wersją bez wypełniania%d
, której można używać w formatowaniu ciągów zamiast{g[2]}
. Ponadto,12
powinno stać12th
, a nie12nd
(numery od 10-19 nie przestrzegają tych samych zasad jak 1-9 i 20+)f
strunachJavaScript (ES6),
142140 bajtówDane wyjściowe
NaNth Invalid Date
dla nieprawidłowych dat.Kod liczb porządkowych został dostosowany z tej odpowiedzi .
Pokaż fragment kodu
źródło
Python 3.6 , 154 bajty
Wypróbuj online! (Ustaw strumień wejściowy, a następnie uruchom.)
Dzięki dobrym sugestiom komentujących poniżej.
źródło
int(x)
ifor
na liście komp.(('st','nd','rd')[b%10-1]if b<4 or 20<b<24 else'th')
zamiast obecnego warunkowego dla -3 bajtów.(3<b<21)+(23<b<31)
dla -1 bajtu. Wypróbuj online!PHP, 87 bajtów
Uruchom jako potok
-F
lub przetestuj go online . Zawsze drukuje 4-cyfrowy rok; zawodzi przez lata> 9999.brak kontroli ważności, 35 bajtów:
źródło
Bash + coreutils,
11578Wypróbuj online .
źródło
f=thstndrd; $d"${f:t/10-1?t%10<4?t%10*2:0:0:2} %B %Y"
.C #,
147143 bajtówZaoszczędzono 4 bajty dzięki @The_Lone_Devil.
źródło
t.Day
zd
dla oszczędzania 4 bajtów?Wersja mIRC 7.49 (197 bajtów)
źródło
Rubin ,
104103102 + 8 =112111110 bajtówWykorzystuje
-rdate -p
flagi programu.-1 bajt z manatwork.
Wypróbuj online!
źródło
d<4||d>20?"..stndrd"[d%10*2,2]:"th"
26
spróbuje uzyskać dostęp do indeksów12..13
w ciągu wyszukiwania, który jest poza zakresem, a zatem zwracanil
. Zatem użycie trójskładnika sprawia, żed<4||d>20?"..stndrd"[d%10*2,2]||"th":"th"
jest on dłuższy o 2 bajty."th"
→:th
.C # (.NET Core) ,
167197 bajtówWypróbuj online!
+30 bajtów dla
using System;
DateTime.Parse()
źródło
!
bajtu dla -1. Można zmienić&&
, aby&
do -3 bajtów. Ponadto, ponieważ używaszs.Day
7 razy, oszczędza to kilka bajtów, aby utworzyć dla niego wartość tymczasową: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;
lub w pełni zakwalifikowaćDateTime
obiekt.DateTime.MinValue
jest1-1-1
więc nie sądzę, trzeba ten czek. Co sprawiłoby, że mój poprzedni punkt byłby nieistotny.DateTime
i analizowanie poza metodą jest niedopuszczalne, powinieneś wykonać całą pracę wewnątrz metody. Lub dodaj dodatkową metodę podziału pracy.Excel, 212 bajtów
Jeśli podzielisz go na kawałki na każdym znaku handlowego, otrzymasz następujące elementy:
ABS()
pobiera liczbę dni z dwóch ostatnich znaków w ciągu. Ponieważ może zawierać łącznik,ABS
konwertuje go na dodatni.IF((ABS-12)<2,"th",SWITCH())
dodaje porządek.-12
Nieco dlatego, 11, 12 i 13 nie stosują normalnej regułę i oni wszyscy sięth
zamiastst
,nd
ird
. To poprawia to.SWITCH
funkcja jest dostępna tylko w programie Excel 2016 i nowszych. ( Źródło ) Jest krótszy niżCHOOSE
w tym przypadku, ponieważ może zwrócić wartość, jeśli nie zostanie znalezione dopasowanie, podczas gdyCHOOSE
wymaga wprowadzania danych liczbowych i musi mieć odpowiedni zwrot dla każdej możliwej wartości.TEXT(MID()*30," mmmm ")
wyodrębnia nazwę miesiąca.MID()
wyciąga liczbę miesięcy jako ciąg znaków i pomnożenie przez 30 zwraca liczbę. Excel widzi tę liczbę jako datę (1900-01-30, 1900-02-29, 1900-03-30 itd.) ITEXT()
formatuje ją jako nazwę miesiąca ze spacją na obu końcach. 28 i 29 też by działały, ale 30 wygląda „ładniej”.LEFT()
wyodrębnia numer roku.Biorąc to wszystko pod uwagę, byłoby znacznie łatwiej, gdyby wszystkie przypadki testowe znajdowały się w zakresie dat, który Excel może obsłużyć jako rzeczywistą datę: od 1900-01-01 do 9999-12-31. Dużą zaletą jest to, że cała data jest formatowana jednocześnie. To rozwiązanie ma 133 bajty :
Inną dużą przeszkodą było uwzględnienie porządkowej. Bez tego rozwiązanie ma tylko 34 bajty :
źródło
Swift 3: 298 bajtów
Wypróbuj online!
źródło
# Language, N bytes
. Byłoby dobrze, gdybyś mógł dodać jeszcze jeden.T-SQL, 194 bajty
Dane wejściowe są wprowadzane za pomocą kolumny tekstowej i w istniejącej tabeli t , zgodnie z naszymi standardami we / wy .
Działa dla dat od 1 stycznia 0001 do 31 grudnia 9999. Rok jest generowany z co najmniej 3 cyframi (na przykład 150AD).
Nieprawidłowe daty spowodują następujący brzydki błąd:
Różne domyślne ustawienia języka / kultury mogą zmienić to zachowanie. Jeśli chcesz nieco bardziej płynnego wyjścia błędu (NULL), dodaj 4 bajty, zmieniając
PARSE()
naTRY_PARSE()
.Format i objaśnienie:
Typ
DATE
danych wprowadzony w SQL 2008 pozwala na znacznie szerszy zakres niżDATETIME
od 1 stycznia 0001 do 31 grudnia 9999.Niektóre bardzo wczesne daty mogą zostać błędnie przeanalizowane w moich ustawieniach lokalizacji w USA („01-02-03” zmienia się na „2 stycznia 2003 r.”), Więc przygotowałem kilka dodatkowych zer, aby wiedzieć, że pierwszą wartością jest rok.
Potem jest to tylko niechlujne
CASE
stwierdzenie, aby dodać porządkowy przyrostek do dnia. Irytujące jest to, żeFORMAT
polecenie SQL nie ma możliwości zrobienia tego automatycznie.źródło
q / kdb + 210 bajtów, niekonkurujące
Rozwiązanie:
Przykłady:
Wyjaśnienie:
To straszne wyzwanie, ponieważ nie ma formatowania daty, więc muszę tworzyć miesiące od zera (95 bajtów), a także generować przyrostek.
Niegolfowane rozwiązanie jest poniżej, w zasadzie podziel ciąg wejściowy, a następnie połącz ponownie, po dodaniu sufiksu i zmianie miesiąca.
Uwagi:
Daty w q wracają tylko do ~ 1709, więc nie mam trywialnego sposobu na sprawdzenie daty, dlatego jest to niekonkurencyjny wpis ... Najlepsze, co mogę zrobić, to sprawdzić, czy dzień ma> 31, czy miesiąc > 12 i zwróć 0.
źródło