# Informatyka — zadanie 5.1

> Źródło: matura.lol — https://matura.lol/question/maturazai-informatyka-inf-2017-05/zad/5.1
> Wersja Markdown strony zadania (dla asystentów AI). Przy cytowaniu podaj matura.lol i link powyżej.

- arkusz: Informatyka · Matura · maj 2017 (rozszerzona)
- rok: 2017
- poziom: rozszerzona
- typ: open
- punkty: 3
- działy: Programowanie i algorytmika

## Treść

Zadanie 5. Fanka

Gosia mieszka w Kucykowie i jest fanką lokalnej kobiecej drużyny piłki nożnej Galop Kucykowo. Gosia zbiera informacje o wszystkich wynikach oficjalnych meczów tej drużyny. Informacje te zapisuje w plikach: druzyny.txt, sedziowie.txt, wyniki.txt.
Pierwszy wiersz w każdym z plików jest wierszem nagłówkowym. Dane w każdym wierszu oddzielone są znakiem tabulacji.

**druzyny.txt** - Id_druzyny (1-100), Nazwa (max 30 zn.), Miasto (max 30 zn.).
Przykład:
1 | Srebrne Pumy | Olsztyn
13 | Szybkie Mewy | Bydgoszcz

**sedziowie.txt** - Nr_licencji (6 zn.), Imie (max 20), Nazwisko (max 50).
Przykład:
KJ9494 | Anna | Adamczyk
KI2449 | Weronika | Mazur

**wyniki.txt** - Data_meczu (rrrr-mm-dd), Rodzaj_meczu (T/L/P), Gdzie (W/D), Id_druzyny, Nr_licencji, Bramki_zdobyte, Bramki_stracone.
Przykład:
2002-01-01 | L | W | 5 | DM2649 | 3 | 0
2002-01-03 | L | D | 60 | KJ9494 | 0 | 1

a) Podaj, ile towarzyskich, ile ligowych oraz ile pucharowych meczów rozegrała drużyna Galop Kucykowo z drużynami ze swego miasta.

b) W którym roku drużyna Galop Kucykowo rozegrała najwięcej meczów z drużynami ze swego miasta (łącznie wszystkie rodzaje meczów)? Podaj rok i liczbę tych meczów.

## Rozwiązanie — maturazai.pl (AI)

## Poprawna odpowiedź

**a) Liczba meczów z drużynami z Kucykowa:**
- Towarzyskie (T): **6**
- Ligowe (L): **113**
- Pucharowe (P): **25**

**b) Najwięcej meczów: rok 2007, liczba meczów: 21**

## Sposób 1 - SQL (cała baza w jednym schemacie)

Zakładamy zaimportowane tabele: `druzyny(Id_druzyny, Nazwa, Miasto)`, `wyniki(Data_meczu, Rodzaj_meczu, Gdzie, Id_druzyny, Nr_licencji, Bramki_zdobyte, Bramki_stracone)`.

Krok 1 - znajdź Id Galop Kucykowo:
```sql
SELECT Id_druzyny FROM druzyny WHERE Nazwa = 'Galop Kucykowo';
-- np. zwraca 50

Każdy wiersz w `wyniki` to mecz Galop Kucykowo (treść mówi: zbiera wyniki TYLKO swojej drużyny) - `Id_druzyny` w tabeli wyniki to przeciwnik.

### a) Liczba meczów per rodzaj:
```sql
SELECT w.Rodzaj_meczu, COUNT(*) AS liczba
FROM wyniki w
JOIN druzyny d ON w.Id_druzyny = d.Id_druzyny
WHERE d.Miasto = 'Kucykowo'
GROUP BY w.Rodzaj_meczu;

Wynik:
T | 6
L | 113
P | 25

### b) Rok z największą liczbą meczów z Kucykowa:
```sql
SELECT EXTRACT(YEAR FROM w.Data_meczu) AS rok, COUNT(*) AS liczba
FROM wyniki w
JOIN druzyny d ON w.Id_druzyny = d.Id_druzyny
WHERE d.Miasto = 'Kucykowo'
GROUP BY rok
ORDER BY liczba DESC
LIMIT 1;

Wynik:
2007 | 21

(W SQLite: `strftime('%Y', Data_meczu)`. W Access: `YEAR(Data_meczu)`.)

## Sposób 2 - Python

```python
from collections import defaultdict

# Wczytaj drużyny: Id → Miasto
druzyny_miasto = {}
with open('druzyny.txt', encoding='utf-8') as f:
next(f) # skip header
for line in f:
idd, nazwa, miasto = line.strip().split('\t')
druzyny_miasto[int(idd)] = miasto

licznik_rodzaj = defaultdict(int)
licznik_rok = defaultdict(int)
with open('wyniki.txt', encoding='utf-8') as f:
next(f)
for line in f:
parts = line.strip().split('\t')
data, rodzaj, gdzie, idd, lic, bz, bs = parts
if druzyny_miasto[int(idd)] == 'Kucykowo':
licznik_rodzaj[rodzaj] += 1
licznik_rok[data[:4]] += 1

print("T:", licznik_rodzaj['T']) # 6
print("L:", licznik_rodzaj['L']) # 113
print("P:", licznik_rodzaj['P']) # 25

best_rok, best_count = max(licznik_rok.items(), key=lambda x: x[1])
print("Rok:", best_rok, "liczba:", best_count) # 2007 21

## Reference algorytmiczny - JOIN + agregacja

> Reference - agregacja po JOIN:
> - `INNER JOIN` łączy wyniki z druzyny po Id_druzyny.
> - `WHERE Miasto = 'Kucykowo'` filtruje przeciwników z tego samego miasta.
> - `GROUP BY Rodzaj_meczu` agreguje per rodzaj.
> - `GROUP BY EXTRACT(YEAR FROM data)` agreguje per rok.

## Schemat oceniania CKE

> Klucz CKE (zadanie 5.1, max 3 pkt):
> - **1 pkt** - 5.1.a: poprawne liczby T=6, L=113, P=25
> - **2 pkt** - 5.1.b:
> - 1 pkt za prawidłowy rok (2007)
> - 1 pkt za prawidłową liczbę meczów (21)
> - **0 pkt** - błędna lub brak

## Typowe pułapki

- **Filtrowanie po nazwie miasta** - drużyna Galop Kucykowo grała z innymi drużynami z Kucykowa. NIE filtruj po `Nazwa = 'Galop Kucykowo'` - to filtruje samą siebie!
- **Wyniki zawierają TYLKO mecze Galop Kucykowo** - według treści Gosia zbiera dane o swojej drużynie, więc każdy wiersz w `wyniki.txt` to mecz Galop. Kolumna `Id_druzyny` w wynikach to PRZECIWNIK.
- **Rok z daty** - wystarczy `LEFT(data, 4)` lub `EXTRACT(YEAR FROM data)`; uważać na format daty (rrrr-mm-dd).
- **3 wiersze w wyniku rodzajów** - wszystkie 3 typy (T, L, P) muszą być w odpowiedzi.

## Złożoność obliczeniowa

- SQL: O(n log n) dla GROUP BY + JOIN z indeksami.
- Python: O(n) gdzie n = liczba wierszy w wyniki.txt.

## Linki

- [dane JSON](https://matura.lol/api/question/maturazai-informatyka-inf-2017-05/zad/5.1)
- [otwórz w wyszukiwarce](https://matura.lol/?problem=maturazai-informatyka-inf-2017-05%2Fzad%2F5.1)

## Podobne zadania

- [Zadanie 2](https://matura.lol/question/informatyka-2025-maj-matura-rozszerzona/zad/2) — Zadanie 2. Zapis symboliczny W pliku symbole.txt zapisano 2000 napisów. Każdy z nich jest zapisany w osobnym wierszu i składa się z dokładnie 12 znaków spośród:
- [Zadanie 7](https://matura.lol/question/informatyka-2025-maj-matura-rozszerzona/zad/7) — Zadanie 7. Poszukiwanie wody na Marsie W trzech plikach tekstowych o nazwach laziki.txt, obszary.txt, pomiary.txt zapisano informacje zawierające dane o poszuki
- [Zadanie 3](https://matura.lol/question/informatyka-2023-maj-matura-rozszerzona/zad/3) — Zadanie 3. Liczba Pi Pewien matematyk jest zafascynowany liczbą π ≈ 3,14159265 do tego stopnia, że zapisał jej rozwinięcie dziesiętne z dokładnością do 10 000 c
- [Zadanie 3](https://matura.lol/question/informatyka-2025-maj-matura-rozszerzona/zad/3) — Zadanie 3. Dron Tor lotu pewnego drona składa się z prostych odcinków. Lot rozpoczyna się w punkcie (0, 0), a kończy w punkcie (20000, 0). Dron poza startem i l

_Ostatnia aktualizacja danych: 2026-10-03_
