Яка дата в час Usenet?


9

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

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

Ви можете прийняти РРРР-ММ-ДД, РРР / ММ / ДД, ММ / ДД / РРРР, ДД / ММ / РРРР, Д-місяцяаббр-РРРР, або будь-який інший популярний формат, який використовує весь рік (на відміну від рік по модулю 100). Вам потрібно прийняти лише один такий формат, на ваш вибір. Формат виводу повинен відповідати вхідному формату.

Зразок введення → вихід:

  • Неділя, 6 серпня 2017 → неділя, 8741 вересня 1993
  • Вівторок, 28 січня 1986 → вівторок, 28 січня 1986

Або:

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

В інтересах більш цікавих відповідей використання вбудованої функції, призначеної для цієї мети (наприклад, команда UN * X sdate), заборонено. Крім цього і стандартних винятків , це гольф, тому найкоротша відповідь виграє.


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 байт завдяки нежаганським
-3 байтам завдяки містеру Xcoder
-2 байту завдяки службовій мові
-12 байт завдяки Джонатану Аллану



1
Або ще краще, -59 байт.
notjagan


1
-8644+1може бути -8643..
officialaimm

1
@ Mr.Xcoder Потрібно в z>9іншому випадку ви втрачаєте провідний нуль за день.
Ніл

2

Математика, 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


Чи можете ви змінити позначку часу {1993,9,1}назад на день, щоб видалити +1, економивши 2 байти?
користувач202729

Дякую. Я повинен спробувати бути більш ввічливим наступного разу. І я навіть не знаю, що {1993,9,0}це дозволено.
користувач202729

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

Спробуйте в Інтернеті!

Дату приймає як "РРРР-ММ-ДД"

Я думаю, що я зробив підрахунок правильно в параметрах командного рядка. Я впевнений, що хтось мене виправить, якщо я цього не зробив.


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 / РРРР (цифри нижче 10, записані лише 1 цифрою). Написаний з мого мобільного телефону за допомогою API напам'ять.


1

Гая , 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.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.