Порядок форматирования дат - одна из самых сложных и противоречивых проблем, с которыми сегодня сталкивается мир. Некоторые из нас неистово утверждают, что Месяц / День / Год - это уместно, учитывая, что, как мы говорим, мы говорим вслух. Другие громко заявляют, что День / Месяц / Год - лучший, потому что это помещает условия в порядке возрастания продолжительности, которую они представляют.
Хватит значит хватит. Компьютеры могут решить этот спор просто и справедливо. Ваш код, полная функция или программа, будет принимать строку даты, разделенную косыми чертами, например 12/1/2015
. Обратите внимание, что это точный формат без начальных нулей и четырехзначного года в конце.
- Если это определенно месяц / день / год, например
10/31/1998
, выведите текстовое представление этой даты в этом точном формате с полным названием месяца, дня и года:October 31, 1998
- Если это , безусловно , день / месяц / год, например
25/12/1989
, выход такого же рода текстовое представление:December 25, 1989
. - Если это неоднозначно, будь то месяц / день / год или день / месяц / год, выведите дату, которая разрешает неоднозначность, комбинируя две возможные даты следующим образом:
- Создайте новое имя месяца, взяв первую половину названия предыдущего месяца и добавив вторую половину более позднего месяца. В течение месяцев с нечетной длиной первая половина получает дополнительную букву. Для того, чтобы быть явными, первые половинки месяцев
Janu
,Febr
,Mar
,Apr
,Ma
,Ju
,Ju
,Aug
,Septe
,Octo
,Nove
, и ,Dece
а вторые половинки, следовательноary
,uary
,ch
,il
,y
,ne
,ly
,ust
,mber
,ber
,mber
, иmber
. - Рассчитайте день, усреднив два возможных дня, взяв слово, когда среднее не является целым числом.
- Выведите текстовое представление этой даты, например, для
10/8/2011
выводаAugber 9, 2011
.
- Создайте новое имя месяца, взяв первую половину названия предыдущего месяца и добавив вторую половину более позднего месяца. В течение месяцев с нечетной длиной первая половина получает дополнительную букву. Для того, чтобы быть явными, первые половинки месяцев
Если дата ввода не может быть месяц / день / год или день / месяц / год (например, 13/13/2013
или даже 2/30/2002
), любое поведение приемлемо. Этот код гольф, самый короткий код выигрывает!
Тестовые случаи:
10/31/1998
дает October 31, 1998
25/12/1989
дает December 25, 1989
10/8/2011
дает Augber 9, 2011
8/5/1957
дает Maust 6, 1957
9/12/2012
(как ни странно) дает September 10, 2012
1/1/2000
дает January 1, 2000
without leading zeroes and with a four-digit year at the end
подразумеваетyear >= 1000
Ответы:
Pyth - 156 байт
Действительно плохой код, и нужно будет использовать упакованные строки, но это что-то.
Тестовый пакет .
источник
Mathematica
341 304 298 288293 байтаПри этом используется чистая или анонимная функция, то есть функция без собственного имени.
DateString
возвращает сообщение об ошибке, если дата неоднозначна.Check
ловит неоднозначность и отправляет ошибочную датуDateList
, которая преобразует ее в список из 3 целых чисел (который он считает{year, month, day}
). Целые числа месяца и дня сортируются по размеру и используются для определения месяца и дня согласно инструкциям ОП.Quiet
заставляет замолчать ошибки печати.источник
Javascript (ES6),
311295282274246238 байтРедактировать: Используется
toLocaleString
для генерации названий месяцев. Измените локаль, чтобы получить результаты, используя названия месяцев в разных локалях!Редактировать 2: теперь генерирует два названия месяца вместо всех 12!
Ungolfed:
Пример:
Спасибо:
@ user81655 , 274 => 246 байт
@ edc65 , 246 => 238 байт
источник
Math.ceil(e[c].length/2)
на(r=e[c].length/2)+r%1
,Array(2).fill().map((_,f)=>...)
наf=>...
и всеe[n]
наe(n)
,i=+(g>h)
наi=g>h
иe[i]
наe[+i]
, удалить ненужные скобки в последнем троичном операторе. ТакжеnewDate
должно бытьnew Date
.Math.ceil
использованияb=c=>e(c).length+1>>1
JavaScript ES6, 204
Тестовый фрагмент:
источник
Python 3 (290 байт)
Аналогичен ответу Эшвина Гупты, но использует модуль календаря Python, чтобы избежать написания всех названий месяцев.
Python 2 должен обрезать несколько байтов с целочисленным делением и потерять скобки для
print
.источник
Python,
558554 байтаДействительно, действительно, действительно ужасный пример того, как сделать это в Python. Извините, я очень плох в этом деле
D:
. Это работает, хотя. Я уверен, что есть много способов упростить это, поэтому дайте мне знать в комментариях. Golfed:Ungolfed
Скриншот:
источник
S=" "
в верхней части, а затем заменить каждый экземпляр" "
сS
- что будет сбрить несколько байтe= int[...
,o = o...
). Кроме того, может оказаться полезным устанавливать часто используемые вызовы, такие какint
однобуквенные переменные в верхнем регистреfrom math import* I=int S=" " C="," L=len P=print def d(i): l=["","January","February","March","April","May","June","July","August","September","October","November","December"];w=i.split('/');f=I(w[0]);s=I(w[1]);y=w[2] if f>12:e=I(w[1]);P(l[e]+S+w[0]+C+S+y) elif f<13and s>12:e=I(w[0]);P(l[e]+S+w[0]+C+S+y) else: if f<s:o=l[f];t=l[s] else:o=l[s];t=l[f];o=o[0:I(ceil(L(o)/2))];t=t[I(ceil(L(t)/2)):L(t)] P(o+t+S+str(floor((f+s)/2))+C+S+y)
PHP,
301294 байтаЯ думал, что смогу конкурировать с ответом Javascript. Ну что ж.
Я думаю, что я мог бы сделать это меньше, и мне не нравится код, который я использовал для неоднозначных дат. Я думаю, что есть лучший способ сделать это.
Ungolfed:
источник