Was ist das Datum in der Usenet-Zeit?


9

Der September 1993 ist im Usenet als der September bekannt, der niemals endete. So ist beispielsweise der Tag, an dem diese Frage gestellt wird, Samstag, September 8740, 1993.

Ihr Programm oder Ihre Funktion sollte jedes gregorianische Datum (mit positivem Jahr) als Eingabe verwenden und dasselbe Datum wie die Ausgabe zurückgeben, wenn es vor September 1993 liegt, oder das Datum im September 1993-Kalender, wenn es danach liegt.

Sie können JJJJ-MM-TT, JJJJ / MM / TT, MM / TT / JJJJ, TT / MM / JJJJ, D-Monthnameabbr-JJJJ oder jedes andere beliebte Format akzeptieren, das das gesamte Jahr verwendet (im Gegensatz zum Jahr Modulo 100). Sie müssen nur ein solches Format Ihrer Wahl akzeptieren. Das Ausgabeformat muss mit dem Eingabeformat übereinstimmen.

Beispiel Eingabe → Ausgabe:

  • Sonntag, 6. August 2017 → Sonntag, 8741 September 1993
  • Dienstag, 28. Januar 1986 → Dienstag, 28. Januar 1986

Oder:

  • 2017-08-06 → 1993-09-8741
  • 28.01.1986 → 28.01.1986

Im Interesse interessanterer Antworten ist die Verwendung einer für diesen Zweck entwickelten integrierten Funktion (z. B. des UN * X- sdateBefehls) nicht zulässig. Abgesehen davon und den Standardausnahmen ist dies Golf, sodass die kürzeste Antwort gewinnt.


1
Du meinst, ich kann DateDifference nicht verwenden, damit die Leute hier die integrierten Funktionen von Mathematica kommentieren können?
J42161217

@ Jenny_mathy, diese Datumsdifferenz ? Ich denke du kannst es benutzen, ja, warum nicht?
msh210

Antworten:


2

JavaScript (ES6), 48 Byte

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>

Basierend auf dem Algorithmus von @ Mr.Xcoder.


3

Python 3 , 109 Bytes

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

Probieren Sie es online aus!

-59 Bytes dank Notjagan
-3 Bytes dank Mr. Xcoder
-2 Bytes dank Officialaimm
-12 Bytes dank Jonathan Allan



1
Oder noch besser, -59 Bytes.
Notjagan


1
-8644+1kann sein -8643..
offiziell

1
@ Mr.Xcoder Muss sein, z>9sonst verlierst du die führende Null am Tag.
Neil

2

Mathematica, 55 Bytes

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 Bytes Danke an user202729


Würden Sie in Betracht ziehen, die Zeitmarke {1993,9,1}um einen Tag zu verschieben, um die zu entfernen +1und 2 Bytes zu sparen?
user202729

Vielen Dank. Ich sollte versuchen, das nächste Mal höflicher zu sein. Und ich weiß nicht einmal, dass {1993,9,0}das erlaubt ist.
user202729

1

Perl 5 , 102 + 16 (-MTime :: Local -F-) = 118 Bytes

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

Probieren Sie es online aus!

Nimmt das Datum als "JJJJ-MM-TT"

Ich glaube, ich habe direkt in den Befehlszeilenoptionen gezählt. Ich bin sicher, jemand wird mich korrigieren, wenn ich es nicht getan habe.


1

C # (.NET Core) , 107 Byte

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

Probieren Sie es online aus!

Nimmt Daten als M / T / JJJJ (Zahlen unter 10 mit nur 1 Ziffer geschrieben). Geschrieben von meinem Handy mit der API auswendig.


1

Gaia , 78 Bytes

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

Probieren Sie es online aus!

Erläuterung

Erstens haben wir eine Hilfsfunktion, die bestimmt, ob ein Jahr ein Schaltjahr ist.

ℍ       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

Die Hauptfunktion erledigt den Rest der Arbeit:

:              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.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.