{"id":"informatyka-2018-maj-matura-rozszerzona/zad/6.5","paper_id":"informatyka-2018-maj-matura-rozszerzona","number":"6.5","points":2,"ptype":"open","subject":"informatyka","category":"matura","year":2018,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 6.1.\n\nPodaj liczbę komputerów, które nie uległy żadnej awarii o priorytecie większym lub równym 8 (wliczamy w to też komputery, które w ogóle nie uległy awarii).","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**149 komputerów**\n\n## Sposób 1 - interpretacja\n\n**Cel:** liczba komputerów, które NIE MIAŁY ŻADNEJ awarii z priorytetem ≥ 8.\nInaczej: wszyscy komputerzy MINUS ci, którzy mieli choć jedną awarię z priorytetem ≥ 8.\n\n## Sposób 2 - SQL (NOT EXISTS / NOT IN / LEFT JOIN)\n\n**Wariant 1 - NOT IN:**\n```sql\nSELECT COUNT(*) FROM komputery\nWHERE Numer_komputera NOT IN (\nSELECT DISTINCT Numer_komputera\nFROM awarie\nWHERE Priorytet >= 8\n);\n\n**Wariant 2 - NOT EXISTS:**\n```sql\nSELECT COUNT(*) FROM komputery k\nWHERE NOT EXISTS (\nSELECT 1 FROM awarie a\nWHERE a.Numer_komputera = k.Numer_komputera AND a.Priorytet >= 8\n);\n\n**Wariant 3 - odejmowanie:**\n```sql\nSELECT (SELECT COUNT(*) FROM komputery) -\n(SELECT COUNT(DISTINCT Numer_komputera) FROM awarie WHERE Priorytet >= 8);\n\nWynik: **149**.\n\n## Sposób 3 - Python\n\n```python\nwszyscy = set()\nwith open('komputery.txt', encoding='utf-8') as f:\nnext(f)\nfor linia in f:\ncz = linia.strip().split('\\t')\nif len(cz) >= 1:\nwszyscy.add(cz[0])\n\nz_wysokim = set()\nwith open('awarie.txt', encoding='utf-8') as f:\nnext(f)\nfor linia in f:\ncz = linia.strip().split('\\t')\nif len(cz) >= 4:\nkom, prio = cz[1], int(cz[3])\nif prio >= 8:\nz_wysokim.add(kom)\n\nbez_wysokim = wszyscy - z_wysokim\nprint(len(bez_wysokim)) # 149\n\n## Sposób 4 - arkusz kalkulacyjny\n\n1. awarie.txt: filtruj na priorytet >= 8 → odzyskaj listę unikalnych Numer_komputera.\n2. Policz unikalnych komputerów: powiedzmy X.\n3. Wszyscy komputery: powiedzmy K (~330).\n4. Wynik = K - X.\n\nLub przez SUMA.JEŻELI z warunkiem zawartości w liście awarii.\n\n## Reference informatyczny - antyjoin\n\n> Reference - Trzy sposoby antyjoinu:\n> - **NOT EXISTS** - najbezpieczniejszy z NULLami, najszybszy z indeksem.\n> - **NOT IN** - uważać na NULLe w podzapytaniu (zwraca pustą listę).\n> - **LEFT JOIN + WHERE NULL** - często bardzo wydajny.\n>\n> Reference - Set difference w Pythonie:\n> - `A - B` zwraca elementy w A ale nie w B.\n> - **Złożoność**: O(|A| + |B|).\n> - Bezpieczne, czytelne, idiomatyczne.\n>\n> Reference - Warunek priorytetu:\n> - \"większy lub równy 8\" = `>= 8` = priorytet 8, 9, 10.\n> - \"większy od 8\" = `> 8` = priorytet 9, 10. **Częsta pomyłka** - daje wynik 221.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 6.5, max 2 pkt):\n> - **2 pkt** - wynik **149** (priorytet >= 8)\n> - **1 pkt** - wynik **221** (tylko priorytet > 8, ekskluzywnie)\n> - **0 pkt** - inne błędne lub brak\n\n## Typowe pułapki\n\n- **\"Większy lub równy\" mylone z \"większy\"** - KRYTYCZNA pułapka. >= 8 vs > 8. Wynik 149 vs 221.\n- **Pominięcie komputerów BEZ żadnej awarii** - treść jasno mówi \"wliczamy też tych bez awarii\". NOT IN/NOT EXISTS to zapewnia, ale podejście naiwne (LEFT JOIN na awarie z warunkiem) może je pominąć.\n- **COUNT(DISTINCT)** zamiast set - w SQL konieczne, bo komputer może mieć wiele wysokich awarii.\n- **Pominięcie konwersji int** - `int(cz[3])` w Pythonie, bo string \"10\" < \"8\" leksykograficznie.\n\n## Złożoność obliczeniowa\n\n- Wczytanie 2 plików: O(K + A).\n- Set operations: O(K + A) amortyzowane.\n- **Łącznie: O(K + A).**","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>Kontekst - patrz zadanie 6.1.</p>\n<p>Podaj liczbę komputerów, które nie uległy żadnej awarii o priorytecie większym lub równym 8 (wliczamy w to też komputery, które w ogóle nie uległy awarii).</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p><strong>149 komputerów</strong></p>\n<h4>Sposób 1 - interpretacja</h4>\n<p><strong>Cel:</strong> liczba komputerów, które NIE MIAŁY ŻADNEJ awarii z priorytetem ≥ 8.<br>Inaczej: wszyscy komputerzy MINUS ci, którzy mieli choć jedną awarię z priorytetem ≥ 8.</p>\n<h4>Sposób 2 - SQL (NOT EXISTS / NOT IN / LEFT JOIN)</h4>\n<p><strong>Wariant 1 - NOT IN:</strong><br>```sql<br>SELECT COUNT(*) FROM komputery<br>WHERE Numer_komputera NOT IN (<br>SELECT DISTINCT Numer_komputera<br>FROM awarie<br>WHERE Priorytet &gt;= 8<br>);</p>\n<p><strong>Wariant 2 - NOT EXISTS:</strong><br>```sql<br>SELECT COUNT(*) FROM komputery k<br>WHERE NOT EXISTS (<br>SELECT 1 FROM awarie a<br>WHERE a.Numer_komputera = k.Numer_komputera AND a.Priorytet &gt;= 8<br>);</p>\n<p><strong>Wariant 3 - odejmowanie:</strong><br>```sql<br>SELECT (SELECT COUNT(*) FROM komputery) -<br>(SELECT COUNT(DISTINCT Numer_komputera) FROM awarie WHERE Priorytet &gt;= 8);</p>\n<p>Wynik: <strong>149</strong>.</p>\n<h4>Sposób 3 - Python</h4>\n<p>```python<br>wszyscy = set()<br>with open(&#x27;komputery.txt&#x27;, encoding=&#x27;utf-8&#x27;) as f:<br>next(f)<br>for linia in f:<br>cz = linia.strip().split(&#x27;\\t&#x27;)<br>if len(cz) &gt;= 1:<br>wszyscy.add(cz[0])</p>\n<p>z_wysokim = set()<br>with open(&#x27;awarie.txt&#x27;, encoding=&#x27;utf-8&#x27;) as f:<br>next(f)<br>for linia in f:<br>cz = linia.strip().split(&#x27;\\t&#x27;)<br>if len(cz) &gt;= 4:<br>kom, prio = cz[1], int(cz[3])<br>if prio &gt;= 8:<br>z_wysokim.add(kom)</p>\n<p>bez_wysokim = wszyscy - z_wysokim<br>print(len(bez_wysokim)) # 149</p>\n<h4>Sposób 4 - arkusz kalkulacyjny</h4>\n<ol><li>awarie.txt: filtruj na priorytet &gt;= 8 → odzyskaj listę unikalnych Numer_komputera.</li><li>Policz unikalnych komputerów: powiedzmy X.</li><li>Wszyscy komputery: powiedzmy K (~330).</li><li>Wynik = K - X.</li></ol>\n<p>Lub przez SUMA.JEŻELI z warunkiem zawartości w liście awarii.</p>\n<h4>Reference informatyczny - antyjoin</h4>\n<blockquote>Reference - Trzy sposoby antyjoinu:<br>- <strong>NOT EXISTS</strong> - najbezpieczniejszy z NULLami, najszybszy z indeksem.<br>- <strong>NOT IN</strong> - uważać na NULLe w podzapytaniu (zwraca pustą listę).<br>- <strong>LEFT JOIN + WHERE NULL</strong> - często bardzo wydajny.<br><br>Reference - Set difference w Pythonie:<br>- <code>A - B</code> zwraca elementy w A ale nie w B.<br>- <strong>Złożoność</strong>: O(|A| + |B|).<br>- Bezpieczne, czytelne, idiomatyczne.<br><br>Reference - Warunek priorytetu:<br>- &quot;większy lub równy 8&quot; = <code>&gt;= 8</code> = priorytet 8, 9, 10.<br>- &quot;większy od 8&quot; = <code>&gt; 8</code> = priorytet 9, 10. <strong>Częsta pomyłka</strong> - daje wynik 221.</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 6.5, max 2 pkt):<br>- <strong>2 pkt</strong> - wynik <strong>149</strong> (priorytet &gt;= 8)<br>- <strong>1 pkt</strong> - wynik <strong>221</strong> (tylko priorytet &gt; 8, ekskluzywnie)<br>- <strong>0 pkt</strong> - inne błędne lub brak</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>&quot;Większy lub równy&quot; mylone z &quot;większy&quot;</strong> - KRYTYCZNA pułapka. &gt;= 8 vs &gt; 8. Wynik 149 vs 221.</li><li><strong>Pominięcie komputerów BEZ żadnej awarii</strong> - treść jasno mówi &quot;wliczamy też tych bez awarii&quot;. NOT IN/NOT EXISTS to zapewnia, ale podejście naiwne (LEFT JOIN na awarie z warunkiem) może je pominąć.</li><li><strong>COUNT(DISTINCT)</strong> zamiast set - w SQL konieczne, bo komputer może mieć wiele wysokich awarii.</li><li><strong>Pominięcie konwersji int</strong> - <code>int(cz[3])</code> w Pythonie, bo string &quot;10&quot; &lt; &quot;8&quot; leksykograficznie.</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>Wczytanie 2 plików: O(K + A).</li><li>Set operations: O(K + A) amortyzowane.</li><li><strong>Łącznie: O(K + A).</strong></li></ul>"}]}