{"id":"informatyka-2018-maj-matura-rozszerzona/zad/6.1","paper_id":"informatyka-2018-maj-matura-rozszerzona","number":"6.1","points":2,"ptype":"open","subject":"informatyka","category":"matura","year":2018,"month":"maj","level":"rozszerzona","text":"Zadanie 6. Centrum danych\n\nPewna firma utrzymuje centrum danych, w którym znajduje się kilkaset pracujących komputerów. Specjalny zespół pracowników odpowiada za wykrywanie i usuwanie awarii komputerów. Pliki komputery.txt, awarie.txt oraz naprawy.txt zawierają dane niezbędne do wykonania zadania.\n\n**komputery.txt** - pola: Numer_komputera (unikatowa liczba całkowita), Sekcja (A, B, C, - wielkie litery), Pojemnosc_dysku (w GB).\nPrzykład:\nNumer_komputera | Sekcja | Pojemnosc_dysku\n1 | R | 700\n2 | N | 130\n3 | E | 300\n\n**awarie.txt** - pola: Numer_zgloszenia (unikatowy), Numer_komputera, Czas_awarii (data + godz. + sek.), Priorytet (1-10, jak krytyczna).\nPrzykład:\nNumer_zgloszenia | Numer_komputera | Czas_awarii | Priorytet\n1 | 365 | 2015-01-01 04:40:55 | 8\n2 | 249 | 2015-01-01 06:08:24 | 3\n3 | 312 | 2015-01-01 06:33:43 | 4\n\n**naprawy.txt** - pola: Numer_zgloszenia, Czas_naprawy, Rodzaj (restart/wymiana).\nPrzykład:\nNumer_zgloszenia | Czas_naprawy | Rodzaj\n2 | 2015-01-01 20:08:15 | restart\n7 | 2015-01-02 16:30:15 | restart\n4 | 2015-01-02 19:37:03 | wymiana\n\nDane w wierszach plików są oddzielone znakami tabulacji, pierwszy wiersz pliku jest wierszem nagłówkowym.\n\nZnajdź 10 najczęstszych rodzajów dysków (czyli 10 najczęściej występujących pojemności) wśród komputerów w centrum. Dla każdej ze znalezionych pojemności podaj liczbę komputerów z takim dyskiem. Posortuj zestawienie nierosnąco względem liczby komputerów z dyskiem o danej pojemności.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n| Pojemność [GB] | Liczba komputerów |\n| 300 | 173 |\n| 200 | 31 |\n| 500 | 31 |\n| 800 | 29 |\n| 700 | 28 |\n| 600 | 26 |\n| 400 | 20 |\n| 290 | 11 |\n| 220 | 10 |\n| 160 | 10 |\n\n## Sposób 1 - SQL\n\n```sql\nSELECT Pojemnosc_dysku, COUNT(*) AS liczba\nFROM komputery\nGROUP BY Pojemnosc_dysku\nORDER BY liczba DESC\nLIMIT 10;\n\nKlauzule:\n- `GROUP BY Pojemnosc_dysku` - grupuje po pojemności.\n- `COUNT(*)` - liczy ile komputerów w grupie.\n- `ORDER BY liczba DESC` - sortuje malejąco (nierosnąco).\n- `LIMIT 10` - pierwszych 10.\n\n## Sposób 2 - Python\n\n```python\nfrom collections import Counter\n\nlicznik = Counter()\nwith open('komputery.txt', encoding='utf-8') as f:\nnext(f) # header\nfor linia in f:\ncz = linia.strip().split('\\t')\nif len(cz) >= 3:\npojemnosc = int(cz[2])\nlicznik[pojemnosc] += 1\n\ntop10 = licznik.most_common(10)\nfor pojemnosc, liczba in top10:\nprint(f\"{pojemnosc} GB: {liczba}\")\n\n**Wynik:**\n300 GB: 173\n200 GB: 31\n500 GB: 31\n800 GB: 29\n700 GB: 28\n600 GB: 26\n400 GB: 20\n290 GB: 11\n220 GB: 10\n160 GB: 10\n\n## Sposób 3 - arkusz kalkulacyjny\n\n1. Otwórz komputery.txt (TAB).\n2. **Tabela przestawna**: wiersze = Pojemnosc_dysku, wartości = Licznik Numer_komputera.\n3. Sortuj malejąco wg licznika.\n4. Pierwsze 10 wierszy = wynik.\n\nLub bez tabeli przestawnej:\n- D1: unikatowa lista pojemności (`=USUŃ.DUPLIKATY(C:C)`).\n- E1: `=LICZ.JEŻELI(C:C; D1)`.\n- Sortuj D:E malejąco wg E, weź pierwsze 10.\n\n## Reference informatyczny - agregacja TOP-N\n\n> Reference - TOP-N w SQL:\n> - `ORDER BY x DESC LIMIT n` - standardowe (MySQL, PostgreSQL, SQLite).\n> - `TOP n` w SQL Server: `SELECT TOP 10 `.\n> - `FETCH FIRST n ROWS ONLY` w Oracle/standardzie SQL.\n>\n> Reference - Counter w Pythonie:\n> - `collections.Counter` - specjalny słownik do zliczania.\n> - `.most_common(n)` - zwraca n najczęstszych jako listę krotek.\n> - **Złożoność**: O(N) build, O(k log k) most_common gdzie k = liczba unikalnych.\n>\n> Reference - Tabela przestawna (pivot):\n> - Wiersze: pole grupujące.\n> - Wartości: funkcja agregująca (suma, licznik, średnia).\n> - Idealne do szybkich agregacji bez kodu SQL.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 6.1, max 2 pkt):\n> - **1 pkt** za prawidłowe zestawienie 10 par (pojemność, liczba)\n> - **1 pkt** za prawidłowe sortowanie nierosnące\n> - **0 pkt** - błędne lub brak\n\n## Typowe pułapki\n\n- **\"Nierosnąco\" = malejąco lub równo** - DESC w SQL. Niektórzy uczniowie sortują rosnąco (ASC).\n- **Pominięcie nagłówka** - `next(f)` w Pythonie lub `Readln(f, s)` w Pascal przed pętlą.\n- **Tylko sumy bez nazw** - pytanie wymaga PARY (pojemność, liczba), nie tylko liczby.\n- **Mniej niż 10 wierszy** - jeśli unikalnych pojemności < 10, wystarczy mniej, ale w tym zadaniu jest co najmniej 10.\n- **Pomyłka z konwersją int** - pojemność jako string daje błędne sortowanie (\"100\" < \"200\" leksykograficznie OK, ale \"30\" > \"200\").\n\n## Złożoność obliczeniowa\n\n- Wczytanie ~500 komputerów: O(K).\n- Agregacja: O(K).\n- Sortowanie 10 najczęstszych: O(U log U) gdzie U = liczba unikalnych pojemności.\n- **Łącznie: O(K) ≈ 500 operacji.**","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 2018 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura","text_html":"<p>Zadanie 6. Centrum danych</p>\n<p>Pewna firma utrzymuje centrum danych, w którym znajduje się kilkaset pracujących komputerów. Specjalny zespół pracowników odpowiada za wykrywanie i usuwanie awarii komputerów. Pliki komputery.txt, awarie.txt oraz naprawy.txt zawierają dane niezbędne do wykonania zadania.</p>\n<p><strong>komputery.txt</strong> - pola: Numer_komputera (unikatowa liczba całkowita), Sekcja (A, B, C, - wielkie litery), Pojemnosc_dysku (w GB).<br>Przykład:<br>Numer_komputera | Sekcja | Pojemnosc_dysku<br>1 | R | 700<br>2 | N | 130<br>3 | E | 300</p>\n<p><strong>awarie.txt</strong> - pola: Numer_zgloszenia (unikatowy), Numer_komputera, Czas_awarii (data + godz. + sek.), Priorytet (1-10, jak krytyczna).<br>Przykład:<br>Numer_zgloszenia | Numer_komputera | Czas_awarii | Priorytet<br>1 | 365 | 2015-01-01 04:40:55 | 8<br>2 | 249 | 2015-01-01 06:08:24 | 3<br>3 | 312 | 2015-01-01 06:33:43 | 4</p>\n<p><strong>naprawy.txt</strong> - pola: Numer_zgloszenia, Czas_naprawy, Rodzaj (restart/wymiana).<br>Przykład:<br>Numer_zgloszenia | Czas_naprawy | Rodzaj<br>2 | 2015-01-01 20:08:15 | restart<br>7 | 2015-01-02 16:30:15 | restart<br>4 | 2015-01-02 19:37:03 | wymiana</p>\n<p>Dane w wierszach plików są oddzielone znakami tabulacji, pierwszy wiersz pliku jest wierszem nagłówkowym.</p>\n<p>Znajdź 10 najczęstszych rodzajów dysków (czyli 10 najczęściej występujących pojemności) wśród komputerów w centrum. Dla każdej ze znalezionych pojemności podaj liczbę komputerów z takim dyskiem. Posortuj zestawienie nierosnąco względem liczby komputerów z dyskiem o danej pojemności.</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p>| Pojemność [GB] | Liczba komputerów |<br>| 300 | 173 |<br>| 200 | 31 |<br>| 500 | 31 |<br>| 800 | 29 |<br>| 700 | 28 |<br>| 600 | 26 |<br>| 400 | 20 |<br>| 290 | 11 |<br>| 220 | 10 |<br>| 160 | 10 |</p>\n<h4>Sposób 1 - SQL</h4>\n<p>```sql<br>SELECT Pojemnosc_dysku, COUNT(*) AS liczba<br>FROM komputery<br>GROUP BY Pojemnosc_dysku<br>ORDER BY liczba DESC<br>LIMIT 10;</p>\n<p>Klauzule:</p>\n<ul><li><code>GROUP BY Pojemnosc_dysku</code> - grupuje po pojemności.</li><li><code>COUNT(*)</code> - liczy ile komputerów w grupie.</li><li><code>ORDER BY liczba DESC</code> - sortuje malejąco (nierosnąco).</li><li><code>LIMIT 10</code> - pierwszych 10.</li></ul>\n<h4>Sposób 2 - Python</h4>\n<p>```python<br>from collections import Counter</p>\n<p>licznik = Counter()<br>with open(&#x27;komputery.txt&#x27;, encoding=&#x27;utf-8&#x27;) as f:<br>next(f) # header<br>for linia in f:<br>cz = linia.strip().split(&#x27;\\t&#x27;)<br>if len(cz) &gt;= 3:<br>pojemnosc = int(cz[2])<br>licznik[pojemnosc] += 1</p>\n<p>top10 = licznik.most_common(10)<br>for pojemnosc, liczba in top10:<br>print(f&quot;{pojemnosc} GB: {liczba}&quot;)</p>\n<p><strong>Wynik:</strong><br>300 GB: 173<br>200 GB: 31<br>500 GB: 31<br>800 GB: 29<br>700 GB: 28<br>600 GB: 26<br>400 GB: 20<br>290 GB: 11<br>220 GB: 10<br>160 GB: 10</p>\n<h4>Sposób 3 - arkusz kalkulacyjny</h4>\n<ol><li>Otwórz komputery.txt (TAB).</li><li><strong>Tabela przestawna</strong>: wiersze = Pojemnosc_dysku, wartości = Licznik Numer_komputera.</li><li>Sortuj malejąco wg licznika.</li><li>Pierwsze 10 wierszy = wynik.</li></ol>\n<p>Lub bez tabeli przestawnej:</p>\n<ul><li>D1: unikatowa lista pojemności (<code>=USUŃ.DUPLIKATY(C:C)</code>).</li><li>E1: <code>=LICZ.JEŻELI(C:C; D1)</code>.</li><li>Sortuj D:E malejąco wg E, weź pierwsze 10.</li></ul>\n<h4>Reference informatyczny - agregacja TOP-N</h4>\n<blockquote>Reference - TOP-N w SQL:<br>- <code>ORDER BY x DESC LIMIT n</code> - standardowe (MySQL, PostgreSQL, SQLite).<br>- <code>TOP n</code> w SQL Server: <code>SELECT TOP 10 </code>.<br>- <code>FETCH FIRST n ROWS ONLY</code> w Oracle/standardzie SQL.<br><br>Reference - Counter w Pythonie:<br>- <code>collections.Counter</code> - specjalny słownik do zliczania.<br>- <code>.most_common(n)</code> - zwraca n najczęstszych jako listę krotek.<br>- <strong>Złożoność</strong>: O(N) build, O(k log k) most_common gdzie k = liczba unikalnych.<br><br>Reference - Tabela przestawna (pivot):<br>- Wiersze: pole grupujące.<br>- Wartości: funkcja agregująca (suma, licznik, średnia).<br>- Idealne do szybkich agregacji bez kodu SQL.</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 6.1, max 2 pkt):<br>- <strong>1 pkt</strong> za prawidłowe zestawienie 10 par (pojemność, liczba)<br>- <strong>1 pkt</strong> za prawidłowe sortowanie nierosnące<br>- <strong>0 pkt</strong> - błędne lub brak</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>&quot;Nierosnąco&quot; = malejąco lub równo</strong> - DESC w SQL. Niektórzy uczniowie sortują rosnąco (ASC).</li><li><strong>Pominięcie nagłówka</strong> - <code>next(f)</code> w Pythonie lub <code>Readln(f, s)</code> w Pascal przed pętlą.</li><li><strong>Tylko sumy bez nazw</strong> - pytanie wymaga PARY (pojemność, liczba), nie tylko liczby.</li><li><strong>Mniej niż 10 wierszy</strong> - jeśli unikalnych pojemności &lt; 10, wystarczy mniej, ale w tym zadaniu jest co najmniej 10.</li><li><strong>Pomyłka z konwersją int</strong> - pojemność jako string daje błędne sortowanie (&quot;100&quot; &lt; &quot;200&quot; leksykograficznie OK, ale &quot;30&quot; &gt; &quot;200&quot;).</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>Wczytanie ~500 komputerów: O(K).</li><li>Agregacja: O(K).</li><li>Sortowanie 10 najczęstszych: O(U log U) gdzie U = liczba unikalnych pojemności.</li><li><strong>Łącznie: O(K) ≈ 500 operacji.</strong></li></ul>"}]}