No meu site, os usuários inserem sua data de nascimento no estilo xx.xx.xx
- três números de dois dígitos separados por pontos. Infelizmente, esqueci de dizer aos usuários exatamente qual formato usar. Tudo o que sei é que uma seção é usada para o mês, uma para a data e outra para o ano. O ano é definitivamente no século 20 (1900-1999), então o formato 31.05.75
significa 31 May 1975
. Além disso, suponho que todos usem o calendário gregoriano ou juliano.
Agora, quero examinar meu banco de dados para esclarecer a bagunça. Gostaria de começar lidando com os usuários com as datas mais ambíguas, ou seja, aquelas em que o intervalo de datas possíveis é maior.
Por exemplo, a data 08.27.53
significa 27 August 1953
no calendário gregoriano ou juliano. A data no calendário juliano é 13 dias depois, portanto o intervalo é justo 13 days
.
Por outro lado, a notação 01.05.12
pode se referir a muitas datas possíveis. O mais antigo é 12 May 1901 (Gregorian)
e o mais recente é 1 May 1912 (Julian)
. O intervalo é 4020 days
.
Regras
- Entrada é uma sequência no formato
xx.xx.xx
, em que cada campo tem dois dígitos e preenchimento com zero. - Saída é o número de dias no intervalo.
- Você pode assumir que a entrada sempre será uma data válida.
- Você não pode usar nenhuma função interna de data ou calendário.
- O código mais curto (em bytes) vence.
Casos de teste
01.00.31
=>12
29.00.02
=>0
(A única possibilidade é29 February 1900 (Julian)
)04.30.00
=>13
06.12.15
=>3291
5, May 1975
suposto ser31st
? Além disso, temos que dar conta de anos bissextos?Respostas:
Pitão, 118 bytes
Experimente on-line: Demonstration ou Test Suite .
Conhecimento necessário dos calendários juliano e gregoriano
O calendário juliano e gregoriano é bem parecido. Cada calendário divide um ano em 12 meses, cada um contendo de 28 a 31 dias. Os dias exatos em um mês são
[31, 28/29 (depends on leap year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
. A única diferença entre os calendários é a definição de ano bissexto. No calendário juliano, qualquer ano divisível por 4 é um ano bissexto. O calendário gregoriano é um pouco mais específico. Qualquer ano divisível por 4 é um ano bissexto, exceto o ano divisível por 100 e não divisível por 400.Assim, no século 20, apenas um ano é diferente. O ano de 1900, que é um ano bissexto no calendário juliano, mas não um ano bissexto no calendário gregoriano. Portanto, a única data que existe em um calendário, mas não no outro calendário, é o dia
29.02.1900
.Devido à definição diferente do ano bissexto, há uma diferença entre uma data no calendário juliano e no calendário gregoriano. Diferença de 12 dias para uma data anterior a
29.02.1900
e diferença de 13 dias para datas posteriores a29.02.1900
.Pseudo-código simplificado
Explicação detalhada do código
A primeira parte
M++28@j15973358 4G&qG2!%H4
define uma funçãog(G,H)
, que calcula o número de dias no mêsG
de um anoH
no calendário juliano.E a próxima parte é apenas o loop for e os ifs. Observe que eu interpreto
N
no formato(month, year, day)
. Só porque salva alguns bytes.fonte
Perl 5 , 294 bytes
Experimente online!
298 bytes quando espaços, novas linhas e comentários são removidos.
As linhas 1-4 inicializam (se não concluídas) os hashes
%g
e%j
onde os valores são os números dos dias gregoriano e juliano, contando de maneira correspondente desde o 1º de junho de 1900 até 31 de dezembro de 1999.A linha 5 coloca a data de entrada em $ 1, $ 2 e $ 3.
A linha 9 lista todas as seis permutações desses três números de entrada.
A linha 8 converte esses seis em dois números cada, os números dos dias gregoriano e juliano, mas apenas aqueles com datas válidas.
A linha 7 garante isso, filtra os números de dias inexistentes.
A linha 6 classifica a lista de números de datas válidos, do menor para o maior.
A linha 10 retorna a diferença entre o último e o primeiro (máximo e mínimo), que era o intervalo desejado.
fonte