{"id":"informatyka-2018-maj-matura-rozszerzona/zad/4.2","paper_id":"informatyka-2018-maj-matura-rozszerzona","number":"4.2","points":4,"ptype":"open","subject":"informatyka","category":"matura","year":2018,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 4.1.\n\nZnajdź słowo, w którym występuje największa liczba **różnych** liter. Wypisz to słowo i liczbę występujących w nim różnych liter. Jeśli słów o największej liczbie różnych liter jest więcej niż jedno, wypisz pierwsze z nich pojawiające się w pliku z danymi.\n\nDla danych z pliku przyklad.txt wynikiem jest:\nAKLMNOPRSTWZA 12","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**Słowo:** `SUOLDQWISCDRFLRWHZBNTMIAPHALMNCWHVGMXOZSQNXWXSFELZVTUTILXWKCTYBQYSUAKNYJKRXDJQYHXAQGWN`\n\n**Liczba różnych liter:** **26**\n\n## Sposób 1 - zliczanie unikalnych liter w słowie\n\n**Idea:** dla każdego słowa zlicz **różne** litery (np. używając zbioru). Znajdź słowo z maksymalną liczbą. Przy remisie wybieramy PIERWSZE w kolejności.\n\n**Klucz:** liczba unikalnych liter ≤ 26 (alfabet angielski). Tu maksimum to **26** - słowo zawierające KAŻDĄ literę alfabetu (pangram!).\n\n## Sposób 2 - implementacja Python\n\n```python\nnajlepsze_slowo = \"\"\nmax_roznych = 0\n\nwith open('sygnaly.txt', encoding='utf-8') as f:\nfor linia in f:\ns = linia.strip()\nif not s:\ncontinue\nrozne = len(set(s)) # set automatycznie usuwa duplikaty\nif rozne > max_roznych:\nmax_roznych = rozne\nnajlepsze_slowo = s\n\nprint(f\"4.2 {najlepsze_slowo} {max_roznych}\")\n# 4.2 SUOLDQWISCDRFLRWHZBNTMIAPHALMNCWHVGMXOZSQNXWXSFELZVTUTILXWKCTYBQYSUAKNYJKRXDJQYHXAQGWN 26\n\n## Sposób 3 - C++\n\n```cpp\n#include <iostream>\n#include <fstream>\n#include <string>\n#include <set>\nusing namespace std;\n\nint policzRozne(const string& s) {\nset<char> znaki(s.begin(), s.end());\nreturn znaki.size();\n}\n\nint main() {\nifstream f(\"sygnaly.txt\");\nstring s, najlepsze;\nint maxRoznych = 0;\nwhile (f >> s) {\nint r = policzRozne(s);\nif (r > maxRoznych) {\nmaxRoznych = r;\nnajlepsze = s;\n}\n}\ncout << \"4.2 \" << najlepsze << \" \" << maxRoznych << endl;\nreturn 0;\n}\n\n## Sposób 4 - Pascal (z tablicą boolowską)\n\n```pascal\nprogram Wega42;\nvar f: TextFile; s, najlepsze: String;\nmaxR, r, i: Integer; uzyte: array['A' 'Z'] of Boolean;\nch: Char;\nbegin\nAssignFile(f, 'sygnaly.txt'); Reset(f);\nmaxR := 0;\nnajlepsze := '';\nwhile not Eof(f) do begin\nReadln(f, s);\nif Length(s) = 0 then Continue;\nfor ch := 'A' to 'Z' do uzyte[ch] := False;\nfor i := 1 to Length(s) do uzyte[s[i]] := True;\nr := 0;\nfor ch := 'A' to 'Z' do if uzyte[ch] then r := r + 1;\nif r > maxR then begin\nmaxR := r;\nnajlepsze := s;\nend;\nend;\nCloseFile(f);\nWriteln('4.2 ', najlepsze, ' ', maxR);\nend.\n\n## Reference informatyczny - zbiory i unikalność\n\n> Reference - Liczenie unikalnych elementów:\n> - **Python**: `set(iterable)` - automatyczna deduplikacja. `len(set(s))` to liczba unikalnych elementów.\n> - **C++**: `std::set<char>` - uporządkowany zbiór; `std::unordered_set<char>` - hash-based, szybszy.\n> - **Pascal**: tablica boolowska `array['A' 'Z'] of Boolean` lub typ `set of Char`.\n> - **Złożoność**: O(L) na słowo, gdzie L = długość słowa.\n>\n> Reference - Pangram:\n> - **Pangram** = tekst zawierający każdą literę alfabetu co najmniej raz.\n> - Polski klasyk: \"Pchnąć w tę łódź jeża lub ośm skrzyń fig.\"\n> - Angielski klasyk: \"The quick brown fox jumps over the lazy dog.\"\n> - W tym zadaniu szukamy słowa-pangramu (lub przybliżającego pangram).\n>\n> Reference - Tie-breaking (remisy):\n> - \"Pierwsze pojawiające się\" → używamy ostrego `>` (NIE `>=`) przy aktualizacji.\n> - Wtedy zmienna `najlepsze` aktualizuje się TYLKO gdy znajdziemy BARDZIEJ unikalne słowo.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 4.2, max 4 pkt):\n> - **4 pkt** - prawidłowe słowo + liczba 26\n> - **2 pkt** - tylko prawidłowe słowo (bez liczby) lub odwrotnie\n> - **0 pkt** - błędne lub brak\n>\n> **Uwaga: NIE PRZYZNAJE SIĘ 3 ani 1 PUNKTU.**\n\n## Typowe pułapki\n\n- **Liczenie wszystkich liter** zamiast unikalnych - wtedy długie słowo wygrywa nawet z powtórzeniami. Trzeba `len(set(s))`, NIE `len(s)`.\n- **Operator `>=` zamiast `>`** - wtedy przy remisie wygra OSTATNIE napotkane, a powinniśmy PIERWSZE.\n- **Liczenie liter razem ze spacjami/newline** - `s.strip()` przed liczeniem.\n- **Pomylenie litery z bajtem** - w UTF-8 polski znak może mieć więcej bajtów. Tu jest tylko angielski A-Z, więc nie problem.\n- **Sortowanie liter** - niepotrzebne; zbiór automatycznie deduplikuje.\n\n## Złożoność obliczeniowa\n\n- Dla 1000 słów × max 100 znaków: **O(N · L)** = O(100 000) operacji.\n- Pamięć: O(26) (zbiór liter angielskich) per słowo.","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 4.1.</p>\n<p>Znajdź słowo, w którym występuje największa liczba <strong>różnych</strong> liter. Wypisz to słowo i liczbę występujących w nim różnych liter. Jeśli słów o największej liczbie różnych liter jest więcej niż jedno, wypisz pierwsze z nich pojawiające się w pliku z danymi.</p>\n<p>Dla danych z pliku przyklad.txt wynikiem jest:<br>AKLMNOPRSTWZA 12</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p><strong>Słowo:</strong> <code>SUOLDQWISCDRFLRWHZBNTMIAPHALMNCWHVGMXOZSQNXWXSFELZVTUTILXWKCTYBQYSUAKNYJKRXDJQYHXAQGWN</code></p>\n<p><strong>Liczba różnych liter:</strong> <strong>26</strong></p>\n<h4>Sposób 1 - zliczanie unikalnych liter w słowie</h4>\n<p><strong>Idea:</strong> dla każdego słowa zlicz <strong>różne</strong> litery (np. używając zbioru). Znajdź słowo z maksymalną liczbą. Przy remisie wybieramy PIERWSZE w kolejności.</p>\n<p><strong>Klucz:</strong> liczba unikalnych liter ≤ 26 (alfabet angielski). Tu maksimum to <strong>26</strong> - słowo zawierające KAŻDĄ literę alfabetu (pangram!).</p>\n<h4>Sposób 2 - implementacja Python</h4>\n<p>```python<br>najlepsze_slowo = &quot;&quot;<br>max_roznych = 0</p>\n<p>with open(&#x27;sygnaly.txt&#x27;, encoding=&#x27;utf-8&#x27;) as f:<br>for linia in f:<br>s = linia.strip()<br>if not s:<br>continue<br>rozne = len(set(s)) # set automatycznie usuwa duplikaty<br>if rozne &gt; max_roznych:<br>max_roznych = rozne<br>najlepsze_slowo = s</p>\n<p>print(f&quot;4.2 {najlepsze_slowo} {max_roznych}&quot;)</p>\n<h3>4.2 SUOLDQWISCDRFLRWHZBNTMIAPHALMNCWHVGMXOZSQNXWXSFELZVTUTILXWKCTYBQYSUAKNYJKRXDJQYHXAQGWN 26</h3>\n<h4>Sposób 3 - C++</h4>\n<p>```cpp<br>#include &lt;iostream&gt;<br>#include &lt;fstream&gt;<br>#include &lt;string&gt;<br>#include &lt;set&gt;<br>using namespace std;</p>\n<p>int policzRozne(const string&amp; s) {<br>set&lt;char&gt; znaki(s.begin(), s.end());<br>return znaki.size();<br>}</p>\n<p>int main() {<br>ifstream f(&quot;sygnaly.txt&quot;);<br>string s, najlepsze;<br>int maxRoznych = 0;<br>while (f &gt;&gt; s) {<br>int r = policzRozne(s);<br>if (r &gt; maxRoznych) {<br>maxRoznych = r;<br>najlepsze = s;<br>}<br>}<br>cout &lt;&lt; &quot;4.2 &quot; &lt;&lt; najlepsze &lt;&lt; &quot; &quot; &lt;&lt; maxRoznych &lt;&lt; endl;<br>return 0;<br>}</p>\n<h4>Sposób 4 - Pascal (z tablicą boolowską)</h4>\n<p>```pascal<br>program Wega42;<br>var f: TextFile; s, najlepsze: String;<br>maxR, r, i: Integer; uzyte: array[&#x27;A&#x27; &#x27;Z&#x27;] of Boolean;<br>ch: Char;<br>begin<br>AssignFile(f, &#x27;sygnaly.txt&#x27;); Reset(f);<br>maxR := 0;<br>najlepsze := &#x27;&#x27;;<br>while not Eof(f) do begin<br>Readln(f, s);<br>if Length(s) = 0 then Continue;<br>for ch := &#x27;A&#x27; to &#x27;Z&#x27; do uzyte[ch] := False;<br>for i := 1 to Length(s) do uzyte[s[i]] := True;<br>r := 0;<br>for ch := &#x27;A&#x27; to &#x27;Z&#x27; do if uzyte[ch] then r := r + 1;<br>if r &gt; maxR then begin<br>maxR := r;<br>najlepsze := s;<br>end;<br>end;<br>CloseFile(f);<br>Writeln(&#x27;4.2 &#x27;, najlepsze, &#x27; &#x27;, maxR);<br>end.</p>\n<h4>Reference informatyczny - zbiory i unikalność</h4>\n<blockquote>Reference - Liczenie unikalnych elementów:<br>- <strong>Python</strong>: <code>set(iterable)</code> - automatyczna deduplikacja. <code>len(set(s))</code> to liczba unikalnych elementów.<br>- <strong>C++</strong>: <code>std::set&lt;char&gt;</code> - uporządkowany zbiór; <code>std::unordered_set&lt;char&gt;</code> - hash-based, szybszy.<br>- <strong>Pascal</strong>: tablica boolowska <code>array[&#x27;A&#x27; &#x27;Z&#x27;] of Boolean</code> lub typ <code>set of Char</code>.<br>- <strong>Złożoność</strong>: O(L) na słowo, gdzie L = długość słowa.<br><br>Reference - Pangram:<br>- <strong>Pangram</strong> = tekst zawierający każdą literę alfabetu co najmniej raz.<br>- Polski klasyk: &quot;Pchnąć w tę łódź jeża lub ośm skrzyń fig.&quot;<br>- Angielski klasyk: &quot;The quick brown fox jumps over the lazy dog.&quot;<br>- W tym zadaniu szukamy słowa-pangramu (lub przybliżającego pangram).<br><br>Reference - Tie-breaking (remisy):<br>- &quot;Pierwsze pojawiające się&quot; → używamy ostrego <code>&gt;</code> (NIE <code>&gt;=</code>) przy aktualizacji.<br>- Wtedy zmienna <code>najlepsze</code> aktualizuje się TYLKO gdy znajdziemy BARDZIEJ unikalne słowo.</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 4.2, max 4 pkt):<br>- <strong>4 pkt</strong> - prawidłowe słowo + liczba 26<br>- <strong>2 pkt</strong> - tylko prawidłowe słowo (bez liczby) lub odwrotnie<br>- <strong>0 pkt</strong> - błędne lub brak<br><br><strong>Uwaga: NIE PRZYZNAJE SIĘ 3 ani 1 PUNKTU.</strong></blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>Liczenie wszystkich liter</strong> zamiast unikalnych - wtedy długie słowo wygrywa nawet z powtórzeniami. Trzeba <code>len(set(s))</code>, NIE <code>len(s)</code>.</li><li><strong>Operator <code>&gt;=</code> zamiast <code>&gt;</code></strong> - wtedy przy remisie wygra OSTATNIE napotkane, a powinniśmy PIERWSZE.</li><li><strong>Liczenie liter razem ze spacjami/newline</strong> - <code>s.strip()</code> przed liczeniem.</li><li><strong>Pomylenie litery z bajtem</strong> - w UTF-8 polski znak może mieć więcej bajtów. Tu jest tylko angielski A-Z, więc nie problem.</li><li><strong>Sortowanie liter</strong> - niepotrzebne; zbiór automatycznie deduplikuje.</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>Dla 1000 słów × max 100 znaków: <strong>O(N · L)</strong> = O(100 000) operacji.</li><li>Pamięć: O(26) (zbiór liter angielskich) per słowo.</li></ul>"}]}