Escribir una función o programa que toma entradas de string, totalmente espelta, nombres ingleses mes en el caso del título: January
, February
, March
, etc (nulo / CR / LF terminado bien, delimitado con un poco de carácter no-alfa si así lo desea) y, o bien
compara dos entradas, devolviendo un valor de Verdad si la segunda entrada es mayor (en orden de mes) que la primera. Los valores iguales dan como resultado un valor de Falsey
o ordena una secuencia arbitraria (lista, cadena delimitada, etc.) de ellos en orden cronológico
(El quid del desafío es definir un método / expresión que proporcione el tipo lexicográfico correcto. Algunos idiomas pueden tener una respuesta más corta con uno u otro)
No puede utilizar ningún método de análisis de tiempo interno (p strptime
. Ej. ) Para traducir el nombre del mes en un número o una asignación preestablecida de nombres de mes. Utilice las propiedades de las cadenas en sí, una tabla de búsqueda parsimoniosa que defina o algo inteligente.
Ejemplo
Ejemplos de funcionamiento, aunque el primero está prohibido por las reglas ...
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')
Sin embargo, las siguientes versiones están bien, porque codificamos esa información
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]
O podrías hacer una función de clasificación
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])
Pruebas de ejemplo
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
de todos los nombres de Mes, me gustaría prohibirla months[x] < months[y]
como respuesta. La lista de nombres de mes tiene algunas características más peculiares (longitud variable, características comunes) que hacen que el desafío sea más fácil / difícil que las cadenas generadas aleatoriamente.