Dado um código de data inteiro não negativo no estilo Excel, retorne a "data" correspondente em qualquer forma razoável que mostre claramente ano, mês e "dia".
Trivial, você pode pensar. Você notou as "citações de susto"? Eu usei isso porque o Excel tem algumas peculiaridades. Excel conta os dias com o número 1 para janeiro 1 st de 1900, mas como se 1900 teve um janeiro 0 º e um fevereiro 29 th , que deve ter muito cuidado para tentar todos os casos de teste:
Input → Output (example format)
0 → 1900-01-00 Note: NOT 1899-12-31
1 → 1900-01-01
2 → 1900-01-02
59 → 1900-02-28
60 → 1900-02-29 Note: NOT 1900-03-01
61 → 1900-03-01
100 → 1900-04-09
1000 → 1902-09-26
10000 → 1927-05-18
100000 → 2173-10-14
code-golf
date
conversion
Adão
fonte
fonte
DayOfWeek
método, porque a época original, 1899-12-30 (ou o fictício 1900-01-00) foi escolhido de forma que o dia da semana fosse simplesmente o número 7 do dia, mas isso não funcionaria com 1899-12-30.Respostas:
Excel, 3 (+7?)
com formato
Porto puro
fonte
k (kdb + 3.5),
55545150 bytespara testar, cole esta linha no console q:
a saída deve ser
{
}
é uma função com argumentox
0 60?x
índice dex
entre0 60
ou 2 se não for encontradoˋ1900.01.00ˋ1900.02.29
uma lista de dois símbolos,
anexar a ele"d"$
convertido para uma datax-36526
número de dias desde 1900 (em vez do padrão 2000)- x<60
ajustar para o erro de salto do excel(ˋ1900.01.00ˋ1900.02.29,"d"$x-36526-x<60)
@0 60?x
justaposição significa indexação - o "@" no meio está implícito$
converter em stringfonte
{$[x;$`d$x-65746;"1900.01.00"]}
parece funcionar . Presumo que algo transborda em algum lugar100000
.Python 2 , 111 bytes
Experimente online!
-5 graças a ngn .
fonte
JavaScript (ES6),
89 8277 bytesGuardado
712 bytes graças a @tshExperimente online!
fonte
n=>n?n-60?new Date(1900,0,n-(n>60)).toJSON().slice(0,10):'1900-02-29':'1900-01-00'
new Date(0,0,1)
é o mesmonew Date(1900,0,1)
. Então remova190
salva 3 bytes. E ...n=>(p=n>60?'':19)+new Date(p*400,0,n-!p||1).toJSON().slice(p/9,10-!n)+(n&&'')
Limpo ,
205189 bytesExperimente online!
fonte
Japonês, 43 bytes
Terminou com uma porta parcial da solução da Arnauld .
A saída está no
yyyy-m-d
formato.Experimente online ou teste de 0 a 100
fonte
APL (Dyalog Classic) , 31 bytes
Função de prefixo tácito anônimo. Retorna a data como
[Y,M,D]
Experimente online!
×
sinal do código da data⊢-
subtraia isso do argumento (o código da data)60∘>+
incremento se o código da data estiver acima de sessenta2⎕NQ#263,
use isso como argumento imediato para o "Evento 263" (IDN até o momento)IDN é exatamente como o código de data do Excel, mas sem 29 de fevereiro de 1900, e o dia anterior a 1º de janeiro de 1900 é 31 de dezembro de 1899
3↑
pegue os três primeiros elementos disso (o quarto é dia da semana)(
…)+
Adicione o seguinte a esses:60∘≠
0 se o código da data for 60; 1 se o código da data não for 60×-
subtraia isso do sinal do código da data¯3↑
pegue os três últimos elementos (existe apenas um) preenchimento com (dois) zerosdesenvolvido em conjunto com @ Adám no chat
fonte
C # (.NET Core) ,
186185 bytesExperimente online!
-1 byte, substituindo o operador OR (||) pelo operador OR binário (|).
fonte
Perl 6 , 81 bytes
Experimente online!
fonte
T-SQL,
141 9594 bytesA quebra de linha é apenas para legibilidade.
A entrada é obtida via tabela preexistente i com campo inteiro n , de acordo com nossos padrões de IO .
O SQL usa um ponto de partida 1-1-1900 semelhante (mas corrigido) para seu formato de data interno; portanto, só preciso compensá-lo por 1 ou 2 dias no
DATEADD
função.O SQL não pode gerar uma coluna que contenha uma combinação de valores de data e caractere, portanto, não posso deixar de lado o
FORMAT
comando (pois ele tentaria converter1/0/1900
para uma data, o que obviamente é inválido).O interessante do SQL é que eu posso carregar todos os valores de entrada na tabela e executá-los todos de uma vez. Minha localidade (EUA) é padronizada para um
m/d/yyyy
formato de data:EDIT : Salvo 46 bytes, alterando para um aninhado em
IIF()
vez de muito mais detalhadoCASE WHEN
.EDIÇÃO 2 : salvou outro byte movendo o
-
na frente doIIF
.fonte