@anonymous/

KnownSarcasticNeonrainbowfish

Python

No description

fork
loading
Files
  • main.py
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
def dia_no_ano(dia, mes, ano):
  numero_de_dias = dia
  contador_meses = 1
  while contador_meses < mes:
    if contador_meses in (1, 3, 5, 7, 8, 10, 12):
      numero_de_dias += 31
    elif contador_meses in (4, 6, 9, 11):
      numero_de_dias += 30
    elif contador_meses == 2:
      numero_de_dias += 28
    contador_meses += 1
  return numero_de_dias

def bissexto(ano):
  return ano % 4 == 0 and (ano % 100 != 0 or ano % 400 == 0)

def validar_data(dia, mes, ano):
  if dia < 1 or dia > 31 or mes < 1 or mes > 12 or ano < 1583:
    return False
  if mes in (4, 6, 9, 11) and dia == 31:
    return False
  if mes == 2 and dia >= 30:
    return False
  if mes == 2 and dia == 29 and not bissexto(ano):
    return False
  return True

def diferenca_data(data1, data2):

  # Separa os dados adequadamente e trata entradas mal-formadas.
  try:
    dia1, mes1, ano1 = [int(datando) for datando in data1.split("/")]
  except ValueError:
    raise ValueError('Data inválida: ' + data1)

  try:
    dia2, mes2, ano2 = [int(datador) for datador in data2.split("/")]
  except ValueError:
    raise ValueError('Data inválida: ' + data2)

  # Verifica se as datas entradas são válidas:
  if not validar_data(dia1, mes1, ano1):
    raise ValueError('Data inválida: ' + data1)
  if not validar_data(dia2, mes2, ano2):
    raise ValueError('Data inválida: ' + data2)

  # Inverte as datas se a data2 anteceder a data1.
  if ano2 < ano1 or (ano2 == ano1 and (mes2 < mes1 or (mes2 == mes1 and dia2 < dia1))):
    return -diferenca_data(data2, data1)

  # Calcula o número de dias nos anos incompletos.
  dias_ano1 = dia_no_ano(dia1, mes1, ano1)
  dias_ano2 = dia_no_ano(dia2, mes2, ano2)

  # Calcula o número de dias totais, considerando os anos incompletos e anos completos de 365 dias.
  dias_total = dias_ano2 - dias_ano1 + (ano2 - ano1) * 365

  # Considera anos começando em 01/03 para poder fazer a correção dos anos bissextos.
  ano1b = ano1
  if mes1 < 3:
    ano1b -= 1

  ano2b = ano2
  if mes2 < 3:
    ano2b -= 1

  # Soma os dias dos anos bissextos. São os divisíveis por 4 teve entre ano1b e ano2b.
  dias_total += int(ano2b / 4) - int(ano1b / 4)

  # Subtrai os dias dos anos bissextos que não existiram na etapa anterior. São os divisíveis por 100.
  dias_total -= int(ano2b / 100) - int(ano1b / 100)

  # Soma de volta os dias dos anos bissextos que foram removidos a mais na etapa anterior. São os divisíveis por 400.
  dias_total += int(ano2b / 400) - int(ano1b / 400)

  # Resultado da função.
  return dias_total

####### Início do programa. #######

# Lê a entrada do usuário.
#x = input()
#y = input()

# Calcula a diferença.
#diferenca = diferenca_data(x, y)

# Mostra o resultado.
#print(diferenca)

# Testes
print('Testes:')
print(diferenca_data('28/02/1900', '01/03/1900')) # 1 dia.
print(diferenca_data('28/02/1904', '01/03/1904')) # 2 dias.
print(diferenca_data('28/02/2000', '01/03/2000')) # 2 dias.
print(diferenca_data('01/01/2016', '31/12/2016')) # 365 dias.
print(diferenca_data('01/01/2016', '01/01/2017')) # 366 dias.
print(diferenca_data('01/01/2017', '31/12/2017')) # 364 dias.
print(diferenca_data('01/01/2017', '01/01/2018')) # 365 dias.
print(diferenca_data('10/10/2010', '10/10/2410')) # 146097 dias.
print(diferenca_data('01/01/2018', '01/01/2017')) # -365 dias.
print(diferenca_data('01/01/2017', '01/01/2016')) # -366 dias.
print(diferenca_data('01/01/1899', '01/01/1903')) # 1460 dias.
print(diferenca_data('01/01/1900', '01/01/1904')) # 1460 dias.
print(diferenca_data('01/01/1901', '01/01/1905')) # 1461 dias.
print(diferenca_data('01/01/2000', '01/01/2004')) # 1461 dias.

# Datas válidas.
print('Datas válidas:')
print(validar_data(1, 1, 2001))
print(validar_data(1, 1, 1583))
print(validar_data(31, 12, 99999))
print(validar_data(31, 1, 2016))
print(validar_data(28, 2, 1900))
print(validar_data(28, 2, 2017))
print(validar_data(29, 2, 2000))
print(validar_data(29, 2, 2016))
print(validar_data(31, 3, 2016))
print(validar_data(30, 4, 2016))
print(validar_data(31, 5, 2016))
print(validar_data(30, 6, 2016))
print(validar_data(31, 7, 2016))
print(validar_data(31, 8, 2016))
print(validar_data(30, 9, 2016))
print(validar_data(31, 10, 2016))
print(validar_data(30, 11, 2016))
print(validar_data(31, 12, 2016))

# Datas inválidas:
print('Datas inválidas:')
print(validar_data(0, 1, 2001))
print(validar_data(-1, 1, 2001))
print(validar_data(1, 0, 2001))
print(validar_data(1, -1, 2001))
print(validar_data(1, 13, 2001))
print(validar_data(1, 1, 1582))
print(validar_data(32, 1, 2016))
print(validar_data(31, 2, 2016))
print(validar_data(30, 2, 2016))
print(validar_data(29, 2, 1900))
print(validar_data(29, 2, 2017))
print(validar_data(32, 3, 2016))
print(validar_data(31, 4, 2016))
print(validar_data(32, 5, 2016))
print(validar_data(31, 6, 2016))
print(validar_data(32, 7, 2016))
print(validar_data(32, 8, 2016))
print(validar_data(31, 9, 2016))
print(validar_data(32, 10, 2016))
print(validar_data(31, 11, 2016))
print(validar_data(32, 12, 2016))