Qual é a data, na hora da Usenet?

9

Setembro de 1993 é conhecido na Usenet como o setembro que nunca terminou. Assim, por exemplo, o dia em que esta pergunta está sendo publicada é sábado, setembro de 8740, 1993.

Seu programa ou função deve ter como entrada qualquer data gregoriana (com ano positivo) e retornar a mesma data que a saída, se for anterior a setembro de 1993 ou a data do calendário de setembro de 1993, posteriormente.

Você pode aceitar AAAA-MM-DD, AAAA / MM / DD, MM / DD / AAAA, DD / MM / AAAA, D-Monthnameabbr-AAAA ou qualquer outro formato popular que utilize a totalidade do ano (em oposição ao ano módulo 100). Você só precisa aceitar um desses formatos, de sua escolha. O formato de saída deve corresponder ao formato de entrada.

Entrada de amostra → saída:

  • Domingo, 6 de agosto de 2017 → domingo, 8741 setembro de 1993
  • Terça-feira, 28 de janeiro de 1986 → terça-feira, 28 de janeiro de 1986

Ou:

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

No interesse de respostas mais interessantes, o uso de uma função interna projetada para essa finalidade (como o sdatecomando UN * X ) não é permitido. Além disso e das exceções padrão , isso é golfe, então a resposta mais curta vence.

msh210
fonte
11
você quer dizer que não posso usar o DateDifference para que as pessoas aqui possam comentar sobre os recursos do Mathematica ???
J42161217
@Jenny_mathy, esta DateDifference ? Eu acho que você pode usá-lo, sim, por que não?
Msh210

Respostas:

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>

Baseado no algoritmo do @ Mr.Xcoder.

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

Experimente online!

-59 bytes graças a notjagan
-3 bytes graças a Mr. Xcoder
-2 bytes graças a officialaimm
-12 bytes graças a Jonathan Allan

HyperNeutrino
fonte
-54 bytes.
precisa saber é
11
Ou melhor ainda, -59 bytes.
precisa saber é
11
123 bytes (-62)
Sr. Xcoder 6/17
11
-8644+1pode ser -8643..
officialaimm
11
@ Mr.Xcoder Precisa ser de z>9outra forma, você perde o zero à esquerda no dia.
911 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 thanx ao usuário202729

J42161217
fonte
Você consideraria mudar a marca do tempo de {1993,9,1}volta por um dia, para remover a +1, economizando 2 bytes?
user202729
Obrigado. Eu deveria tentar ser mais educado da próxima vez. E eu nem sei que {1993,9,0}é 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

Experimente online!

Toma a data como "AAAA-MM-DD"

Acho que fiz a contagem diretamente nas opções da linha de comando. Tenho certeza que alguém vai me corrigir se eu não o fiz.

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

Experimente online!

Toma datas como M / D / AAAA (números abaixo de 10 escritos com apenas 1 dígito). Escrito no meu celular usando a API de cor.

Charlie
fonte
1

Gaia , 78 bytes

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

Experimente online!

Explicação

Primeiro, temos uma função auxiliar que determina se um ano é bissexto.

ℍ       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

A principal função faz o resto do trabalho:

:              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 negócios
fonte