Na década de 1990, os engenheiros de computação da COBOL desenvolveram uma maneira de estender os campos de data de seis dígitos, convertendo-os para YYYDDD
onde YYY
é year - 1900
e DDD
é o dia do ano [001 to 366]
. Esse esquema pode estender a data máxima para 2899-12-31
.
No ano de 2898, os engenheiros começaram a entrar em pânico porque suas bases de código de 900 anos estavam falhando. Sendo do ano de 2898, eles apenas usaram sua máquina do tempo para enviar um Codeinator solitário para o ano de 1998 com esse algoritmo e a tarefa de implementá-lo o mais amplamente possível:
Use um esquema em
PPQQRR
que se01 ≤ QQ ≤ 12
é umaYYMMDD
data padrão nos anos 1900, mas seQQ > 12
representa os dias seguintes2000-01-01
na base 100PP
e naRR
base 87 paraQQ - 13
.
Esse esquema se estende muito além do ano 2899 e também é compatível com as datas padrão, portanto, não são necessárias modificações nos arquivos existentes.
Alguns exemplos:
PPQQRR YYYY-MM-DD
000101 1900-01-01 -- minimum conventional date suggested by J. Allen
010101 1901-01-01 -- edge case suggested by J. Allen
681231 1968-12-31 -- as above
991231 1999-12-31 -- maximum conventional date
001300 2000-01-01 -- zero days after 2000-01-01
008059 2018-07-04 -- current date
378118 2899-12-31 -- maximum date using YYYDDD scheme
999999 4381-12-23 -- maximum date using PPQQRR scheme
Seu desafio é escrever um programa ou função para aceitar entrada PPQQRR
e saída como uma data ISO YYYY-MM-DD
. O método de entrada pode ser parâmetro, console ou linha de comando, o que for mais fácil.
Para sua diversão, aqui está uma solução não-competitiva no COBOL-85:
IDENTIFICATION DIVISION.
PROGRAM-ID. DATE-CONVERSION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 T PIC 9(8).
01 U PIC 9(8).
01 D VALUE '999999'.
05 P PIC 9(2).
05 Q PIC 9(2).
05 R PIC 9(2).
01 F.
05 Y PIC 9(4).
05 M PIC 9(2).
05 D PIC 9(2).
PROCEDURE DIVISION.
IF Q OF D > 12 THEN
MOVE FUNCTION INTEGER-OF-DATE(20000101) TO T
COMPUTE U = R OF D + 100 * ((Q OF D - 13) + 87 * P OF D) + T
MOVE FUNCTION DATE-OF-INTEGER(U) TO F
DISPLAY "Date: " Y OF F "-" M OF F "-" D OF F
ELSE
DISPLAY "Date: 19" P OF D "-" Q OF D "-" R OF D
END-IF.
STOP RUN.
yymmdd
não funciona há anos>=2000
, esse é o ponto principal do desastre do Y2K.yyyy-mm-dd
formato ISO .001300
.Respostas:
T-SQL,
9998 bytesA quebra de linha é apenas para legibilidade. Graças a Deus por elenco implícito.
A entrada é feita através de uma tabela preexistente t com a
CHAR
coluna i , de acordo com nossas regras de IO .Passa pelas seguintes etapas:
ISDATE()
. (O comportamento desta função muda com base nas configurações de idioma, funciona como esperado no meuenglish-us
servidor). Observe que isso é apenas uma verificação de validade; se tentássemos analisá-lo diretamente, ele seria250101
mapeado como 2025-01-01, não 1925-01-01.19
na frente (em vez de alterar a configuração de corte de ano no nível do servidor). A conversão da data final chegará ao final.8700*PP + QQRR - 1300
que evita aSUBSTRING()
função SQL (muito longa) . Essa matemática verifica as amostras fornecidas, tenho certeza de que está certa.DATEADD
para adicionar o número de dias2000-01-01
que pode ser curto2000
.CONVERT()
que para uma puroDATE
.Eu pensei em um ponto que eu achei uma data problemática:
000229
. Esta é a única data que analisa diferentemente 19xx vs 20xx (desde 2000 foi um ano bissexto, mas 1900 não foi, devido a estranhas exceções de ano bissexto ). Por isso, porém,000229
nem sequer é uma entrada válida (já que, como mencionado, 1900 não foi um ano bissexto), não precisa ser contabilizada.fonte
ISDATE
que não retorne um booleano, ou que números inteiros não possam ser implicitamente convertidos em booleanos,IIF
caso contrário, você poderá salvar dois bytes.LEFT()
eRIGHT()
função resulta em inteiros antes de multiplicar-los, que teria realmente foi cancelada a minha contagem de bytes-1300,'2000'
por-935,'1999'
.R , 126 bytes
Experimente online!
fonte
000101
ou681231
)JavaScript (SpiderMonkey) , 103 bytes
Experimente online!
.toJSON
falhará em um fuso horário UTC + X. Este código funciona, mas por mais tempo (+ 11 bytes):fonte
.toJSON()
.Python 2 , 159 bytes
Experimente online!
fonte
... and ... or ...
vez de... if ... else ...
.ABAP,
173171 bytesEconomizou 2 bytes otimizando ainda mais a saída
Segundo as lendas, um cliente da SAP no início do século 21 disse uma vez:
Ele estava certo. Hoje, em 2980, não há mais C ++, nem mais COBOL. Após a guerra, todos tiveram que reescrever seu código no SAP ABAP. Para fornecer compatibilidade retroativa com as sobras dos programas COBOL do 2800, nossos cientistas a reconstruíram como uma sub-rotina na ABAP.
Pode ser chamado por um programa como este:
Explicação do meu código:
O tipo Data do ABAP tem a propriedade ímpar a ser formatada como DDMMYYYY ao usar
WRITE
- pode ser dependente da localidade mesmo - apesar do formato interno ser AAAAMMDD. Mas quando usamos um seletor de substring,d(4)
ele seleciona os 4 primeiros caracteres do formato interno , fornecendo-lhe AAAA.Atualização : A formatação de saída na explicação agora está desatualizada, eu a otimizei em 2 bytes na versão golfed:
fonte
MUMPS
e vamos sobreviver a qualquer coisa!Kotlin , 222 bytes
O campo do calendário codificado codifica nomes constantes para salvar 49 bytes.
Experimente online!
fonte