{"id":"informatyka-2017-maj-matura-rozszerzona/zad/5.4","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"5.4","points":3,"ptype":"open","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 5.1.\n\nPodaj, ilu sędziów spośród tych zapisanych w pliku sedziowie.txt nie sędziowało żadnego pucharowego meczu drużyny Galop Kucykowo.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**Liczba sędziów, którzy NIE sędziowali żadnego pucharowego meczu Galop Kucykowo: 22**\n\nW skład 22 wchodzą:\n- **18** sędziów, którzy sędziowali jakieś mecze Galop Kucykowo, ale NIE pucharowe (np. ligowe lub towarzyskie).\n- **4** sędziów z pliku sedziowie.txt, którzy w ogóle nie sędziowali żadnego meczu Galop Kucykowo.\n\n## Sposób 1 - SQL (NOT IN / EXCEPT)\n\nNajkrótsze podejście: znajdź sędziów, którzy sędziowali jakiś pucharowy mecz, a następnie zlicz tych, którzy NIE są na tej liście.\n\n```sql\nSELECT COUNT(*) AS liczba\nFROM sedziowie\nWHERE Nr_licencji NOT IN (\nSELECT DISTINCT Nr_licencji\nFROM wyniki\nWHERE Rodzaj_meczu = 'P'\n);\n\n**Wynik:** `22`\n\nUwaga - całość `wyniki.txt` to mecze Galop Kucykowo (treść zadania 5.1: Gosia zapisuje TYLKO wyniki swojej drużyny), więc filtr `Rodzaj_meczu = 'P'` automatycznie ogranicza się do meczów Galop Kucykowo.\n\nAlternatywnie z LEFT JOIN:\n```sql\nSELECT COUNT(*) AS liczba\nFROM sedziowie s\nLEFT JOIN (\nSELECT DISTINCT Nr_licencji FROM wyniki WHERE Rodzaj_meczu = 'P'\n) p ON s.Nr_licencji = p.Nr_licencji\nWHERE p.Nr_licencji IS NULL;\n\n## Sposób 2 - Python (zbiory)\n\n```python\n# Wczytaj wszystkich sedziow\nsedziowie_all = set()\nwith open('sedziowie.txt', encoding='utf-8') as f:\nnext(f) # header\nfor line in f:\nnr_lic, imie, nazwisko = line.strip().split('\\t')\nsedziowie_all.add(nr_lic)\n\n# Znajdz sedziow ktorzy sedziowali jakis mecz pucharowy\nsedziowie_puchar = set()\nwith open('wyniki.txt', encoding='utf-8') as f:\nnext(f)\nfor line in f:\nparts = line.strip().split('\\t')\nrodzaj = parts[1]\nnr_lic = parts[4]\nif rodzaj == 'P':\nsedziowie_puchar.add(nr_lic)\n\n# Roznica zbiorow: sedziowie BEZ pucharowego meczu Galop\nbez_pucharu = sedziowie_all - sedziowie_puchar\nprint(len(bez_pucharu)) # 22\n\n## Sposób 3 - arkusz kalkulacyjny\n\n**Krok 1:** Wczytaj sedziowie.txt do tabeli A (kolumna A = Nr_licencji).\n\n**Krok 2:** Wczytaj wyniki.txt, filtruj po `Rodzaj_meczu = 'P'`, wyciągnij UNIKATOWE wartości Nr_licencji.\n\n**Krok 3:** W kolumnie B obok każdego sędziego: `=LICZ.JEŻELI(zakres_pucharowych; A2)` - zwraca 0 jeśli sędzia nie sędziował pucharowego.\n\n**Krok 4:** `=LICZ.JEŻELI(B:B; 0)` = 22.\n\n## Reference algorytmiczny - różnica zbiorów\n\n> Reference - operacja \"NOT IN\" / różnica zbiorów:\n> - **SQL**: `WHERE x NOT IN (SELECT )` lub `LEFT JOIN WHERE IS NULL` (anty-join).\n> - **Python**: `set_A - set_B` zwraca elementy w A, których nie ma w B.\n> - **Złożoność**: O(N) przy użyciu set/hash dla obu zbiorów.\n> - Alternatywa: `EXCEPT` w SQL (`SELECT Nr FROM sedziowie EXCEPT SELECT Nr FROM wyniki WHERE Rodzaj = 'P'`).\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 5.4, max 3 pkt):\n> - **3 pkt** - prawidłowa odpowiedź: **22** (wszyscy sędziowie z pliku którzy nie sędziowali żadnego pucharu Galop).\n> - **2 pkt** - odpowiedź **18** (uwzględniono tylko sędziów, którzy sędziowali jakikolwiek inny mecz Galop Kucykowo, ale nie pucharowy - pominięto 4 sędziów, którzy nie sędziowali w ogóle).\n> - **2 pkt** - odpowiedź **4** (uwzględniono tylko sędziów, którzy nie sędziowali żadnego meczu Galop).\n> - **0 pkt** - inna błędna odpowiedź lub brak.\n> - **UWAGA:** Nie przyznaje się 1 pkt.\n\n## Typowe pułapki\n\n- **Pominięcie sędziów którzy w ogóle nie sędziowali** - typowy błąd punktowany 2 pkt zamiast 3. Treść mówi \"spośród tych zapisanych w sedziowie.txt\", więc wszyscy sędziowie z tego pliku są w grupie startowej.\n- **Wymagana DISTINCT** - w wyniki.txt jeden sędzia może sędziować wiele meczów pucharowych. Bez DISTINCT podzapytanie zwróciłoby duplikaty (ale NOT IN i tak by działał poprawnie).\n- **Pomylenie kierunku** - pytanie o sędziów BEZ pucharu, nie sędziujących pucharowy mecz.\n- **Filtr `Rodzaj_meczu = 'P'`** - tylko pucharowe. Mecze T (towarzyskie) i L (ligowe) nie liczą się.\n- **Cała baza wyniki.txt to mecze Galop Kucykowo** - nie trzeba filtrować po Id_druzyny = Galop (bo Gosia zapisuje tylko swoją drużynę).\n\n## Złożoność obliczeniowa\n\n- SQL z NOT IN + DISTINCT: O(N + M) z hash, O(N · M) bez indeksów.\n- Python z set: O(N + M).\n- Anty-join (LEFT JOIN IS NULL): zwykle szybszy niż NOT IN dla dużych zbiorów.","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>Kontekst - patrz zadanie 5.1.</p>\n<p>Podaj, ilu sędziów spośród tych zapisanych w pliku sedziowie.txt nie sędziowało żadnego pucharowego meczu drużyny Galop Kucykowo.</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p><strong>Liczba sędziów, którzy NIE sędziowali żadnego pucharowego meczu Galop Kucykowo: 22</strong></p>\n<p>W skład 22 wchodzą:</p>\n<ul><li><strong>18</strong> sędziów, którzy sędziowali jakieś mecze Galop Kucykowo, ale NIE pucharowe (np. ligowe lub towarzyskie).</li><li><strong>4</strong> sędziów z pliku sedziowie.txt, którzy w ogóle nie sędziowali żadnego meczu Galop Kucykowo.</li></ul>\n<h4>Sposób 1 - SQL (NOT IN / EXCEPT)</h4>\n<p>Najkrótsze podejście: znajdź sędziów, którzy sędziowali jakiś pucharowy mecz, a następnie zlicz tych, którzy NIE są na tej liście.</p>\n<p>```sql<br>SELECT COUNT(*) AS liczba<br>FROM sedziowie<br>WHERE Nr_licencji NOT IN (<br>SELECT DISTINCT Nr_licencji<br>FROM wyniki<br>WHERE Rodzaj_meczu = &#x27;P&#x27;<br>);</p>\n<p><strong>Wynik:</strong> <code>22</code></p>\n<p>Uwaga - całość <code>wyniki.txt</code> to mecze Galop Kucykowo (treść zadania 5.1: Gosia zapisuje TYLKO wyniki swojej drużyny), więc filtr <code>Rodzaj_meczu = &#x27;P&#x27;</code> automatycznie ogranicza się do meczów Galop Kucykowo.</p>\n<p>Alternatywnie z LEFT JOIN:<br>```sql<br>SELECT COUNT(*) AS liczba<br>FROM sedziowie s<br>LEFT JOIN (<br>SELECT DISTINCT Nr_licencji FROM wyniki WHERE Rodzaj_meczu = &#x27;P&#x27;<br>) p ON s.Nr_licencji = p.Nr_licencji<br>WHERE p.Nr_licencji IS NULL;</p>\n<h4>Sposób 2 - Python (zbiory)</h4>\n<p>```python</p>\n<h3>Wczytaj wszystkich sedziow</h3>\n<p>sedziowie_all = set()<br>with open(&#x27;sedziowie.txt&#x27;, encoding=&#x27;utf-8&#x27;) as f:<br>next(f) # header<br>for line in f:<br>nr_lic, imie, nazwisko = line.strip().split(&#x27;\\t&#x27;)<br>sedziowie_all.add(nr_lic)</p>\n<h3>Znajdz sedziow ktorzy sedziowali jakis mecz pucharowy</h3>\n<p>sedziowie_puchar = set()<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>rodzaj = parts[1]<br>nr_lic = parts[4]<br>if rodzaj == &#x27;P&#x27;:<br>sedziowie_puchar.add(nr_lic)</p>\n<h3>Roznica zbiorow: sedziowie BEZ pucharowego meczu Galop</h3>\n<p>bez_pucharu = sedziowie_all - sedziowie_puchar<br>print(len(bez_pucharu)) # 22</p>\n<h4>Sposób 3 - arkusz kalkulacyjny</h4>\n<p><strong>Krok 1:</strong> Wczytaj sedziowie.txt do tabeli A (kolumna A = Nr_licencji).</p>\n<p><strong>Krok 2:</strong> Wczytaj wyniki.txt, filtruj po <code>Rodzaj_meczu = &#x27;P&#x27;</code>, wyciągnij UNIKATOWE wartości Nr_licencji.</p>\n<p><strong>Krok 3:</strong> W kolumnie B obok każdego sędziego: <code>=LICZ.JEŻELI(zakres_pucharowych; A2)</code> - zwraca 0 jeśli sędzia nie sędziował pucharowego.</p>\n<p><strong>Krok 4:</strong> <code>=LICZ.JEŻELI(B:B; 0)</code> = 22.</p>\n<h4>Reference algorytmiczny - różnica zbiorów</h4>\n<blockquote>Reference - operacja &quot;NOT IN&quot; / różnica zbiorów:<br>- <strong>SQL</strong>: <code>WHERE x NOT IN (SELECT )</code> lub <code>LEFT JOIN WHERE IS NULL</code> (anty-join).<br>- <strong>Python</strong>: <code>set_A - set_B</code> zwraca elementy w A, których nie ma w B.<br>- <strong>Złożoność</strong>: O(N) przy użyciu set/hash dla obu zbiorów.<br>- Alternatywa: <code>EXCEPT</code> w SQL (<code>SELECT Nr FROM sedziowie EXCEPT SELECT Nr FROM wyniki WHERE Rodzaj = &#x27;P&#x27;</code>).</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 5.4, max 3 pkt):<br>- <strong>3 pkt</strong> - prawidłowa odpowiedź: <strong>22</strong> (wszyscy sędziowie z pliku którzy nie sędziowali żadnego pucharu Galop).<br>- <strong>2 pkt</strong> - odpowiedź <strong>18</strong> (uwzględniono tylko sędziów, którzy sędziowali jakikolwiek inny mecz Galop Kucykowo, ale nie pucharowy - pominięto 4 sędziów, którzy nie sędziowali w ogóle).<br>- <strong>2 pkt</strong> - odpowiedź <strong>4</strong> (uwzględniono tylko sędziów, którzy nie sędziowali żadnego meczu Galop).<br>- <strong>0 pkt</strong> - inna błędna odpowiedź lub brak.<br>- <strong>UWAGA:</strong> Nie przyznaje się 1 pkt.</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>Pominięcie sędziów którzy w ogóle nie sędziowali</strong> - typowy błąd punktowany 2 pkt zamiast 3. Treść mówi &quot;spośród tych zapisanych w sedziowie.txt&quot;, więc wszyscy sędziowie z tego pliku są w grupie startowej.</li><li><strong>Wymagana DISTINCT</strong> - w wyniki.txt jeden sędzia może sędziować wiele meczów pucharowych. Bez DISTINCT podzapytanie zwróciłoby duplikaty (ale NOT IN i tak by działał poprawnie).</li><li><strong>Pomylenie kierunku</strong> - pytanie o sędziów BEZ pucharu, nie sędziujących pucharowy mecz.</li><li><strong>Filtr <code>Rodzaj_meczu = &#x27;P&#x27;</code></strong> - tylko pucharowe. Mecze T (towarzyskie) i L (ligowe) nie liczą się.</li><li><strong>Cała baza wyniki.txt to mecze Galop Kucykowo</strong> - nie trzeba filtrować po Id_druzyny = Galop (bo Gosia zapisuje tylko swoją drużynę).</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>SQL z NOT IN + DISTINCT: O(N + M) z hash, O(N · M) bez indeksów.</li><li>Python z set: O(N + M).</li><li>Anty-join (LEFT JOIN IS NULL): zwykle szybszy niż NOT IN dla dużych zbiorów.</li></ul>"}]}