Qual è la data, nell'ora di Usenet?


9

Il settembre 1993 è noto su Usenet come il settembre che non ha mai avuto fine. Pertanto, ad esempio, il giorno in cui questa domanda viene pubblicata è sabato 8740 settembre 1993.

Il tuo programma o funzione dovrebbe assumere qualsiasi data gregoriana (con anno positivo) come input e restituire la stessa data dell'output se è precedente al settembre 1993 o la data del calendario del settembre 1993 se in seguito.

Puoi accettare AAAA-MM-GG, AAAA / MM / GG, MM / GG / AAAA, GG / MM / AAAA, D-Monthnameabbr-AAAA o qualsiasi altro formato popolare che utilizza l'intero anno (al contrario del anno modulo 100). Devi solo accettare uno di questi formati, a tua scelta. Il formato di output deve corrispondere al formato di input.

Esempio di input → output:

  • Domenica 6 agosto 2017 → Domenica 8741 settembre 1993
  • Martedì 28 gennaio 1986 → Martedì 28 gennaio 1986

O:

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

Nell'interesse di risposte più interessanti, l'uso di una funzione integrata progettata per questo scopo (come il sdatecomando UN * X ) è vietato. A parte questo e le eccezioni standard , questo è il golf, quindi vince la risposta più breve.


1
vuoi dire che non posso usare DateDifference in modo che le persone qui possano commentare i builtin di Mathematica ???
J42161217

@Jenny_mathy, questo DateDifference ? Immagino che tu possa usarlo, sì, perché no?
msh210,

Risposte:


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>

Basato sull'algoritmo di @ Mr.Xcoder.


3

Python 3 , 109 byte

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

Provalo online!

-59 byte grazie a Notjagan
-3 byte grazie a Mr. Xcoder
-2 byte grazie a officialaimm
-12 byte grazie a Jonathan Allan



1
O meglio ancora, -59 byte.
Notjagan,


1
-8644+1può essere -8643..
officialaimm il

1
@ Mr.Xcoder Deve essere z>9altrimenti perdi lo zero iniziale nel giorno.
Neil,

2

Mathematica, 55 byte

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 byte grazie all'utente202729


Considereresti di spostare {1993,9,1}indietro di un giorno il tempo, in modo da rimuovere il +1, risparmiando 2 byte?
user202729

Grazie. La prossima volta dovrei cercare di essere più educato. E non so nemmeno che {1993,9,0}sia permesso.
user202729

1

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

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

Provalo online!

Prende la data come "AAAA-MM-GG"

Penso di aver fatto il conteggio proprio sulle opzioni della riga di comando. Sono sicuro che qualcuno mi correggerà se non lo facessi.


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";}

Provalo online!

Accetta le date come M / G / AAAA (numeri inferiori a 10 scritti con solo 1 cifra). Scritto dal mio telefono cellulare utilizzando l'API a memoria.


1

Gaia , 78 byte

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

Provalo online!

Spiegazione

Innanzitutto, abbiamo una funzione di supporto che determina se un anno è un anno bisestile.

ℍ       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 funzione principale svolge il resto del lavoro:

:              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.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.