Parser poleceń
Operatorzy wpisują polecenia w konsoli w pośpiechu, z przypadkowymi spacjami, wielkimi literami i od czasu do czasu z omsknięciem palca. Oprogramowanie lotu nigdy nie może wykonać polecenia, którego w pełni nie zrozumiało, a operator musi od razu wiedzieć, dlaczego polecenie zostało odrzucone.
Napisz parser, który stoi między klawiaturą a statkiem.
Ukończ etap 1, aby odblokować ten etap.
Napisz parse_command(text). Ignoruje wielkość liter i spacje wokół słów, zwraca ("burn", seconds) dla odpalenia z jedną liczbą dodatnią i zgłasza ValueError z powodem dla wszystkiego innego. Potem spróbuj każdego polecenia i wypisz OK i wynik albo ODRZUCONE, polecenie w cudzysłowie i powód:
OK ('burn', 12.5)
OK ('burn', 3.0)
OK ('burn', 0.5)
ODRZUCONE "burn": burn potrzebuje jednej wartości: długości w sekundach
ODRZUCONE "burn ten": długość odpalenia musi być liczbą: ten
ODRZUCONE "burn -4": długość odpalenia musi być dodatnia: -4
ODRZUCONE "dance": nieznane polecenie: dance
ODRZUCONE "": puste polecenie
text.strip().lower().split() daje słowa. Zamiana długości może zgłosić własny ValueError: złap go i zgłoś swój, z jaśniejszym komunikatem.
Ukończ etap 1, aby odblokować ten etap.
Dwa nowe polecenia: set mode X, gdzie X to jeden z MODES, zwraca ("set", "mode", X), a abort, bez wartości, zwraca ("abort",). Wszystko inne po set jest odrzucane z własnym powodem:
OK ('burn', 12.5)
OK ('set', 'mode', 'safe')
OK ('set', 'mode', 'science')
ODRZUCONE "set mode party": tryb musi być jednym z: nominal, safe, science
ODRZUCONE "set gain 2": nieznane ustawienie: gain
ODRZUCONE "set mode": set potrzebuje ustawienia i wartości
OK ('abort',)
ODRZUCONE "abort now": abort nie przyjmuje wartości
ODRZUCONE "burn ten": długość odpalenia musi być liczbą: ten
ODRZUCONE "dance": nieznane polecenie: dance
Dodaj oba przed ostatnią linią z nieznane polecenie, żeby nadal łapała wszystko inne.
Podpowiedzi
Metody find, replace i split
# Wyszukiwanie i zamiana w stringach
report = "Misja Mars zakończona sukcesem. Mars jest bezpieczny."
# Znajdowanie pozycji
position = report.find("Mars")
print("Mars znaleziony na pozycji:", position)
# Zliczanie wystąpień
mars_count = report.count("Mars")
print("Ile razy Mars:", mars_count)
# Zamiana tekstu
new_report = report.replace("Mars", "Wenus")
print(new_report)
# Dzielenie na części
data = "Jan,Kowalski,Pilot,ISS"
elements = data.split(",")
print("Elementy:", elements)
print("Imię:", elements[0])
Oddziel argumenty przecinkami. Każde uruchomienie przekazuje je jako sys.argv[1:].