Quelle est la date, en temps Usenet?


9

Septembre 1993 est connu sur Usenet comme le mois de septembre qui n'a jamais pris fin. Ainsi, par exemple, le jour où cette question est affichée est le samedi 87 septembre 1993.

Votre programme ou fonction doit prendre n'importe quelle date grégorienne (avec année positive) en entrée et renvoyer la même date que la sortie si elle est antérieure à septembre 1993 ou la date du calendrier de septembre 1993 si par la suite.

Vous pouvez accepter AAAA-MM-JJ, AAAA / MM / JJ, MM / JJ / AAAA, JJ / MM / AAAA, D-Monthnameabbr-AAAA, ou tout autre format populaire qui utilise l'intégralité de l'année (par opposition à la année modulo 100). Vous n'avez qu'à accepter un tel format, de votre choix. Le format de sortie doit correspondre au format d'entrée.

Exemple d'entrée → sortie:

  • Dimanche 6 août 2017 → dimanche 8741 septembre 1993
  • Mardi 28 janvier 1986 → Mardi 28 janvier 1986

Ou:

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

Dans l'intérêt de réponses plus intéressantes, l'utilisation d'une fonction intégrée conçue à cet effet (comme la sdatecommande UN * X ) est interdite. Mis à part cela et les exceptions standard , c'est le golf, donc la réponse la plus courte l'emporte.


1
vous voulez dire que je ne peux pas utiliser DateDifference pour que les gens ici puissent commenter les buildins de Mathematica ???
J42161217

@Jenny_mathy, cette DateDifference ? Je suppose que vous pouvez l'utiliser, oui, pourquoi pas?
msh210

Réponses:


2

JavaScript (ES6), 48 octets

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>

Basé sur l'algorithme de @ Mr.Xcoder.


3

Python 3 , 109 octets

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

Essayez-le en ligne!

-59 octets grâce à notjagan
-3 octets grâce à M. Xcoder
-2 octets grâce à officialaimm
-12 octets merci à Jonathan Allan



1
Ou mieux encore, -59 octets.
notjagan


1
-8644+1peut être -8643..
officialaimm

1
@ Mr.Xcoder Doit être z>9sinon vous perdez le zéro de tête le jour.
Neil

2

Mathematica, 55 octets

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

E / S

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

-6 octets merci à user202729


Envisageriez-vous de {1993,9,1}reculer la marque horaire d'un jour, afin de supprimer le +1, en économisant 2 octets?
user202729

Merci. Je devrais essayer d'être plus poli la prochaine fois. Et je ne sais même pas si {1993,9,0}c'est permis.
user202729

1

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

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

Essayez-le en ligne!

Prend la date comme "AAAA-MM-JJ"

Je pense que j'ai fait le compte à droite sur les options de ligne de commande. Je suis sûr que quelqu'un me corrigera si je ne le fais pas.


1

C # (.NET Core) , 107 octets

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

Essayez-le en ligne!

Prend les dates comme M / D / YYYY (les nombres inférieurs à 10 écrits avec seulement 1 chiffre). Écrit à partir de mon téléphone portable en utilisant l'API par cœur.


1

Gaia , 78 octets

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

Essayez-le en ligne!

Explication

Premièrement, nous avons une fonction d'aide qui détermine si une année est une année bissextile.

ℍ       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

La fonction principale fait le reste du travail:

:              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.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.