Scrivere una funzione o un programma che prende ingressi stringa, completamente farro, i nomi dei mesi in inglese nel caso in cui il titolo: January
, February
, March
, ecc (null / CR / LF terminato OK, delimitato con qualche carattere non-alfa se lo si vuole) e sia
confronta due input, restituendo un valore Verità se il secondo input è maggiore (nell'ordine del mese) del primo. Valori uguali producono un valore Falsey
o ordina una sequenza arbitraria (elenco, stringa delimitata, ecc.) in ordine cronologico
(Il punto cruciale della sfida è definire un metodo / espressione che dia il corretto ordinamento lessicografico. Alcune lingue potrebbero avere una risposta più breve con l'una o l'altra)
Non è possibile utilizzare alcun metodo di analisi del tempo interno (ad es. strptime
) Per tradurre il nome del mese in un numero o una mappatura predefinita dei nomi dei mesi. Usa le proprietà delle stringhe stesse, una tabella di ricerca parsimoniosa che definisci o qualcosa di intelligente.
Esempio
Esempi di funzionamento, sebbene il primo sia vietato dalle regole ...
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')
Le versioni seguenti sono OK, perché codifichiamo tali informazioni
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]
Oppure potresti fare una funzione di ordinamento
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])
Test di esempio
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
che era un elenco di tutti i nomi dei Mese, vorrei proibire months[x] < months[y]
come risposta. L'elenco dei nomi dei mesi presenta alcune caratteristiche più peculiari (lunghezza variabile, comunanza) che rendono la sfida più semplice / difficile rispetto alle stringhe generate casualmente.