{"id":"informatyka-2015-maj-matura-rozszerzona/zad/6.4","paper_id":"informatyka-2015-maj-matura-rozszerzona","number":"6.4","points":3,"ptype":"open","subject":"informatyka","category":"matura","year":2015,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 6.1.\n\nDla każdego kraju, którego reprezentanci zdobywali punkty w sezonie 2012, podaj liczbę tych reprezentantów.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n| Kraj | Liczba zawodników |\n| Australia | 2 |\n| Brazylia | 2 |\n| Finlandia | 1 |\n| Francja | 2 |\n| Hiszpania | 1 |\n| Japonia | 1 |\n| Meksyk | 1 |\n| Niemcy | 4 |\n| Wenezuela | 1 |\n| Wielka Brytania | 3 |\n\nŁącznie 10 krajów, 18 punktujących kierowców w sezonie 2012.\n\n## Sposób 1 - SQL (DISTINCT + GROUP BY + filtr Punkty > 0)\n\nKluczowa idea: liczyć tylko tych kierowców, którzy ZDOBYWALI punkty w 2012, nie wszystkich kierowców z kraju.\n\n```sql\nSELECT k.Kraj, COUNT(DISTINCT k.Id_kierowcy) AS LiczbaZawodnikow\nFROM Kierowcy k\nINNER JOIN Wyniki wn ON k.Id_kierowcy = wn.Id_kierowcy\nINNER JOIN Wyscigi w ON wn.Id_wyscigu = w.Id_wyscigu\nWHERE w.Rok = 2012 AND wn.Punkty > 0\nGROUP BY k.Kraj\nORDER BY k.Kraj;\n\n**Wynik:**\nAustralia 2\nBrazylia 2\nFinlandia 1\nFrancja 2\nHiszpania 1\nJaponia 1\nMeksyk 1\nNiemcy 4\nWenezuela 1\nWielka Brytania 3\n\n## Sposób 2 - Python (pandas)\n\n```python\nimport pandas as pd\n\nkierowcy = pd.read_csv('Kierowcy.txt', sep=';', header=None,\nnames=['Id_k', 'Nazwisko', 'Imie', 'Kraj'])\nwyscigi = pd.read_csv('Wyscigi.txt', sep=';', header=None,\nnames=['Id_w', 'Rok', 'GrandPrix'])\nwyniki = pd.read_csv('Wyniki.txt', sep=';', header=None,\nnames=['Id_k', 'Punkty', 'Id_w'])\n\n# Filtr: rok 2012 i punkty > 0\nw2012 = wyniki.merge(wyscigi, on='Id_w')\nw2012 = w2012[(w2012['Rok'] == 2012) & (w2012['Punkty'] > 0)]\n\n# Unikalne ID kierowcow w 2012\nid_punktujacych = w2012['Id_k'].unique()\nkierowcy_2012 = kierowcy[kierowcy['Id_k'].isin(id_punktujacych)]\n\n# Liczba unikalnych kierowcow per kraj\nwynik = kierowcy_2012.groupby('Kraj')['Id_k'].nunique().sort_index()\nprint(wynik)\n\n## Sposób 3 - arkusz kalkulacyjny\n\n**Krok 1:** Wczytaj 3 pliki. Połącz Wyniki + Wyscigi po Id_w (dodaj kolumnę Rok).\n\n**Krok 2:** Filtruj: Rok = 2012 i Punkty > 0.\n\n**Krok 3:** Usuń duplikaty po Id_kierowcy (pozostawiamy każdego kierowcę raz).\n\n**Krok 4:** Dodaj kolumnę Kraj przez WYSZUKAJ.PIONOWO po Id_k.\n\n**Krok 5:** Tabela przestawna: Wiersze = Kraj, Wartości = LICZ(Id_k).\n\n## Reference informatyczny - DISTINCT + GROUP BY\n\n> Reference - Liczenie unikalnych w grupach:\n> - **COUNT(DISTINCT kol)** - liczy unikalne wartości w grupie (kluczowe, bo jeden kierowca może mieć kilka wyników w 2012).\n> - **WHERE Punkty > 0** - filtruje wyniki PRZED grupowaniem (ważne: zadanie mówi \"zdobywali punkty\", więc Punkty = 0 nie liczy się).\n> - Bez DISTINCT zliczalibyśmy liczbę punktujących WYNIKÓW per kraj, a nie liczbę kierowców.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 6.4, max 3 pkt):\n> - **3 pkt** - poprawne zestawienie wszystkich odpowiedzi (10 krajów z prawidłowymi liczbami zawodników).\n> - **1 pkt** - zestawienie z błędnym grupowaniem (zliczenie WSZYSTKICH kierowców kraju, nie tylko punktujących w 2012).\n> - **0 pkt** - odpowiedź niepełna lub błędna albo brak.\n> - **UWAGA:** Nie przyznaje się 2 pkt.\n\n## Typowe pułapki\n\n- **\"Zdobywali punkty\" = Punkty > 0** - krytyczny warunek. Pominięcie tego filtra to typowy błąd punktowany 1 pkt zamiast 3.\n- **DISTINCT obowiązkowe** - bez niego liczymy wyniki, nie kierowców. Jeden kierowca może mieć 5+ punktujących wyników w 2012.\n- **Filtr sezonu 2012** - bez tego filtra otrzymujemy wszystkich punktujących kierowców z całych 13 sezonów.\n- **Polskie nazwy krajów** - zachowaj pisownię z pliku (Wielka Brytania z dużej, nie \"Wlk. Brytania\").\n- **Sortowanie alfabetyczne** - zalecane (`ORDER BY k.Kraj`), choć nie wymagane.\n\n## Złożoność obliczeniowa\n\n- 2 JOIN-y po kluczach: O(N log N) z indeksami.\n- GROUP BY z DISTINCT (hash set): O(N).\n- ORDER BY: O(K log K), gdzie K = liczba krajów (małe).\n- **Całkowita: O(N log N)**.","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 2015 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura","text_html":"<p>Kontekst - patrz zadanie 6.1.</p>\n<p>Dla każdego kraju, którego reprezentanci zdobywali punkty w sezonie 2012, podaj liczbę tych reprezentantów.</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p>| Kraj | Liczba zawodników |<br>| Australia | 2 |<br>| Brazylia | 2 |<br>| Finlandia | 1 |<br>| Francja | 2 |<br>| Hiszpania | 1 |<br>| Japonia | 1 |<br>| Meksyk | 1 |<br>| Niemcy | 4 |<br>| Wenezuela | 1 |<br>| Wielka Brytania | 3 |</p>\n<p>Łącznie 10 krajów, 18 punktujących kierowców w sezonie 2012.</p>\n<h4>Sposób 1 - SQL (DISTINCT + GROUP BY + filtr Punkty &gt; 0)</h4>\n<p>Kluczowa idea: liczyć tylko tych kierowców, którzy ZDOBYWALI punkty w 2012, nie wszystkich kierowców z kraju.</p>\n<p>```sql<br>SELECT k.Kraj, COUNT(DISTINCT k.Id_kierowcy) AS LiczbaZawodnikow<br>FROM Kierowcy k<br>INNER JOIN Wyniki wn ON k.Id_kierowcy = wn.Id_kierowcy<br>INNER JOIN Wyscigi w ON wn.Id_wyscigu = w.Id_wyscigu<br>WHERE w.Rok = 2012 AND wn.Punkty &gt; 0<br>GROUP BY k.Kraj<br>ORDER BY k.Kraj;</p>\n<p><strong>Wynik:</strong><br>Australia 2<br>Brazylia 2<br>Finlandia 1<br>Francja 2<br>Hiszpania 1<br>Japonia 1<br>Meksyk 1<br>Niemcy 4<br>Wenezuela 1<br>Wielka Brytania 3</p>\n<h4>Sposób 2 - Python (pandas)</h4>\n<p>```python<br>import pandas as pd</p>\n<p>kierowcy = pd.read_csv(&#x27;Kierowcy.txt&#x27;, sep=&#x27;;&#x27;, header=None,<br>names=[&#x27;Id_k&#x27;, &#x27;Nazwisko&#x27;, &#x27;Imie&#x27;, &#x27;Kraj&#x27;])<br>wyscigi = pd.read_csv(&#x27;Wyscigi.txt&#x27;, sep=&#x27;;&#x27;, header=None,<br>names=[&#x27;Id_w&#x27;, &#x27;Rok&#x27;, &#x27;GrandPrix&#x27;])<br>wyniki = pd.read_csv(&#x27;Wyniki.txt&#x27;, sep=&#x27;;&#x27;, header=None,<br>names=[&#x27;Id_k&#x27;, &#x27;Punkty&#x27;, &#x27;Id_w&#x27;])</p>\n<h3>Filtr: rok 2012 i punkty &gt; 0</h3>\n<p>w2012 = wyniki.merge(wyscigi, on=&#x27;Id_w&#x27;)<br>w2012 = w2012[(w2012[&#x27;Rok&#x27;] == 2012) &amp; (w2012[&#x27;Punkty&#x27;] &gt; 0)]</p>\n<h3>Unikalne ID kierowcow w 2012</h3>\n<p>id_punktujacych = w2012[&#x27;Id_k&#x27;].unique()<br>kierowcy_2012 = kierowcy[kierowcy[&#x27;Id_k&#x27;].isin(id_punktujacych)]</p>\n<h3>Liczba unikalnych kierowcow per kraj</h3>\n<p>wynik = kierowcy_2012.groupby(&#x27;Kraj&#x27;)[&#x27;Id_k&#x27;].nunique().sort_index()<br>print(wynik)</p>\n<h4>Sposób 3 - arkusz kalkulacyjny</h4>\n<p><strong>Krok 1:</strong> Wczytaj 3 pliki. Połącz Wyniki + Wyscigi po Id_w (dodaj kolumnę Rok).</p>\n<p><strong>Krok 2:</strong> Filtruj: Rok = 2012 i Punkty &gt; 0.</p>\n<p><strong>Krok 3:</strong> Usuń duplikaty po Id_kierowcy (pozostawiamy każdego kierowcę raz).</p>\n<p><strong>Krok 4:</strong> Dodaj kolumnę Kraj przez WYSZUKAJ.PIONOWO po Id_k.</p>\n<p><strong>Krok 5:</strong> Tabela przestawna: Wiersze = Kraj, Wartości = LICZ(Id_k).</p>\n<h4>Reference informatyczny - DISTINCT + GROUP BY</h4>\n<blockquote>Reference - Liczenie unikalnych w grupach:<br>- <strong>COUNT(DISTINCT kol)</strong> - liczy unikalne wartości w grupie (kluczowe, bo jeden kierowca może mieć kilka wyników w 2012).<br>- <strong>WHERE Punkty &gt; 0</strong> - filtruje wyniki PRZED grupowaniem (ważne: zadanie mówi &quot;zdobywali punkty&quot;, więc Punkty = 0 nie liczy się).<br>- Bez DISTINCT zliczalibyśmy liczbę punktujących WYNIKÓW per kraj, a nie liczbę kierowców.</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 6.4, max 3 pkt):<br>- <strong>3 pkt</strong> - poprawne zestawienie wszystkich odpowiedzi (10 krajów z prawidłowymi liczbami zawodników).<br>- <strong>1 pkt</strong> - zestawienie z błędnym grupowaniem (zliczenie WSZYSTKICH kierowców kraju, nie tylko punktujących w 2012).<br>- <strong>0 pkt</strong> - odpowiedź niepełna lub błędna albo brak.<br>- <strong>UWAGA:</strong> Nie przyznaje się 2 pkt.</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>&quot;Zdobywali punkty&quot; = Punkty &gt; 0</strong> - krytyczny warunek. Pominięcie tego filtra to typowy błąd punktowany 1 pkt zamiast 3.</li><li><strong>DISTINCT obowiązkowe</strong> - bez niego liczymy wyniki, nie kierowców. Jeden kierowca może mieć 5+ punktujących wyników w 2012.</li><li><strong>Filtr sezonu 2012</strong> - bez tego filtra otrzymujemy wszystkich punktujących kierowców z całych 13 sezonów.</li><li><strong>Polskie nazwy krajów</strong> - zachowaj pisownię z pliku (Wielka Brytania z dużej, nie &quot;Wlk. Brytania&quot;).</li><li><strong>Sortowanie alfabetyczne</strong> - zalecane (<code>ORDER BY k.Kraj</code>), choć nie wymagane.</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>2 JOIN-y po kluczach: O(N log N) z indeksami.</li><li>GROUP BY z DISTINCT (hash set): O(N).</li><li>ORDER BY: O(K log K), gdzie K = liczba krajów (małe).</li><li><strong>Całkowita: O(N log N)</strong>.</li></ul>"}]}