Escreva uma função ou programa que leva entradas de string, totalmente escrito, os nomes dos meses Inglês em caso de título: January
, February
, March
, etc. (null / CR / LF encerrado OK, delimitado com alguns caracteres não-alfa se assim preferir) e quer
compara duas entradas, retornando um valor Truthy se a segunda entrada for maior (na ordem do mês) que a primeira. Valores iguais resultam em um valor de Falsey
ou classifica uma sequência arbitrária (lista, sequência delimitada etc.) em ordem cronológica
(O ponto crucial do desafio é definir um método / expressão que dê a classificação lexicográfica correta. Alguns idiomas podem ter uma resposta mais curta com um ou outro)
Você não pode usar nenhum método interno de análise de tempo (por exemplo strptime
) para converter o nome do mês em um número ou em um mapeamento pré-definido de nomes de meses. Use as propriedades das próprias strings, uma tabela de consulta parcimoniosa que você definir ou algo inteligente.
Exemplo
Exemplos de funcionamento, embora o primeiro seja proibido pelas regras ...
import datetime
def is_later_month(a, b):
'''
Example of prohibited code because it relies on language
features about how to parse month names
'''
return datetime.strptime(a, '%B') < datetime.strptime(b, '%B')
As versões abaixo estão OK, porque codificamos essas informações
months = {
'January': 1, 'February': 2, 'March': 3,
'April': 4, 'May': 5, 'June': 6,
'July': 7, 'August': 8, 'September': 9,
'October': 10, 'November': 11, 'December': 12,
}
def is_later_month(a, b):
"""
Returns True/False when comparing two months.
"""
return months[a] < months[b]
Ou você pode fazer uma função de classificação
months = {'as above...'}
def sort_months(l):
"""
Sorts list and returns it. Different input and output than the above,
but equally valid. Sorting versus comparing might be shorter in your
favorite language.
"""
return sorted(l, key=lambda x: months[x])
Testes de exemplo
assert is_later_month('January', 'February')
assert is_later_month('January', 'December')
assert is_later_month('November', 'December')
assert not is_later_month('July', 'July')
assert not is_later_month('October', 'September')
months
que fosse uma lista de todos os nomes de meses, eu gostaria de proibir months[x] < months[y]
como resposta. A lista de nomes de meses possui alguns recursos mais peculiares (duração variável, semelhança) que facilitam / dificultam o desafio em relação a cadeias geradas aleatoriamente.