{"id":"informatyka-2016-maj-matura-rozszerzona/zad/6.2","paper_id":"informatyka-2016-maj-matura-rozszerzona","number":"6.2","points":4,"ptype":"open","subject":"informatyka","category":"matura","year":2016,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 6.1.\n\nW pliku dane_6_2.txt zapisano 3 000 szyfrogramów i odpowiadające im klucze szyfrujące. W każdym wierszu: szyfrogram + spacja + klucz (max 4-cyfrowa liczba). Fragment:\nBCYKUNCM 1718\nYFOGNSKGYW 7580\nWARDA 9334\n\nUwaga: Dla pierwszego szyfrogramu (BCYKUNCM) wynikiem jest słowo ZAWISLAK.\n\nNapisz program, który odszyfruje słowa zaszyfrowane podanymi kluczami. Wynik zapisz w pliku wyniki_6_2.txt: każde odszyfrowane słowo w osobnym wierszu, w porządku odpowiadającym kolejności szyfrogramów z pliku z danymi.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**Przykładowe linie pliku wyniki_6_2.txt:**\n\n| Linia | Poprawny wynik |\n| 1 | ZAWISLAK |\n| 10 | KREZEL |\n| 11 | ANTOLAK |\n| 100 | KWIATKOWSKI |\n| 453 | LADA |\n\n## Sposób 1 - odszyfrowanie = szyfrowanie kluczem przeciwnym\n\n**Idea:** odszyfrowanie szyfru Cezara polega na przesunięciu w LEWO o k pozycji = przesunięciu w PRAWO o `26 - k mod 26`.\n\n**Wzór deszyfrowania:**\nrozszyfrowane(c) = ((ord(c) - ord('A') - k) mod 26 + 26) mod 26 + ord('A')\n\nlub równoważnie:\nrozszyfrowane(c) = ((ord(c) - ord('A') + (26 - k mod 26)) mod 26) + ord('A')\n\n**Weryfikacja BCYKUNCM z kluczem 1718:**\n- 1718 mod 26 = 1718 - 66·26 = 1718 - 1716 = **2**.\n- Deszyfrowanie: każdą literę przesuwamy o 2 w lewo.\n- B (1) → Z (25) ✓\n- C (2) → A (0) ✓\n- Y (24) → W (22) ✓\n- K (10) → I (8) ✓\n- U (20) → S (18) ✓\n- N (13) → L (11) ✓\n- C (2) → A (0) ✓\n- M (12) → K (10) ✓\n- Wynik: **ZAWISLAK** ✓\n\n## Sposób 2 - implementacja Python\n\n```python\ndef rozszyfruj(s, k):\nwynik = []\nfor znak in s:\np = ord(znak) - ord('A')\nnowa = (p - k) % 26\nwynik.append(chr(ord('A') + nowa))\nreturn ''.join(wynik)\n\nwith open('dane_6_2.txt', encoding='utf-8') as fin, \\\nopen('wyniki_6_2.txt', 'w', encoding='utf-8') as fout:\nfor linia in fin:\ncz = linia.strip().split()\nif len(cz) != 2:\ncontinue\nszyfr, k_str = cz\nk = int(k_str)\nfout.write(rozszyfruj(szyfr, k) + '\\n')\n\n## Sposób 3 - C++\n\n```cpp\n#include <iostream>\n#include <fstream>\n#include <string>\nusing namespace std;\n\nstring rozszyfruj(const string& s, int k) {\nstring wynik = s;\nint kk = k % 26;\nfor (char& c : wynik) {\nint p = c - 'A';\nint n = ((p - kk) % 26 + 26) % 26;\nc = 'A' + n;\n}\nreturn wynik;\n}\n\nint main() {\nifstream fin(\"dane_6_2.txt\");\nofstream fout(\"wyniki_6_2.txt\");\nstring szyfr;\nint k;\nwhile (fin >> szyfr >> k) fout << rozszyfruj(szyfr, k) << \"\\n\";\nreturn 0;\n}\n\n## Sposób 4 - Pascal\n\n```pascal\nprogram Cezar62;\nvar fin, fout: TextFile; s: String; k, i, p, n: Integer;\nbegin\nAssignFile(fin, 'dane_6_2.txt'); Reset(fin);\nAssignFile(fout, 'wyniki_6_2.txt'); Rewrite(fout);\nwhile not Eof(fin) do begin\nRead(fin, s);\nReadln(fin, k);\nfor i := 1 to Length(s) do begin\np := Ord(s[i]) - Ord('A');\nn := ((p - k) mod 26 + 26) mod 26;\ns[i] := Chr(Ord('A') + n);\nend;\nWriteln(fout, s);\nend;\nCloseFile(fin); CloseFile(fout);\nend.\n\n## Reference informatyczny - odszyfrowanie szyfru Cezara\n\n> Reference - Odszyfrowanie:\n> - Skoro szyfr = `(p + k) mod 26`, to odszyfrowanie = `(p_szyfr - k) mod 26`.\n> - **Pułapka modulo ujemnego**: `(-5) % 26` w C/C++/Pascal może dać -5; w Pythonie 21. Dlatego `((x % 26) + 26) % 26` - bezpieczne dla wszystkich języków.\n> - Alternatywnie: szyfrowanie kluczem `(26 - k mod 26)` = odszyfrowanie kluczem k.\n>\n> Reference - Duże klucze:\n> - W tym zadaniu klucz może być do 4-cyfrowy (max 9999). Modulo 26 redukuje to do 0-25.\n> - `1718 mod 26 = 2`, `7580 mod 26 = 24`, `9334 mod 26 = 14`.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 6.2, max 4 pkt):\n> Sprawdzane jest pierwsze 700 wierszy pliku wynikowego.\n> - **4 pkt** - poprawny plik wynikowy\n> - **2 pkt** - błędne dekodowanie jednej litery ALBO błąd zawijania ALBO błędna długość alfabetu (25)\n> - **0 pkt** - błędna albo brak\n>\n> **Uwaga: NIE PRZYZNAJE SIĘ 3 ani 1 PUNKTU.**\n\n## Typowe pułapki\n\n- **Długość alfabetu 25 zamiast 26** - błąd modulo. Klucz angielski A-Z = 26 liter.\n- **Modulo ujemne** - w niektórych językach `(0 - 2) % 26 = -2` (powinno być 24). Zawsze `((x % 26) + 26) % 26`.\n- **Szyfrowanie zamiast deszyfrowania** - w zadaniu mamy SZYFROGRAM i klucz, więc odejmujemy klucz, nie dodajemy.\n- **Nieparsowanie linii poprawnie** - `split()` po spacji daje [szyfr, klucz]. Klucz konwertujemy `int()`.\n- **Włączenie pustych linii** - `if not linia.strip(): continue`.\n- **Pominięcie wiersza po ostatnim newline** - `for linia in fin` lub `while fin >> s >> k` zwykle radzi sobie z tym.\n\n## Złożoność obliczeniowa\n\n- 3000 słów × max 30 znaków: **O(90 000) = O(N·L)** operacji.\n- I/O liniowe.","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 2016 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura","text_html":"<p>Kontekst - patrz zadanie 6.1.</p>\n<p>W pliku dane_6_2.txt zapisano 3 000 szyfrogramów i odpowiadające im klucze szyfrujące. W każdym wierszu: szyfrogram + spacja + klucz (max 4-cyfrowa liczba). Fragment:<br>BCYKUNCM 1718<br>YFOGNSKGYW 7580<br>WARDA 9334</p>\n<p>Uwaga: Dla pierwszego szyfrogramu (BCYKUNCM) wynikiem jest słowo ZAWISLAK.</p>\n<p>Napisz program, który odszyfruje słowa zaszyfrowane podanymi kluczami. Wynik zapisz w pliku wyniki_6_2.txt: każde odszyfrowane słowo w osobnym wierszu, w porządku odpowiadającym kolejności szyfrogramów z pliku z danymi.</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p><strong>Przykładowe linie pliku wyniki_6_2.txt:</strong></p>\n<p>| Linia | Poprawny wynik |<br>| 1 | ZAWISLAK |<br>| 10 | KREZEL |<br>| 11 | ANTOLAK |<br>| 100 | KWIATKOWSKI |<br>| 453 | LADA |</p>\n<h4>Sposób 1 - odszyfrowanie = szyfrowanie kluczem przeciwnym</h4>\n<p><strong>Idea:</strong> odszyfrowanie szyfru Cezara polega na przesunięciu w LEWO o k pozycji = przesunięciu w PRAWO o <code>26 - k mod 26</code>.</p>\n<p><strong>Wzór deszyfrowania:</strong><br>rozszyfrowane(c) = ((ord(c) - ord(&#x27;A&#x27;) - k) mod 26 + 26) mod 26 + ord(&#x27;A&#x27;)</p>\n<p>lub równoważnie:<br>rozszyfrowane(c) = ((ord(c) - ord(&#x27;A&#x27;) + (26 - k mod 26)) mod 26) + ord(&#x27;A&#x27;)</p>\n<p><strong>Weryfikacja BCYKUNCM z kluczem 1718:</strong></p>\n<ul><li>1718 mod 26 = 1718 - 66·26 = 1718 - 1716 = <strong>2</strong>.</li><li>Deszyfrowanie: każdą literę przesuwamy o 2 w lewo.</li><li>B (1) → Z (25) ✓</li><li>C (2) → A (0) ✓</li><li>Y (24) → W (22) ✓</li><li>K (10) → I (8) ✓</li><li>U (20) → S (18) ✓</li><li>N (13) → L (11) ✓</li><li>C (2) → A (0) ✓</li><li>M (12) → K (10) ✓</li><li>Wynik: <strong>ZAWISLAK</strong> ✓</li></ul>\n<h4>Sposób 2 - implementacja Python</h4>\n<p>```python<br>def rozszyfruj(s, k):<br>wynik = []<br>for znak in s:<br>p = ord(znak) - ord(&#x27;A&#x27;)<br>nowa = (p - k) % 26<br>wynik.append(chr(ord(&#x27;A&#x27;) + nowa))<br>return &#x27;&#x27;.join(wynik)</p>\n<p>with open(&#x27;dane_6_2.txt&#x27;, encoding=&#x27;utf-8&#x27;) as fin, \\<br>open(&#x27;wyniki_6_2.txt&#x27;, &#x27;w&#x27;, encoding=&#x27;utf-8&#x27;) as fout:<br>for linia in fin:<br>cz = linia.strip().split()<br>if len(cz) != 2:<br>continue<br>szyfr, k_str = cz<br>k = int(k_str)<br>fout.write(rozszyfruj(szyfr, k) + &#x27;\\n&#x27;)</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>using namespace std;</p>\n<p>string rozszyfruj(const string&amp; s, int k) {<br>string wynik = s;<br>int kk = k % 26;<br>for (char&amp; c : wynik) {<br>int p = c - &#x27;A&#x27;;<br>int n = ((p - kk) % 26 + 26) % 26;<br>c = &#x27;A&#x27; + n;<br>}<br>return wynik;<br>}</p>\n<p>int main() {<br>ifstream fin(&quot;dane_6_2.txt&quot;);<br>ofstream fout(&quot;wyniki_6_2.txt&quot;);<br>string szyfr;<br>int k;<br>while (fin &gt;&gt; szyfr &gt;&gt; k) fout &lt;&lt; rozszyfruj(szyfr, k) &lt;&lt; &quot;\\n&quot;;<br>return 0;<br>}</p>\n<h4>Sposób 4 - Pascal</h4>\n<p>```pascal<br>program Cezar62;<br>var fin, fout: TextFile; s: String; k, i, p, n: Integer;<br>begin<br>AssignFile(fin, &#x27;dane_6_2.txt&#x27;); Reset(fin);<br>AssignFile(fout, &#x27;wyniki_6_2.txt&#x27;); Rewrite(fout);<br>while not Eof(fin) do begin<br>Read(fin, s);<br>Readln(fin, k);<br>for i := 1 to Length(s) do begin<br>p := Ord(s[i]) - Ord(&#x27;A&#x27;);<br>n := ((p - k) mod 26 + 26) mod 26;<br>s[i] := Chr(Ord(&#x27;A&#x27;) + n);<br>end;<br>Writeln(fout, s);<br>end;<br>CloseFile(fin); CloseFile(fout);<br>end.</p>\n<h4>Reference informatyczny - odszyfrowanie szyfru Cezara</h4>\n<blockquote>Reference - Odszyfrowanie:<br>- Skoro szyfr = <code>(p + k) mod 26</code>, to odszyfrowanie = <code>(p_szyfr - k) mod 26</code>.<br>- <strong>Pułapka modulo ujemnego</strong>: <code>(-5) % 26</code> w C/C++/Pascal może dać -5; w Pythonie 21. Dlatego <code>((x % 26) + 26) % 26</code> - bezpieczne dla wszystkich języków.<br>- Alternatywnie: szyfrowanie kluczem <code>(26 - k mod 26)</code> = odszyfrowanie kluczem k.<br><br>Reference - Duże klucze:<br>- W tym zadaniu klucz może być do 4-cyfrowy (max 9999). Modulo 26 redukuje to do 0-25.<br>- <code>1718 mod 26 = 2</code>, <code>7580 mod 26 = 24</code>, <code>9334 mod 26 = 14</code>.</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 6.2, max 4 pkt):<br>Sprawdzane jest pierwsze 700 wierszy pliku wynikowego.<br>- <strong>4 pkt</strong> - poprawny plik wynikowy<br>- <strong>2 pkt</strong> - błędne dekodowanie jednej litery ALBO błąd zawijania ALBO błędna długość alfabetu (25)<br>- <strong>0 pkt</strong> - błędna albo brak<br><br><strong>Uwaga: NIE PRZYZNAJE SIĘ 3 ani 1 PUNKTU.</strong></blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>Długość alfabetu 25 zamiast 26</strong> - błąd modulo. Klucz angielski A-Z = 26 liter.</li><li><strong>Modulo ujemne</strong> - w niektórych językach <code>(0 - 2) % 26 = -2</code> (powinno być 24). Zawsze <code>((x % 26) + 26) % 26</code>.</li><li><strong>Szyfrowanie zamiast deszyfrowania</strong> - w zadaniu mamy SZYFROGRAM i klucz, więc odejmujemy klucz, nie dodajemy.</li><li><strong>Nieparsowanie linii poprawnie</strong> - <code>split()</code> po spacji daje [szyfr, klucz]. Klucz konwertujemy <code>int()</code>.</li><li><strong>Włączenie pustych linii</strong> - <code>if not linia.strip(): continue</code>.</li><li><strong>Pominięcie wiersza po ostatnim newline</strong> - <code>for linia in fin</code> lub <code>while fin &gt;&gt; s &gt;&gt; k</code> zwykle radzi sobie z tym.</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>3000 słów × max 30 znaków: <strong>O(90 000) = O(N·L)</strong> operacji.</li><li>I/O liniowe.</li></ul>"}]}