{"id":"informatyka-2018-maj-matura-rozszerzona/zad/4.3","paper_id":"informatyka-2018-maj-matura-rozszerzona","number":"4.3","points":4,"ptype":"open","subject":"informatyka","category":"matura","year":2018,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 4.1.\n\nNa przykład CGECF jest takim słowem, ale ABEZA nie jest (odległość A - Z wynosi 25).\n\nW tym zadaniu rozważmy odległość liter w alfabecie - np. litery A i B są od siebie oddalone o 1, A i E o 4, F i D o 2, a każda litera od siebie samej jest oddalona o 0. Wypisz wszystkie słowa, w których każde dwie litery oddalone są od siebie w alfabecie co najwyżej o 10. Słowa wypisz w kolejności występowania w pliku sygnaly.txt, po jednym w wierszu.\n\nDla danych z pliku przyklad.txt wynikiem jest 15 słów: AAAAAAAAAI, AAAAAAAAAE, AAAAAAAAAC, AAAAAAAAAH, AAAAAAAAAC, AAAAAAAAAI, AAAAAAAAAA, BB, AAAAAAAAAA, AAAAAAAAAA, AAAAAAAAAB, AAAAAAAAAE, AAAAAAAAAD, AAAAAAAAAI, AAAAAAAAAE.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**Lista słów** (przykładowe pierwsze z sygnaly.txt):\nQQMLKKQNOHPKKPJOLHIPJKLKQIIHQHPNKNQPHNKLKQNIMLQPNLPMHNNIPNJJONQOHHKKQOIHOHHJMOJPMNIPIKION, OO, FH, AE, (cała lista to słowa spełniające warunek max odległość 10 między KAŻDYMI dwiema literami).\n\n## Sposób 1 - kluczowa interpretacja zadania\n\n**UWAGA - kluczowy detal:** warunek dotyczy **KAŻDEJ PARY liter w słowie**, nie tylko sąsiadów!\n\nDla słowa s, warunek: dla każdego i, j: `|s[i] - s[j]| ≤ 10`.\n\nTo równoważne: `max(s) - min(s) ≤ 10` (różnica między największą a najmniejszą literą).\n\n**Przykład:** `ABEZA`:\n- min = A, max = Z, różnica = 25. **NIE spełnia** warunku (25 > 10).\n- Mimo że sąsiednie litery są blisko siebie (np. A-B, B-E, E-Z=21, Z-A=25), to KAŻDE dwie litery muszą się różnić ≤ 10.\n\n**Przykład:** `CGECF`:\n- min = C, max = G, różnica = 4. **Spełnia** (4 ≤ 10).\n\n## Sposób 2 - implementacja Python\n\n```python\nwyniki = []\nwith open('sygnaly.txt', encoding='utf-8') as f:\nfor linia in f:\ns = linia.strip()\nif not s:\ncontinue\n# Warunek: max(s) - min(s) <= 10\nif ord(max(s)) - ord(min(s)) <= 10:\nwyniki.append(s)\n\nwith open('wyniki4.txt', 'a', encoding='utf-8') as f:\nf.write(\"4.3\\n\")\nfor s in wyniki:\nf.write(s + '\\n')\n\nprint(f\"Liczba słów: {len(wyniki)}\")\nprint(\"Pierwsze 5:\")\nfor s in wyniki[:5]:\nprint(s)\n\n## Sposób 3 - C++\n\n```cpp\n#include <iostream>\n#include <fstream>\n#include <string>\n#include <algorithm>\nusing namespace std;\n\nbool sprawdz(const string& s) {\nif (s.empty()) return false;\nchar min_c = *min_element(s.begin(), s.end());\nchar max_c = *max_element(s.begin(), s.end());\nreturn (max_c - min_c) <= 10;\n}\n\nint main() {\nifstream fin(\"sygnaly.txt\");\nofstream fout(\"wyniki4.txt\", ios::app);\nfout << \"4.3\\n\";\nstring s;\nwhile (fin >> s) {\nif (sprawdz(s)) fout << s << \"\\n\";\n}\nreturn 0;\n}\n\n## Sposób 4 - Pascal\n\n```pascal\nprogram Wega43;\nvar fin, fout: TextFile; s: String;\ni: Integer; minC, maxC: Char;\nbegin\nAssignFile(fin, 'sygnaly.txt'); Reset(fin);\nAssignFile(fout, 'wyniki4.txt'); Append(fout);\nWriteln(fout, '4.3');\nwhile not Eof(fin) do begin\nReadln(fin, s);\nif Length(s) = 0 then Continue;\nminC := s[1]; maxC := s[1];\nfor i := 2 to Length(s) do begin\nif s[i] < minC then minC := s[i];\nif s[i] > maxC then maxC := s[i];\nend;\nif (Ord(maxC) - Ord(minC)) <= 10 then Writeln(fout, s);\nend;\nCloseFile(fin); CloseFile(fout);\nend.\n\n## Reference informatyczny - odległość alfabetyczna\n\n> Reference - Min/max w stringu:\n> - **Python**: `min(s)`, `max(s)` - leksykograficznie (alfabetycznie).\n> - **C++**: `min_element(s.begin(), s.end())`, `max_element( )`.\n> - **Pascal**: pętla z porównaniem.\n>\n> Reference - Równoważność warunków:\n> - \"Każde dwie litery oddalone ≤ 10\" ≡ \"max(s) - min(s) ≤ 10\".\n> - DOWÓD: jeśli max - min ≤ 10, to dla dowolnej pary (a, b): |a-b| ≤ max-min ≤ 10. I odwrotnie - jeśli max-min > 10, to para (min, max) łamie warunek.\n>\n> Reference - Klucz CKE - pułapka z 2 pkt:\n> - **Jeśli porównujemy tylko SĄSIEDNIE litery** (s[i] vs s[i+1]), wynik to 207 słów. To częsta pomyłka.\n> - Poprawny wynik (max - min) daje 15 słów dla przyklad.txt.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 4.3, max 4 pkt):\n> - **4 pkt** - poprawna lista (warunek dla WSZYSTKICH par)\n> - **2 pkt** - lista z porównania tylko SĄSIADUJĄCYCH liter (207 słów dla sygnaly.txt)\n> - **0 pkt** - błędna lub brak\n>\n> **Uwaga: NIE PRZYZNAJE SIĘ 3 ani 1 PUNKTU.**\n\n## Typowe pułapki\n\n- **Porównywanie tylko sąsiadów** - KLASYCZNA pułapka. \"Każde dwie\" = WSZYSTKIE PARY, nie tylko sąsiednie.\n- **Wzór `max - min ≤ 10`** - eleganckie i poprawne; alternatywa to podwójna pętla po wszystkich parach (O(L²)).\n- **Pomylenie odległości** - A i B oddalone o 1 (nie 2), A i E o 4 (nie 5). Bez offset.\n- **Wartość bezwzględna** - `|a-b|`, bo odległość nie ma znaku.\n- **`ord('A')`** - kod ASCII A to 65. Dla A do Z: 65-90. Różnica między 'Z' a 'A' = 25.\n- **Pominięcie pustego słowa** - sprawdź `if not s` lub `if Length(s) = 0`.\n\n## Złożoność obliczeniowa\n\n- Dla każdego słowa: O(L) (znajdowanie min/max).\n- Dla 1000 słów × max 100 znaków: **O(N · L)** = O(100 000) operacji.\n- Alternatywa naiwna O(L²) per słowo = O(N · L²) = 10⁷ operacji. Mniej elegancko, ale wciąż mieści się w czasie.","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>Na przykład CGECF jest takim słowem, ale ABEZA nie jest (odległość A - Z wynosi 25).</p>\n<p>W tym zadaniu rozważmy odległość liter w alfabecie - np. litery A i B są od siebie oddalone o 1, A i E o 4, F i D o 2, a każda litera od siebie samej jest oddalona o 0. Wypisz wszystkie słowa, w których każde dwie litery oddalone są od siebie w alfabecie co najwyżej o 10. Słowa wypisz w kolejności występowania w pliku sygnaly.txt, po jednym w wierszu.</p>\n<p>Dla danych z pliku przyklad.txt wynikiem jest 15 słów: AAAAAAAAAI, AAAAAAAAAE, AAAAAAAAAC, AAAAAAAAAH, AAAAAAAAAC, AAAAAAAAAI, AAAAAAAAAA, BB, AAAAAAAAAA, AAAAAAAAAA, AAAAAAAAAB, AAAAAAAAAE, AAAAAAAAAD, AAAAAAAAAI, AAAAAAAAAE.</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p><strong>Lista słów</strong> (przykładowe pierwsze z sygnaly.txt):<br>QQMLKKQNOHPKKPJOLHIPJKLKQIIHQHPNKNQPHNKLKQNIMLQPNLPMHNNIPNJJONQOHHKKQOIHOHHJMOJPMNIPIKION, OO, FH, AE, (cała lista to słowa spełniające warunek max odległość 10 między KAŻDYMI dwiema literami).</p>\n<h4>Sposób 1 - kluczowa interpretacja zadania</h4>\n<p><strong>UWAGA - kluczowy detal:</strong> warunek dotyczy <strong>KAŻDEJ PARY liter w słowie</strong>, nie tylko sąsiadów!</p>\n<p>Dla słowa s, warunek: dla każdego i, j: <code>|s[i] - s[j]| ≤ 10</code>.</p>\n<p>To równoważne: <code>max(s) - min(s) ≤ 10</code> (różnica między największą a najmniejszą literą).</p>\n<p><strong>Przykład:</strong> <code>ABEZA</code>:</p>\n<ul><li>min = A, max = Z, różnica = 25. <strong>NIE spełnia</strong> warunku (25 &gt; 10).</li><li>Mimo że sąsiednie litery są blisko siebie (np. A-B, B-E, E-Z=21, Z-A=25), to KAŻDE dwie litery muszą się różnić ≤ 10.</li></ul>\n<p><strong>Przykład:</strong> <code>CGECF</code>:</p>\n<ul><li>min = C, max = G, różnica = 4. <strong>Spełnia</strong> (4 ≤ 10).</li></ul>\n<h4>Sposób 2 - implementacja Python</h4>\n<p>```python<br>wyniki = []<br>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</p>\n<h3>Warunek: max(s) - min(s) &lt;= 10</h3>\n<p>if ord(max(s)) - ord(min(s)) &lt;= 10:<br>wyniki.append(s)</p>\n<p>with open(&#x27;wyniki4.txt&#x27;, &#x27;a&#x27;, encoding=&#x27;utf-8&#x27;) as f:<br>f.write(&quot;4.3\\n&quot;)<br>for s in wyniki:<br>f.write(s + &#x27;\\n&#x27;)</p>\n<p>print(f&quot;Liczba słów: {len(wyniki)}&quot;)<br>print(&quot;Pierwsze 5:&quot;)<br>for s in wyniki[:5]:<br>print(s)</p>\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;algorithm&gt;<br>using namespace std;</p>\n<p>bool sprawdz(const string&amp; s) {<br>if (s.empty()) return false;<br>char min_c = *min_element(s.begin(), s.end());<br>char max_c = *max_element(s.begin(), s.end());<br>return (max_c - min_c) &lt;= 10;<br>}</p>\n<p>int main() {<br>ifstream fin(&quot;sygnaly.txt&quot;);<br>ofstream fout(&quot;wyniki4.txt&quot;, ios::app);<br>fout &lt;&lt; &quot;4.3\\n&quot;;<br>string s;<br>while (fin &gt;&gt; s) {<br>if (sprawdz(s)) fout &lt;&lt; s &lt;&lt; &quot;\\n&quot;;<br>}<br>return 0;<br>}</p>\n<h4>Sposób 4 - Pascal</h4>\n<p>```pascal<br>program Wega43;<br>var fin, fout: TextFile; s: String;<br>i: Integer; minC, maxC: Char;<br>begin<br>AssignFile(fin, &#x27;sygnaly.txt&#x27;); Reset(fin);<br>AssignFile(fout, &#x27;wyniki4.txt&#x27;); Append(fout);<br>Writeln(fout, &#x27;4.3&#x27;);<br>while not Eof(fin) do begin<br>Readln(fin, s);<br>if Length(s) = 0 then Continue;<br>minC := s[1]; maxC := s[1];<br>for i := 2 to Length(s) do begin<br>if s[i] &lt; minC then minC := s[i];<br>if s[i] &gt; maxC then maxC := s[i];<br>end;<br>if (Ord(maxC) - Ord(minC)) &lt;= 10 then Writeln(fout, s);<br>end;<br>CloseFile(fin); CloseFile(fout);<br>end.</p>\n<h4>Reference informatyczny - odległość alfabetyczna</h4>\n<blockquote>Reference - Min/max w stringu:<br>- <strong>Python</strong>: <code>min(s)</code>, <code>max(s)</code> - leksykograficznie (alfabetycznie).<br>- <strong>C++</strong>: <code>min_element(s.begin(), s.end())</code>, <code>max_element( )</code>.<br>- <strong>Pascal</strong>: pętla z porównaniem.<br><br>Reference - Równoważność warunków:<br>- &quot;Każde dwie litery oddalone ≤ 10&quot; ≡ &quot;max(s) - min(s) ≤ 10&quot;.<br>- DOWÓD: jeśli max - min ≤ 10, to dla dowolnej pary (a, b): |a-b| ≤ max-min ≤ 10. I odwrotnie - jeśli max-min &gt; 10, to para (min, max) łamie warunek.<br><br>Reference - Klucz CKE - pułapka z 2 pkt:<br>- <strong>Jeśli porównujemy tylko SĄSIEDNIE litery</strong> (s[i] vs s[i+1]), wynik to 207 słów. To częsta pomyłka.<br>- Poprawny wynik (max - min) daje 15 słów dla przyklad.txt.</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 4.3, max 4 pkt):<br>- <strong>4 pkt</strong> - poprawna lista (warunek dla WSZYSTKICH par)<br>- <strong>2 pkt</strong> - lista z porównania tylko SĄSIADUJĄCYCH liter (207 słów dla sygnaly.txt)<br>- <strong>0 pkt</strong> - błędna 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>Porównywanie tylko sąsiadów</strong> - KLASYCZNA pułapka. &quot;Każde dwie&quot; = WSZYSTKIE PARY, nie tylko sąsiednie.</li><li><strong>Wzór <code>max - min ≤ 10</code></strong> - eleganckie i poprawne; alternatywa to podwójna pętla po wszystkich parach (O(L²)).</li><li><strong>Pomylenie odległości</strong> - A i B oddalone o 1 (nie 2), A i E o 4 (nie 5). Bez offset.</li><li><strong>Wartość bezwzględna</strong> - <code>|a-b|</code>, bo odległość nie ma znaku.</li><li><strong><code>ord(&#x27;A&#x27;)</code></strong> - kod ASCII A to 65. Dla A do Z: 65-90. Różnica między &#x27;Z&#x27; a &#x27;A&#x27; = 25.</li><li><strong>Pominięcie pustego słowa</strong> - sprawdź <code>if not s</code> lub <code>if Length(s) = 0</code>.</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>Dla każdego słowa: O(L) (znajdowanie min/max).</li><li>Dla 1000 słów × max 100 znaków: <strong>O(N · L)</strong> = O(100 000) operacji.</li><li>Alternatywa naiwna O(L²) per słowo = O(N · L²) = 10⁷ operacji. Mniej elegancko, ale wciąż mieści się w czasie.</li></ul>"}]}