6.5 Symulacja transportów na orbitę
Matura maj 2025 - Matura z informatyki: arkusze krok po kroku (Python)
Zadanie 6.5 (3 pkt): zasady stacji z treści zadania zapisane dzień po dniu. Najpierw wydobycie z dzisiejszego ładunku, potem sprawdzenie magazynu na koniec dnia: przy co najmniej 100 kg transporter zabiera 100 kg, nadmiar zostaje. Taka symulacja pętlą to typowe zadanie "uwzględnij zasady działania".
from datetime import date, timedelta
loads = []
with open("martianeum_przyklad.txt", encoding="utf-8") as f:
next(f) # pierwszy wiersz to nagłówek
for line in f:
day, area, mass, share = line.rstrip("\n").split("\t")
# liczby z przecinkiem dziesiętnym: zamiana na kropkę przed float
loads.append((date.fromisoformat(day), area, float(mass.replace(",", ".")), float(share.replace(",", "."))))
# 6.1 masa minerału = masa ładunku * zawartość / 100, tylko gdy zawartość >= 1%
total_mass = sum(mass for day, area, mass, share in loads)
mined = sum(mass * share / 100 for day, area, mass, share in loads if share >= 1)
# 6.2 średnia masa ładunku dla obszaru: suma i licznik w słownikach
sums, counts = {}, {}
for day, area, mass, share in loads:
sums[area] = sums.get(area, 0) + mass
counts[area] = counts.get(area, 0) + 1
lightest = min(sums, key=lambda area: sums[area] / counts[area])
# 6.3 numer okresu 7-dniowego = liczba dni od pierwszego dnia // 7
first = loads[0][0]
weeks = {}
for day, area, mass, share in loads:
week = (day - first).days // 7
weeks[week] = weeks.get(week, 0) + mass
best_week = max(weeks, key=weeks.get)
best_start = first + timedelta(days=7 * best_week)
# 6.4 zestawienie: obszar -> rok -> liczba przewozów
years = sorted({day.year for day, area, mass, share in loads})
table = {}
for day, area, mass, share in loads:
row = table.setdefault(area, {})
row[day.year] = row.get(day.year, 0) + 1
# 6.5 symulacja magazynu: dzień po dniu, transport gdy na koniec dnia jest co najmniej 100 kg
stock = 0
transports = []
for day, area, mass, share in loads:
if share >= 1:
stock += mass * share / 100
if stock >= 100:
stock -= 100
transports.append(day)
print("6.1", round(total_mass, 1), round(mined, 4))
print("6.2", lightest)
print("6.3", round(weeks[best_week], 1), best_start)
print("6.4", *years)
for area in sorted(table):
print(area, *[table[area].get(year, 0) for year in years])
print("6.5", len(transports), transports[0] if transports else "-", transports[-1] if transports else "-")Ł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.