7.4 Łaziki na obu półkulach
Matura maj 2025 - Matura z informatyki: arkusze krok po kroku (Python)
Zadanie 7.4 (2 pkt): łaziki, które wylądowały na półkuli południowej, a mierzyły na obu półkulach. Półkulę mówi litera N/S na końcu szerokości geograficznej. Zbiór liter z pomiarów łazika równy `{"N", "S"}` oznacza obie półkule. Bez warunku lądowania na południu jest tylko 1 z 2 punktów.
from datetime import date
def load(name):
# plik z nagłówkiem, pola rozdzielone tabulatorami
with open(name, encoding="utf-8") as f:
next(f)
return [line.rstrip("\n").split("\t") for line in f]
rovers = {row[0]: row for row in load("laziki.txt")} # nr -> nr, nazwa, rok, współrzędne
areas = {code: name for code, name in load("obszary.txt")}
surveys = load("pomiary_przyklad.txt") # nr łazika, data, kod obszaru, współrzędne, głębokość, ilość
# 7.1 woda na głębokości do 100 m, zsumowana dla obszaru (klucz = kod, odpowiedź = nazwa)
water = {}
for rover, day, code, place, depth, amount in surveys:
if int(depth) <= 100:
water[code] = water.get(code, 0) + int(amount)
wettest = areas[max(water, key=water.get)]
# 7.2 okres pracy łazika: najwcześniejsza i najpóźniejsza data (daty ISO porównują się jak napisy)
span = {}
for rover, day, code, place, depth, amount in surveys:
low, high = span.get(rover, (day, day))
span[rover] = (min(low, day), max(high, day))
longest = max(span, key=lambda r: date.fromisoformat(span[r][1]) - date.fromisoformat(span[r][0]))
# 7.3 obszary bez pomiaru w roku wysłania łazika: od wszystkich odejmujemy te "złe"
same_year = {code for rover, day, code, place, depth, amount in surveys if day[:4] == rovers[rover][2]}
untouched = sorted(areas[code] for code in areas if code not in same_year)
# 7.4 półkula = litera po szerokości geograficznej ("44.90S, 130.80W" -> "S")
def hemisphere(place):
return place.split(",")[0][-1]
seen = {}
for rover, day, code, place, depth, amount in surveys:
seen.setdefault(rover, set()).add(hemisphere(place))
both = [rovers[r][1] for r in rovers if hemisphere(rovers[r][3]) == "S" and seen.get(r) == {"N", "S"}]
print("7.1", wettest)
print("7.2", rovers[longest][1], *span[longest])
print("7.3", untouched)
print("7.4", both)Ładowanie interaktywnego edytora... Jeśli się nie pojawi, włącz JavaScript.
Wszystkie lekcje kursu Matura z informatyki: arkusze krok po kroku·Zaloguj się, aby zapisać postęp na koncie.