Преобразуйте формат короткой даты в английскую длинную дату как можно меньше байтов.
вход
Ввод будет в форме строки с форматом yyyy-mm-dd
, с нулевым заполнением необязательно для всех значений. Вы можете предположить, что это синтаксически правильно, но не обязательно является действительной датой. Отрицательные значения года не должны поддерживаться.
Выход
Вы должны преобразовать дату в английский длинный формат даты (например 14th February 2017
). Нулевое заполнение здесь не допускается.
Если дата недействительна (например 2011-02-29
), то это должно быть каким-то образом распознано. Бросать исключение разрешено.
Больше примеров можно увидеть ниже.
Тестовые случаи
"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
источник
источник
03rd
вместо3rd
2016-2-29
?Ответы:
PostgreSQL, 61 символ
Подготовленный оператор, принимает входные данные в качестве параметра.
Образец прогона:
источник
Python 3.6,
137129 байтПопробуйте онлайн!
источник
%-d
это версия без отступов,%d
которую вы можете использовать при форматировании строки вместо{g[2]}
. Кроме того,12
должно стать12th
, а не12nd
(числа от 10-19 не следуют тем же правилам, что и 1-9 и 20+)f
струнахJavaScript (ES6),
142140 байтВыходы
NaNth Invalid Date
для недействительных дат.Код для порядковых чисел был адаптирован из этого ответа .
Показать фрагмент кода
источник
Python 3.6 , 154 байта
Попробуйте онлайн! (Установите поток ввода и затем запустите.)
Благодаря хорошим предложениям от комментаторов ниже.
источник
int(x)
иfor
в вашем списке комп.(('st','nd','rd')[b%10-1]if b<4 or 20<b<24 else'th')
вместо вашего текущего условного для -3 байта.(3<b<21)+(23<b<31)
за -1 байт. Попробуйте онлайн!PHP, 87 байт
Запустите как трубу с
-F
или проверьте это онлайн . Всегда печатает четырехзначный год; терпит неудачу в течение многих лет> 9999.нет проверки достоверности, 35 байт:
источник
Bash + coreutils,
11578Попробуйте онлайн .
источник
f=thstndrd; $d"${f:t/10-1?t%10<4?t%10*2:0:0:2} %B %Y"
.C #,
147143 байтаСохранено 4 байта благодаря @The_Lone_Devil.
источник
t.Day
сd
для экономии 4 байта?версия mIRC 7.49 (197 байт)
источник
Рубин ,
104103102 + 8 =112111110 байтИспользует
-rdate -p
флаги программы.-1 байт от manatwork.
Попробуйте онлайн!
источник
d<4||d>20?"..stndrd"[d%10*2,2]:"th"
26
будет пытаться получить доступ к индексам12..13
в строке поиска, которая находится за пределами, и, следовательно, возвращаетnil
. Таким образом, использование троичного делает егоd<4||d>20?"..stndrd"[d%10*2,2]||"th":"th"
длиннее на 2 байта."th"
→:th
.C # (.NET Core) ,
167197 байтПопробуйте онлайн!
+30 байт для
using System;
DateTime.Parse()
источник
!
-1 байта. И вы можете изменить&&
в&
течение -3 байт. Кроме того, поскольку вы используетеs.Day
7 раз, он экономит несколько байтов, чтобы создать для него временное значение: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;
или полностью квалифицироватьDateTime
объект.DateTime.MinValue
это ,1-1-1
так что я не думаю , что вам нужно это проверить. Что также сделало бы мой предыдущий пункт неуместным.DateTime
и анализ вне метода недопустимо, вы должны делать всю работу внутри метода. Или добавьте дополнительный метод для разделения работы.Excel, 212 байт
Если вы разбиваете его на куски на каждом амперсанде, вы получаете эти кусочки:
ABS()
извлекает номер дня из двух последних символов в строке. Поскольку это может включать дефис,ABS
преобразует его в положительный.IF((ABS-12)<2,"th",SWITCH())
добавляет порядковый номер.-12
Бит , потому что 11, 12 и 13 не следуют нормальному правилу , и все они получаютth
вместоst
,nd
иrd
. Это исправляет для этого.SWITCH
Функция доступна только в Excel 2016 и более поздних версиях. ( Источник ) Он короче, чемCHOOSE
в этом случае, потому что он может возвращать значение, если совпадение не найдено, тогда какCHOOSE
требует числового ввода и должен иметь соответствующий возврат для каждого возможного значения.TEXT(MID()*30," mmmm ")
извлекает название месяца.MID()
вытаскивает номер месяца в виде строки, а умножение на 30 возвращает число. Excel видит это число как дату (1900-01-30, 1900-02-29, 1900-03-30 и т. Д.) ИTEXT()
форматирует его как название месяца с пробелом на обоих концах. 28 и 29 тоже бы работали, но 30 выглядит "лучше".LEFT()
извлекает номер года.Теперь, учитывая все это, было бы намного проще, если бы все контрольные примеры были в диапазоне дат, который Excel может обработать как фактическую дату: с 1900-01-01 по 9999-12-31. Большим преимуществом является то, что вся дата форматируется сразу. Это решение составляет 133 байта :
Другим большим препятствием было включение порядкового номера. Без этого решение будет всего 34 байта :
источник
Swift 3: 298 байт
Попробуйте онлайн!
источник
# Language, N bytes
. Было бы хорошо, если бы вы могли добавить еще один.T-SQL, 194 байта
Ввод осуществляется с текстовой колонке I в уже существующей таблице т , в соответствии с нашими стандартами IO .
Работает для дат с 1 января 0001 по 31 декабря 9999 года. Год выводится не менее чем из 3 цифр (на пример 150AD).
Неверные даты приведут к следующей ужасной ошибке:
Различные настройки языка / культуры по умолчанию могут изменить это поведение. Если вы хотите немного более изящный вывод ошибок (NULL), добавьте 4 байта, изменив
PARSE()
наTRY_PARSE()
.Формат и объяснение:
Тип
DATE
данных, введенный в SQL 2008, предоставляет гораздо более широкий диапазон, чемDATETIME
с 1 января 0001 года по 31 декабря 9999 года.Некоторые очень ранние даты могут быть неправильно проанализированы в моих настройках местности в США («01-02-03» становится «2 января 2003»), поэтому я заранее добавил пару дополнительных нулей, чтобы он знал, что первое значение - это год.
После этого это просто грязное
CASE
заявление, чтобы добавить порядковый суффикс в день. Досадно, чтоFORMAT
команда SQL не может сделать это автоматически.источник
q / kdb + 210 байт, не конкурирует
Решение:
Примеры:
Объяснение:
Это ужасная проблема, так как нет форматирования даты, поэтому мне нужно создавать месяцы с нуля (95 байт), а также генерировать суффикс.
Раскрытое решение ниже, в основном разбивает входную строку и затем объединяет ее после того, как мы добавили суффикс и переключили месяц.
Примечания:
Даты в q возвращаются только к ~ 1709, поэтому у меня нет тривиального способа проверки даты, поэтому это неконкурентная запись ... Лучшее, что я могу сделать, это проверить, является ли день> 31 или месяц > 12 и вернуть 0.
источник