{"id":"informatyka-2017-maj-matura-rozszerzona/zad/5.1","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"5.1","points":3,"ptype":"open","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Zadanie 5. Fanka\n\nGosia 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.\nPierwszy wiersz w każdym z plików jest wierszem nagłówkowym. Dane w każdym wierszu oddzielone są znakiem tabulacji.\n\n**druzyny.txt** - Id_druzyny (1-100), Nazwa (max 30 zn.), Miasto (max 30 zn.).\nPrzykład:\n1 | Srebrne Pumy | Olsztyn\n13 | Szybkie Mewy | Bydgoszcz\n\n**sedziowie.txt** - Nr_licencji (6 zn.), Imie (max 20), Nazwisko (max 50).\nPrzykład:\nKJ9494 | Anna | Adamczyk\nKI2449 | Weronika | Mazur\n\n**wyniki.txt** - Data_meczu (rrrr-mm-dd), Rodzaj_meczu (T/L/P), Gdzie (W/D), Id_druzyny, Nr_licencji, Bramki_zdobyte, Bramki_stracone.\nPrzykład:\n2002-01-01 | L | W | 5 | DM2649 | 3 | 0\n2002-01-03 | L | D | 60 | KJ9494 | 0 | 1\n\na) Podaj, ile towarzyskich, ile ligowych oraz ile pucharowych meczów rozegrała drużyna Galop Kucykowo z drużynami ze swego miasta.\n\nb) 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.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**a) Liczba meczów z drużynami z Kucykowa:**\n- Towarzyskie (T): **6**\n- Ligowe (L): **113**\n- Pucharowe (P): **25**\n\n**b) Najwięcej meczów: rok 2007, liczba meczów: 21**\n\n## Sposób 1 - SQL (cała baza w jednym schemacie)\n\nZakładamy zaimportowane tabele: `druzyny(Id_druzyny, Nazwa, Miasto)`, `wyniki(Data_meczu, Rodzaj_meczu, Gdzie, Id_druzyny, Nr_licencji, Bramki_zdobyte, Bramki_stracone)`.\n\nKrok 1 - znajdź Id Galop Kucykowo:\n```sql\nSELECT Id_druzyny FROM druzyny WHERE Nazwa = 'Galop Kucykowo';\n-- np. zwraca 50\n\nKażdy wiersz w `wyniki` to mecz Galop Kucykowo (treść mówi: zbiera wyniki TYLKO swojej drużyny) - `Id_druzyny` w tabeli wyniki to przeciwnik.\n\n### a) Liczba meczów per rodzaj:\n```sql\nSELECT w.Rodzaj_meczu, COUNT(*) AS liczba\nFROM wyniki w\nJOIN druzyny d ON w.Id_druzyny = d.Id_druzyny\nWHERE d.Miasto = 'Kucykowo'\nGROUP BY w.Rodzaj_meczu;\n\nWynik:\nT | 6\nL | 113\nP | 25\n\n### b) Rok z największą liczbą meczów z Kucykowa:\n```sql\nSELECT EXTRACT(YEAR FROM w.Data_meczu) AS rok, COUNT(*) AS liczba\nFROM wyniki w\nJOIN druzyny d ON w.Id_druzyny = d.Id_druzyny\nWHERE d.Miasto = 'Kucykowo'\nGROUP BY rok\nORDER BY liczba DESC\nLIMIT 1;\n\nWynik:\n2007 | 21\n\n(W SQLite: `strftime('%Y', Data_meczu)`. W Access: `YEAR(Data_meczu)`.)\n\n## Sposób 2 - Python\n\n```python\nfrom collections import defaultdict\n\n# Wczytaj drużyny: Id → Miasto\ndruzyny_miasto = {}\nwith open('druzyny.txt', encoding='utf-8') as f:\nnext(f) # skip header\nfor line in f:\nidd, nazwa, miasto = line.strip().split('\\t')\ndruzyny_miasto[int(idd)] = miasto\n\nlicznik_rodzaj = defaultdict(int)\nlicznik_rok = defaultdict(int)\nwith open('wyniki.txt', encoding='utf-8') as f:\nnext(f)\nfor line in f:\nparts = line.strip().split('\\t')\ndata, rodzaj, gdzie, idd, lic, bz, bs = parts\nif druzyny_miasto[int(idd)] == 'Kucykowo':\nlicznik_rodzaj[rodzaj] += 1\nlicznik_rok[data[:4]] += 1\n\nprint(\"T:\", licznik_rodzaj['T']) # 6\nprint(\"L:\", licznik_rodzaj['L']) # 113\nprint(\"P:\", licznik_rodzaj['P']) # 25\n\nbest_rok, best_count = max(licznik_rok.items(), key=lambda x: x[1])\nprint(\"Rok:\", best_rok, \"liczba:\", best_count) # 2007 21\n\n## Reference algorytmiczny - JOIN + agregacja\n\n> Reference - agregacja po JOIN:\n> - `INNER JOIN` łączy wyniki z druzyny po Id_druzyny.\n> - `WHERE Miasto = 'Kucykowo'` filtruje przeciwników z tego samego miasta.\n> - `GROUP BY Rodzaj_meczu` agreguje per rodzaj.\n> - `GROUP BY EXTRACT(YEAR FROM data)` agreguje per rok.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 5.1, max 3 pkt):\n> - **1 pkt** - 5.1.a: poprawne liczby T=6, L=113, P=25\n> - **2 pkt** - 5.1.b:\n> - 1 pkt za prawidłowy rok (2007)\n> - 1 pkt za prawidłową liczbę meczów (21)\n> - **0 pkt** - błędna lub brak\n\n## Typowe pułapki\n\n- **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!\n- **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.\n- **Rok z daty** - wystarczy `LEFT(data, 4)` lub `EXTRACT(YEAR FROM data)`; uważać na format daty (rrrr-mm-dd).\n- **3 wiersze w wyniku rodzajów** - wszystkie 3 typy (T, L, P) muszą być w odpowiedzi.\n\n## Złożoność obliczeniowa\n\n- SQL: O(n log n) dla GROUP BY + JOIN z indeksami.\n- Python: O(n) gdzie n = liczba wierszy w wyniki.txt.","image":null,"solution_image":null,"topics":null,"page_from":null,"source":"maturazai","answer_source":null,"answer_text_source":null,"solution_source":"maturazai","text_source":"maturazai","source_label":"Informatyka · Matura · maj 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura","text_html":"<p>Zadanie 5. Fanka</p>\n<p>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.<br>Pierwszy wiersz w każdym z plików jest wierszem nagłówkowym. Dane w każdym wierszu oddzielone są znakiem tabulacji.</p>\n<p><strong>druzyny.txt</strong> - Id_druzyny (1-100), Nazwa (max 30 zn.), Miasto (max 30 zn.).<br>Przykład:<br>1 | Srebrne Pumy | Olsztyn<br>13 | Szybkie Mewy | Bydgoszcz</p>\n<p><strong>sedziowie.txt</strong> - Nr_licencji (6 zn.), Imie (max 20), Nazwisko (max 50).<br>Przykład:<br>KJ9494 | Anna | Adamczyk<br>KI2449 | Weronika | Mazur</p>\n<p><strong>wyniki.txt</strong> - Data_meczu (rrrr-mm-dd), Rodzaj_meczu (T/L/P), Gdzie (W/D), Id_druzyny, Nr_licencji, Bramki_zdobyte, Bramki_stracone.<br>Przykład:<br>2002-01-01 | L | W | 5 | DM2649 | 3 | 0<br>2002-01-03 | L | D | 60 | KJ9494 | 0 | 1</p>\n<p>a) Podaj, ile towarzyskich, ile ligowych oraz ile pucharowych meczów rozegrała drużyna Galop Kucykowo z drużynami ze swego miasta.</p>\n<p>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.</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p><strong>a) Liczba meczów z drużynami z Kucykowa:</strong></p>\n<ul><li>Towarzyskie (T): <strong>6</strong></li><li>Ligowe (L): <strong>113</strong></li><li>Pucharowe (P): <strong>25</strong></li></ul>\n<p><strong>b) Najwięcej meczów: rok 2007, liczba meczów: 21</strong></p>\n<h4>Sposób 1 - SQL (cała baza w jednym schemacie)</h4>\n<p>Zakładamy zaimportowane tabele: <code>druzyny(Id_druzyny, Nazwa, Miasto)</code>, <code>wyniki(Data_meczu, Rodzaj_meczu, Gdzie, Id_druzyny, Nr_licencji, Bramki_zdobyte, Bramki_stracone)</code>.</p>\n<p>Krok 1 - znajdź Id Galop Kucykowo:<br>```sql<br>SELECT Id_druzyny FROM druzyny WHERE Nazwa = &#x27;Galop Kucykowo&#x27;;<br>-- np. zwraca 50</p>\n<p>Każdy wiersz w <code>wyniki</code> to mecz Galop Kucykowo (treść mówi: zbiera wyniki TYLKO swojej drużyny) - <code>Id_druzyny</code> w tabeli wyniki to przeciwnik.</p>\n<h5>a) Liczba meczów per rodzaj:</h5>\n<p>```sql<br>SELECT w.Rodzaj_meczu, COUNT(*) AS liczba<br>FROM wyniki w<br>JOIN druzyny d ON w.Id_druzyny = d.Id_druzyny<br>WHERE d.Miasto = &#x27;Kucykowo&#x27;<br>GROUP BY w.Rodzaj_meczu;</p>\n<p>Wynik:<br>T | 6<br>L | 113<br>P | 25</p>\n<h5>b) Rok z największą liczbą meczów z Kucykowa:</h5>\n<p>```sql<br>SELECT EXTRACT(YEAR FROM w.Data_meczu) AS rok, COUNT(*) AS liczba<br>FROM wyniki w<br>JOIN druzyny d ON w.Id_druzyny = d.Id_druzyny<br>WHERE d.Miasto = &#x27;Kucykowo&#x27;<br>GROUP BY rok<br>ORDER BY liczba DESC<br>LIMIT 1;</p>\n<p>Wynik:<br>2007 | 21</p>\n<p>(W SQLite: <code>strftime(&#x27;%Y&#x27;, Data_meczu)</code>. W Access: <code>YEAR(Data_meczu)</code>.)</p>\n<h4>Sposób 2 - Python</h4>\n<p>```python<br>from collections import defaultdict</p>\n<h3>Wczytaj drużyny: Id → Miasto</h3>\n<p>druzyny_miasto = {}<br>with open(&#x27;druzyny.txt&#x27;, encoding=&#x27;utf-8&#x27;) as f:<br>next(f) # skip header<br>for line in f:<br>idd, nazwa, miasto = line.strip().split(&#x27;\\t&#x27;)<br>druzyny_miasto[int(idd)] = miasto</p>\n<p>licznik_rodzaj = defaultdict(int)<br>licznik_rok = defaultdict(int)<br>with open(&#x27;wyniki.txt&#x27;, encoding=&#x27;utf-8&#x27;) as f:<br>next(f)<br>for line in f:<br>parts = line.strip().split(&#x27;\\t&#x27;)<br>data, rodzaj, gdzie, idd, lic, bz, bs = parts<br>if druzyny_miasto[int(idd)] == &#x27;Kucykowo&#x27;:<br>licznik_rodzaj[rodzaj] += 1<br>licznik_rok[data[:4]] += 1</p>\n<p>print(&quot;T:&quot;, licznik_rodzaj[&#x27;T&#x27;]) # 6<br>print(&quot;L:&quot;, licznik_rodzaj[&#x27;L&#x27;]) # 113<br>print(&quot;P:&quot;, licznik_rodzaj[&#x27;P&#x27;]) # 25</p>\n<p>best_rok, best_count = max(licznik_rok.items(), key=lambda x: x[1])<br>print(&quot;Rok:&quot;, best_rok, &quot;liczba:&quot;, best_count) # 2007 21</p>\n<h4>Reference algorytmiczny - JOIN + agregacja</h4>\n<blockquote>Reference - agregacja po JOIN:<br>- <code>INNER JOIN</code> łączy wyniki z druzyny po Id_druzyny.<br>- <code>WHERE Miasto = &#x27;Kucykowo&#x27;</code> filtruje przeciwników z tego samego miasta.<br>- <code>GROUP BY Rodzaj_meczu</code> agreguje per rodzaj.<br>- <code>GROUP BY EXTRACT(YEAR FROM data)</code> agreguje per rok.</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 5.1, max 3 pkt):<br>- <strong>1 pkt</strong> - 5.1.a: poprawne liczby T=6, L=113, P=25<br>- <strong>2 pkt</strong> - 5.1.b:<br>- 1 pkt za prawidłowy rok (2007)<br>- 1 pkt za prawidłową liczbę meczów (21)<br>- <strong>0 pkt</strong> - błędna lub brak</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>Filtrowanie po nazwie miasta</strong> - drużyna Galop Kucykowo grała z innymi drużynami z Kucykowa. NIE filtruj po <code>Nazwa = &#x27;Galop Kucykowo&#x27;</code> - to filtruje samą siebie!</li><li><strong>Wyniki zawierają TYLKO mecze Galop Kucykowo</strong> - według treści Gosia zbiera dane o swojej drużynie, więc każdy wiersz w <code>wyniki.txt</code> to mecz Galop. Kolumna <code>Id_druzyny</code> w wynikach to PRZECIWNIK.</li><li><strong>Rok z daty</strong> - wystarczy <code>LEFT(data, 4)</code> lub <code>EXTRACT(YEAR FROM data)</code>; uważać na format daty (rrrr-mm-dd).</li><li><strong>3 wiersze w wyniku rodzajów</strong> - wszystkie 3 typy (T, L, P) muszą być w odpowiedzi.</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>SQL: O(n log n) dla GROUP BY + JOIN z indeksami.</li><li>Python: O(n) gdzie n = liczba wierszy w wyniki.txt.</li></ul>"}]}