Какая дата в Usenet времени?

9

Сентябрь 1993 года известен в Usenet как сентябрь, который никогда не заканчивался. Так, например, день, когда этот вопрос публикуется, - суббота, сентябрь 8740, 1993.

Ваша программа или функция должны принимать любую григорианскую дату (с положительным годом) в качестве входных данных и возвращать ту же дату, что и выходные данные, если она предшествует сентябрю 1993 года, или дату в календаре сентября 1993 года, если после этого.

Вы можете принять ГГГГ-ММ-ДД, ГГГГ / ММ / ДД, ММ / ДД / ГГГГ, ДД / ММ / ГГГГ, D-Месяц_абр-ГГГГ или любой другой популярный формат, использующий весь год (в отличие от год по модулю 100). Вам нужно только принять один такой формат, по вашему выбору. Выходной формат должен соответствовать входному формату.

Пример ввода → вывод:

  • Воскресенье, 6 августа 2017 года → воскресенье, 8741 сентября 1993 года
  • Вторник, 28 января 1986 года → Вторник, 28 января 1986 года

Или:

  • 2017-08-06 → 1993-09-8741
  • 1986-01-28 → 1986-01-28

В интересах более интересных ответов использование встроенной функции, предназначенной для этой цели (такой как команда UN * X sdate), запрещено. Помимо этого и стандартных исключений , это гольф, поэтому выигрывает самый короткий ответ.

msh210
источник
1
Вы имеете в виду, что я не могу использовать DateDifference, чтобы люди могли комментировать встроенные функции Mathematica ???
J42161217
@Jenny_mathy, это DateDifference ? Я думаю, вы можете использовать это, да, почему бы и нет?
msh210

Ответы:

2

JavaScript (ES6), 48 байт

f=
s=>(d=new Date(s)/864e5-8643|0)>9?'1993-09-'+d:s
<input size=10 oninput=o.textContent=/\d{4}(-\d\d){2}/.test(this.value)?f(this.value):``><pre id=o>

Основано на алгоритме @ Mr.Xcoder.

Нил
источник
3

Python 3 , 109 байт

from datetime import*
i=input()
z=date(*map(int,i.split())).toordinal()-727806
print([i,'1993 09 %d'%z][z>9])

Попробуйте онлайн!

-59 байтов благодаря notjagan
-3 байта благодаря Mr. Xcoder
-2 байта благодаря officialaimm
-12 байтов благодаря Джонатану Аллану

HyperNeutrino
источник
1
Или еще лучше, -59 байт.
Notjagan
1
123 байта (-62)
г-н Xcoder
1
-8644+1может быть -8643..
officialaimm
1
@ Mr.Xcoder Должно быть z>9иначе, вы теряете ведущий ноль в день.
Нил
2

Mathematica, 55 байт

If[(s=#&@@{1993,9}~DateDifference~#)>0,{1993,9,s+1},#]&

I / O

{2017, 8, 6} -> {1993, 9, 8741}
{1986, 1, 28} -> {1986, 1, 28}

-6 байт спасибо пользователю 202729

J42161217
источник
Не могли бы вы сместить отметку времени {1993,9,1}на один день назад, чтобы удалить +12 байта?
user202729
Спасибо. Я должен постараться быть более вежливым в следующий раз. И я даже не знаю {1993,9,0}, разрешено ли.
user202729
1

Perl 5 , 102 + 16 (-MTime :: Local -F-) = 118 байт

$,='-';say @F=($t=timelocal(0,0,0,$F[2],$F[1]-1,$F[0]-1900)-749433599)>0?(1993,'09',31+int$t/86400):@F

Попробуйте онлайн!

Принимает дату как «ГГГГ-ММ-ДД»

Я думаю, что я правильно посчитал параметры командной строки. Я уверен, что кто-то исправит меня, если я этого не сделаю.

Xcali
источник
1

C # (.NET Core) , 107 байт

s=>{var d=(System.DateTime.Parse(s)-new System.DateTime(1993,8,31)).TotalDays;return d<1?s:"9/"+d+"/1993";}

Попробуйте онлайн!

Принимает даты как M / D / YYYY (числа ниже 10 написаны только с 1 цифрой). Написано с моего мобильного телефона с использованием API наизусть.

Чарли
источник
1

Gaia , 78 байт

ℍZ¤∨4Ė
:'//d¦[1993₉31];>\{\‡:(…1993>↑¦365+¦¤ṇ↑∂K∂k,=;((<¤)-243]_ḥΣ“1993/09/”¤+}?

Попробуйте онлайн!

объяснение

Во-первых, у нас есть вспомогательная функция, которая определяет, является ли год високосным.

ℍ       100
 Z      Divmod year by 100, pushing the first 2 digits, then the second 2 digits
  ¤     Swap
   ∨    Logical OR, gives the left-most non-zero number
    4Ė  Check for divisibility by 4

Основная функция выполняет остальную часть работы:

:              Push two copies of the input.
'//            Split the top on on slashes.
d¦             Parse each section as a number.
[1993₉31]      Push the list [1993 9 31].
;>             Copy the date and check if its less than that.
\              If it is, delete the list and leave the input string on top.
{              Else:
 :(             Copy the date and get the year.
 …1993>         Get the range from 1993 to year-1.
 ↑¦365+¦        Map each to 365+(whether it's a leap year).
 ¤              Swap, bring the date back to the top.
 ṇ↑             Pull out the year and check if it's a leap year.
 ∂K∂k,          Push the pair of lists [[days in months in a leap year] [days in months]]
 =              Index the result of checking if the year is a leap year into the pair.
 ;((<           Get the first (month number - 1) elements.
 ¤              Swap, bring date back to the top.
 )              Get the day.
 -243           Push -243 (243 is the number of days between Jan 1 1993 and Sept 1 1993).
 ]              Wrap everything in a list.
 _              Flatten the list.
 ḥ              Remove the first element (the input string).
 Σ              Sum it.
 “1993/09/”¤+   Append the resulting number to "1993/09/".
}?             (end if)
               Implicitly display whatever is on top of the stack.
Бизнес Кот
источник