Biorąc pod uwagę datę zapisaną w dowolnym (musi obsłużyć wszystko w tym samym programie) następujących formatów, parsuj ją w poprawny yyyy/mm/dd date
.
17th May 2012
March 14th, 2016
20 February 2014
September 14, 2017
Sunday, June 8, 2015
Zasady
- Daty czasami są nieprawidłowe, tj. niepoprawny dzień miesiąca lub liczby miesięcy w roku, musisz obsłużyć oba przypadki. Albo przez pomyłkę, albo przez zwrócenie stałej wartości falsey, wybierasz. (Będą jednak trzymać się powyższych formatów szablonów)
- Aby utworzyć dwucyfrowe wyjście, należy użyć wypełnienia dla dni i miesięcy krótszych niż 10.
- Nazwy miesięcy zawsze będą pełnym imieniem, a nie skrótem do ich trzech postaci.
- Możesz założyć, że rok będzie zawsze mieścić się w przedziale 0000-9999.
- Liczb ujemnych nie trzeba traktować.
- Możesz utworzyć pełny program lub funkcję, aby dane wyjściowe mogły być w dowolnym formacie, wydrukowane na konsoli lub zwrócone z funkcji.
- Dane wejściowe zawsze będą ciągiem, dane wyjściowe zawsze muszą być ciągiem, jeśli skraca to przyjmowanie go jako pojedynczego argumentu w tablicy np.
["17th May 2012"]
możesz to zrobić, a wynik może być taki sam["2012/05/17"]
- Możesz założyć, że pisownia w danych wejściowych będzie poprawna.
BONUS: bo kto tu nie lubi wyzwania;)
Jeśli potrafisz również zezwolić na formaty wejściowe The Fourteenth of March, 2016
lub March the Fourteenth, 2016
możesz usunąć dodatkowe 20 bajtów z kodu, przy czym końcowy bajt będzie mniejszy niż 1, co da 1.
Oto pełne zapisane liczby dla każdego dnia, aby uniknąć pomyłek w pisowni.
First, Second, Third, Fourth, Fifth, Sixth, Seventh, Eighth, Nineth, Tenth, Eleventh, Twelfth, Thirteenth, Fourteenth, Fifteenth, Sixteenth, Seventeenth, Eighteenth, Nineteenth, Twentieth, Twenty First, Twenty Second, Twenty Third, Twenty Fourth, Twenty Fifth, Twenty Sixth, Twenty Seventh, Twenty Eighth, Twenty Nineth, Thirtieth, Thirty First
Przypadki testowe
INPUT | Output
17th May 2012 | 2012/05/17
March 14th, 2016 | 2016/03/14
20 February 2014 | 2014/02/20
September 14, 2017 | 2017/09/14
Sunday, June 8, 2015 | 2015/06/08
1st January 1918 | 1918/01/01
The Fourteenth of March, 2016 | 2016/03/14
March the Fourteenth, 2016 | 2016/03/14
November the Seventeenth, 2019 | 2019/11/17
The Thirtieth of April, 2016 | 2016/04/30
30 February 2014 | Invalid
September 99, 2017 | Invalid
Sunday, June8, 2015 | Invalid
The Thirty First of April, 2016 | Invalid
20 February 2014
są domyślne obsługiwane w wielu Date-parserami, ale17th
iSunday, June 8, 2015
są nieco trudniejsze do analizy (w zależności od języka).Thursday, August 25, 2017
ważny? Widzę zgłoszenia ignorujące DOW.Odpowiedzi:
Szyny,
41,3735 bajtówNie znam internetowego tłumacza dla Railsów, ale oto zrzut ekranu pokazujący ten proces
źródło
PowerShell ,
91899156 bajtówWypróbuj online!
Pobiera dane wejściowe jako ciąg. Używa a,
-replace
aby pozbyć się śmieci, a następnie używa wbudowanejGet-Date
komendy z-f
flagą ormat, aby określić wymaganyyyyy/MM/dd
format. Ten ciąg jest pozostawiony w potoku, a dane wyjściowe są niejawne.Zaoszczędził dwa bajty dzięki Mr Xcoder. Oszczędność ogromnej części dzięki regexowi golfowemu TessellatingHeckler.
źródło
''
z formatu daty dla -2. Jeśli chcesz pozostać przy swoim podejściu, biorąc pod uwagę, że „pisownia jest poprawna”, możesz go zastąpić'th|rd|st|(\b.*)day|,'
i spada on do 56 bajtów i obsługuje te same przypadki. Chociaż myślę, że to źle, ponieważ jeśli upuścisz dni, nie możesz odebraćSunday, June8, 2015 | Invalid
sprawy, ponieważ był to poniedziałek. Powinien być błędny, ale analizowany jako poprawny. Nie jestem pewien, jakie będzie orzeczenie w tej sprawie ani czy inni to sprawdzają.PHP,
73164 + 1 bajtyUruchom jako potok z
-nR
lub spróbuj online .Sprawdzanie daty było naprawdę drogie: musiałem zdemontować datę przed użyciem wbudowanego, a następnie spróbować popełnić błąd w nazwie miesiąca.
źródło
30 February 2014
zwraca2014/03/02
. Albo przez pomyłkę, albo przez zwrócenie stałej wartości falsey, wybierasz. (Będą jednak trzymać się powyższych formatów szablonów)Python 3 + parsowana biblioteka czasu,
152139155153 bajtówZaoszczędź 13 bajtów dzięki Jonathanowi Allanowi
Dodano 16 bajtów do obsługi dat z niepoprawną długością dni
Zaoszczędzono 2 bajty, usuwając przypisanie lambda
Wypróbuj online!
Nie obsługuje dat bonusowych
źródło
None
;import ...as
; ilambda
przez ponowne użycieparse
jakoh
.Python 2 , 193 bajtów
Wypróbuj online!
; -; proszę halp
źródło
time
.f=
z liczby bajtów TiO), deklarującre.sub
Java (OpenJDK 8) , 190 + 26 = 216 bajtów
Wypróbuj online!
Ważna uwaga: krótsza była także walidacja dnia tygodnia niż porzucenie go, aby włączyć walidację!
Nie próbowałem
SimpleDateFormat
poza oczywistymi przypadkami, które wszystkie zaakceptowały daty, takie jak 30 lutego. Więc musiałem to porzucić i użyłem Java 8DateTimeFormatter
.Wyjaśnienie
Ten format oznacza:
[EEEE, ]
(dzieje się zaSunday, ...
),[d ]
,MMMM
i spacją,[d, ]
,uuuu
aby poinformować parsera, że jesteśmy w erze gregoriańskiej.Kod:
Kredyty
źródło
replaceAll
wzorze?JavaScript (ES6),
124122 bajtówźródło
2015/06/07
zaJune 8, 2015
(problem UTC? Jestem w UTC + 2) ifalse
za jedenSunday, June 8, 2015
lub dwaMonday, June 8, 2015
.nday
.