Jaka jest data w czasie Usenet?

9

Wrzesień 1993 jest znany w Usenecie jako wrzesień, który nigdy się nie skończył. I tak na przykład dzień, w którym zamieszczono to pytanie, to sobota, 8740 września 1993 r.

Twój program lub funkcja powinna przyjmować dowolną datę gregoriańską (z rokiem dodatnim) i zwracać tę samą datę jak wynik, jeśli jest ona wcześniejsza niż wrzesień 1993 r. Lub datę w kalendarzu września 1993 r., Jeśli później.

Możesz zaakceptować RRRR-MM-DD, RRRR / MM / DD, MM / DD / RRRR, DD / MM / RRRR, D-Monthnameabbr-RRRR lub inny popularny format, który wykorzystuje cały rok (w przeciwieństwie do rok modulo 100). Musisz zaakceptować tylko jeden taki wybrany przez siebie format. Format wyjściowy musi być zgodny z formatem wejściowym.

Przykładowe wejście → wyjście:

  • Niedziela, 6 sierpnia 2017 r. → Niedziela, 8741 września 1993 r
  • Wtorek, 28 stycznia 1986 r. → Wtorek, 28 stycznia 1986 r

Lub:

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

W interesie bardziej interesujących odpowiedzi użycie wbudowanej funkcji zaprojektowanej w tym celu (takiej jak polecenie UN * X sdate) jest niedozwolone. Oprócz tego i standardowych wyjątków jest to golf, więc wygrywa najkrótsza odpowiedź.

msh210
źródło
1
masz na myśli, że nie mogę używać DateDifference, aby ludzie mogli komentować wbudowane Mathematiki ???
J42161217,
@Jenny_mathy, ta różnica zdań ? Myślę, że możesz go użyć, tak, czemu nie?
msh210,

Odpowiedzi:

2

JavaScript (ES6), 48 bajtów

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>

Na podstawie algorytmu @ Mr.Xcoder.

Neil
źródło
3

Python 3 , 109 bajtów

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

Wypróbuj online!

-59 bajtów dzięki notjagan
-3 bajtów dzięki Mr. Xcoder
-2 bajtów dzięki Officialaimm
-12 bajtów dzięki Jonathan Allan

HyperNeutrino
źródło
-54 bajtów.
notjagan
1
Lub jeszcze lepiej, -59 bajtów.
notjagan
1
123 bajty (-62)
Mr. Xcoder,
1
-8644+1może być -8643..
officialaimm
1
@ Mr.Xcoder Musi być z>9inaczej stracisz wiodące zero w dniu.
Neil,
2

Mathematica, 55 bajtów

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 bajtów dzięki za user202729

J42161217
źródło
Czy zastanowiłbyś się nad przesunięciem znacznika czasu {1993,9,1}o jeden dzień wstecz, aby usunąć +1oszczędzając 2 bajty?
user202729,
Dzięki. Następnym razem powinienem być bardziej uprzejmy. I nawet nie wiem, czy {1993,9,0}jest dozwolone.
user202729,
1

Perl 5 , 102 + 16 (-MTime :: Local -F-) = 118 bajtów

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

Wypróbuj online!

Przyjmuje datę jako „RRRR-MM-DD”

Myślę, że naliczyłem dokładnie opcje wiersza poleceń. Jestem pewien, że ktoś mnie poprawi, jeśli tego nie zrobię.

Xcali
źródło
1

C # (.NET Core) , 107 bajtów

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

Wypróbuj online!

Przyjmuje daty jako M / D / RRRR (liczby poniżej 10 zapisane tylko 1 cyfrą). Napisane z mojego telefonu komórkowego za pomocą interfejsu API na pamięć.

Charlie
źródło
1

Gaia , 78 bajtów

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

Wypróbuj online!

Wyjaśnienie

Po pierwsze, mamy funkcję pomocnika, która określa, czy rok jest rokiem przestępnym.

ℍ       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

Główna funkcja wykonuje resztę pracy:

:              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.
Business Cat
źródło