¿Cuál es la fecha, en tiempo de Usenet?

9

Septiembre de 1993 se conoce en Usenet como el septiembre que nunca terminó. Así, por ejemplo, el día en que se publica esta pregunta es el sábado 87 de septiembre de 1993.

Su programa o función debe tomar cualquier fecha gregoriana (con año positivo) como entrada y devolver la misma fecha como salida si es anterior a septiembre de 1993 o la fecha en el calendario de septiembre de 1993 si es posterior.

Puede aceptar AAAA-MM-DD, AAAA / MM / DD, MM / DD / AAAA, DD / MM / AAAA, D-Monthnameabbr-AAAA, o cualquier otro formato popular que use la totalidad del año (a diferencia del año módulo 100). Solo necesita aceptar uno de esos formatos, de su elección. El formato de salida debe coincidir con el formato de entrada.

Entrada de muestra → salida:

  • Domingo 6 de agosto de 2017 → Domingo 8741 de septiembre de 1993
  • Martes 28 de enero de 1986 → Martes 28 de enero de 1986

O:

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

En interés de respuestas más interesantes, sdateno se permite el uso de una función integrada diseñada para este propósito (como el comando UN * X ). Aparte de eso y las excepciones estándar , este es el golf, por lo que gana la respuesta más corta.

msh210
fuente
1
¿Quieres decir que no puedo usar DateDifference para que la gente aquí pueda comentar sobre los componentes de Mathematica?
J42161217
@ Jenny_mathy, esta DateDifference ? Supongo que puedes usarlo, sí, ¿por qué no?
msh210

Respuestas:

2

JavaScript (ES6), 48 bytes

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>

Basado en el algoritmo de @ Mr.Xcoder.

Neil
fuente
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])

Pruébalo en línea!

-59 bytes gracias a notjagan
-3 bytes gracias al Sr. Xcoder
-2 bytes gracias a officialaimm
-12 bytes gracias a Jonathan Allan

Hiperneutrino
fuente
-54 bytes.
notjagan
1
O mejor aún, -59 bytes.
notjagan
1
123 bytes (-62)
Sr. Xcoder
1
-8644+1puede ser -8643..
officialaimm
1
@ Mr.Xcoder necesita ser, de lo z>9contrario, perderá el cero inicial del día.
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 gracias al usuario202729

J42161217
fuente
¿Consideraría cambiar la marca de tiempo {1993,9,1}por un día, para eliminar el +1, ahorrando 2 bytes?
user202729
Gracias. Debería tratar de ser más educado la próxima vez. Y ni siquiera sé que {1993,9,0}está permitido.
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

Pruébalo en línea!

Toma la fecha como "AAAA-MM-DD"

Creo que hice el recuento justo en las opciones de línea de comando. Estoy seguro de que alguien me corregirá si no lo hice.

Xcali
fuente
1

C # (.NET Core) , 107 bytes

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

Pruébalo en línea!

Toma fechas como M / D / AAAA (números por debajo de 10 escritos con solo 1 dígito). Escrito desde mi teléfono móvil usando la API de memoria.

Charlie
fuente
1

Gaia , 78 bytes

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

Pruébalo en línea!

Explicación

Primero, tenemos una función auxiliar que determina si un año es bisiesto.

ℍ       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 función principal hace el resto del trabajo:

:              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.
Gato de negocios
fuente