Если задан неотрицательный целочисленный код даты в стиле Excel, верните соответствующую «дату» в любой разумной форме, которая четко показывает год, месяц и «день».
Тривиально, вы можете подумать. Вы заметили "напуганные цитаты"? Я использовал их, потому что в Excel есть некоторые причуды. Excel подсчитывает дни с цифрой 1 на 1 января ст , 1900, но , как если бы 1900 был января 0 - й и 29 февраля - го , так что будьте очень осторожны , чтобы попробовать все тестовые случаи:
Input → Output (example format)
0 → 1900-01-00 Note: NOT 1899-12-31
1 → 1900-01-01
2 → 1900-01-02
59 → 1900-02-28
60 → 1900-02-29 Note: NOT 1900-03-01
61 → 1900-03-01
100 → 1900-04-09
1000 → 1902-09-26
10000 → 1927-05-18
100000 → 2173-10-14
code-golf
date
conversion
Адам
источник
источник
DayOfWeek
метод , потому что оригинальная эпоха, 1899-12-30 (или фиктивный 1900-01-00) был выбран таким, чтобы будний день был просто мод-7 числа дня, но это не сработает с 1899-12-30.Ответы:
Excel, 3 (+7?)
с форматом
Чистый порт
источник
к (кдб + 3,5),
55545150 байтчтобы проверить, вставьте эту строку в консоль q:
выход должен быть
{
}
это функция с аргументомx
0 60?x
индексx
среди0 60
или 2, если не найденˋ1900.01.00ˋ1900.02.29
список из двух символов,
добавить к нему"d"$
преобразован в датуx-36526
количество дней с 1900 года (вместо 2000 по умолчанию)- x<60
скорректировать ошибку прыжка в Excel(ˋ1900.01.00ˋ1900.02.29,"d"$x-36526-x<60)
@0 60?x
juxtaposition означает индексирование - «@» в середине неявно$
преобразовать в строкуисточник
{$[x;$`d$x-65746;"1900.01.00"]}
кажется, работает . Я предполагаю, что что-то переполняется где-то100000
.Python 2 , 111 байт
Попробуйте онлайн!
-5 благодаря нгн .
источник
JavaScript (ES6),
89 8277 байтСохранено
712 байт благодаря @tshПопробуйте онлайн!
источник
n=>n?n-60?new Date(1900,0,n-(n>60)).toJSON().slice(0,10):'1900-02-29':'1900-01-00'
new Date(0,0,1)
же, какnew Date(1900,0,1)
. Так что удаление190
сохраняет 3 байта. И ...n=>(p=n>60?'':19)+new Date(p*400,0,n-!p||1).toJSON().slice(p/9,10-!n)+(n&&'')
Чистый ,
205189 байтПопробуйте онлайн!
источник
Japt, 43 байта
Закончился портом решения Арно .
Выход в
yyyy-m-d
формате.Попробуйте онлайн или протестируйте 0-100
источник
APL (Dyalog Classic) , 31 байт
Функция анонимного молчаливого префикса. Возвращает дату как
[Y,M,D]
Попробуйте онлайн!
×
знак кода даты⊢-
вычесть это из аргумента (код даты)60∘>+
увеличение, если код даты выше шестидесяти2⎕NQ#263,
используйте это в качестве непосредственного аргумента для «события 263» (IDN на дату).IDN аналогичен коду даты в Excel, но без 29 февраля 1900 года, а днем ранее 1 января 1900 года является 31 декабря 1899 года.
3↑
возьмите первые три элемента этого (четвертый день недели)(
...)+
Добавьте к ним следующее:60∘≠
0, если код даты равен 60; 1, если код даты не 60×-
вычесть это из знака кода даты¯3↑
возьмите последние три элемента (есть только один), дополняемые (двумя) нулямиразработано вместе с @ Adám в чате
источник
C # (.NET Core) ,
186185 байтПопробуйте онлайн!
-1 байт, заменяя оператор ИЛИ (||) на двоичный оператор ИЛИ (|).
источник
Perl 6 , 81 байт
Попробуйте онлайн!
источник
T-SQL,
141 9594 байтаРазрыв строки предназначен только для удобства чтения.
Ввод берется с помощью уже существующей таблицы я с целочисленным полем п , в соответствии с нашими стандартами IO .
SQL использует аналогичную (но исправленную) начальную точку 1-1-1900 для своего внутреннего формата даты, поэтому мне нужно только сместить ее на 1 или 2 дня в
DATEADD
функции.SQL не может вывести столбец, содержащий сочетание значений даты и символа, поэтому я не могу пропустить
FORMAT
команду (так как тогда он попытается преобразовать1/0/1900
в дату, что, конечно, недопустимо).Что хорошо в SQL, так это то, что я могу загрузить все входные значения в таблицу и запустить их все сразу. В моем (США) районе по умолчанию используется
m/d/yyyy
формат даты:РЕДАКТИРОВАТЬ : Сохранено 46 байтов путем замены на вложенный
IIF()
вместо гораздо более многословныйCASE WHEN
.РЕДАКТИРОВАТЬ 2 : Сохраненный еще один байт, перемещая
-
передIIF
.источник