{"id":"informatyka-2018-maj-matura-rozszerzona/zad/4.1","paper_id":"informatyka-2018-maj-matura-rozszerzona","number":"4.1","points":3,"ptype":"open","subject":"informatyka","category":"matura","year":2018,"month":"maj","level":"rozszerzona","text":"Zadanie 4. WEGA\n\nW ramach projektu WEGA naukowcom udało się odczytać sygnały radiowe pochodzące z przestrzeni kosmicznej. Po wstępnej obróbce zapisali je do pliku sygnaly.txt.\n\nW pliku sygnaly.txt znajduje się 1000 wierszy. Każdy wiersz zawiera jedno niepuste słowo złożone z wielkich liter alfabetu angielskiego. Długość jednego słowa nie przekracza 100 znaków.\n\nNapisz program(y), który(e) da(dzą) odpowiedzi do poniższych zadań. Odpowiedzi zapisz w pliku wyniki4.txt, a każdą odpowiedź poprzedź numerem oznaczającym odpowiednie zadanie.\n\nUwaga: Plik przyklad.txt zawiera dane przykładowe spełniające warunki zadania. Odpowiedzi dla danych z pliku przyklad.txt są podane pod pytaniami.\n\nNaukowcy zauważyli, że po złączeniu dziesiątych liter co czterdziestego słowa (zaczynając od słowa czterdziestego) otrzymamy pewne przesłanie. Wypisz to przesłanie.\n\n**Uwaga:** Każde co czterdzieste słowo ma co najmniej 10 znaków.\n\nDla danych z pliku przyklad.txt wynikiem jest:\nNIECHCIMATURAPROSTABEDZIE","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**ZAPISZODPOWIEDZIWPLIKUTXT** (dla sygnaly.txt)\n\n**NIECHCIMATURAPROSTABEDZIE** (dla przyklad.txt)\n\n## Sposób 1 - interpretacja zadania\n\n**\"Co czterdzieste słowo zaczynając od czterdziestego\":** słowa o numerach 40, 80, 120, 160, , 1000.\nDla 1000 słów: 1000 / 40 = **25 słów** w sekwencji.\n\n**\"Dziesiąta litera\":** indeks 9 (od 0) lub indeks 10 (od 1).\n\n**Algorytm:**\n1. Wczytaj wszystkie słowa.\n2. Wybierz słowa o numerach 40, 80, 120, , 1000 (lub w pythonie indeksy 39, 79, 119, ).\n3. Z każdego wybranego słowa weź 10. literę.\n4. Złącz w jeden string.\n\n## Sposób 2 - implementacja Python\n\n```python\nslowa = []\nwith open('sygnaly.txt', encoding='utf-8') as f:\nfor linia in f:\ns = linia.strip()\nif s:\nslowa.append(s)\n\nprzeslanie = ''\nfor i in range(40, len(slowa) + 1, 40): # 40, 80, , 1000\nslowo = slowa[i - 1] # 40-te słowo to indeks 39\nprzeslanie += slowo[9] # 10. litera to indeks 9\n\nprint(przeslanie) # ZAPISZODPOWIEDZIWPLIKUTXT\n\n# Zapis do pliku\nwith open('wyniki4.txt', 'w', encoding='utf-8') as f:\nf.write(f\"4.1 {przeslanie}\\n\")\n\n**Weryfikacja długości:** liczba liter w przesłaniu = 1000 / 40 = 25. Słowo \"ZAPISZODPOWIEDZIWPLIKUTXT\" ma 25 liter ✓.\n\n## Sposób 3 - C++\n\n```cpp\n#include <iostream>\n#include <fstream>\n#include <string>\n#include <vector>\nusing namespace std;\n\nint main() {\nifstream f(\"sygnaly.txt\");\nvector<string> slowa;\nstring s;\nwhile (f >> s) slowa.push_back(s);\nstring przeslanie;\nfor (int i = 40; i <= (int)slowa.size(); i += 40) {\nprzeslanie += slowa[i - 1][9]; // 10. litera = indeks 9\n}\ncout << \"4.1 \" << przeslanie << endl;\nreturn 0;\n}\n\n## Sposób 4 - Pascal\n\n```pascal\nprogram Wega41;\nvar f: TextFile; s: String; slowa: array[1 1000] of String;\ni, n: Integer; przeslanie: String;\nbegin\nAssignFile(f, 'sygnaly.txt'); Reset(f);\nn := 0;\nwhile not Eof(f) do begin\nReadln(f, s);\nif Length(s) > 0 then begin\nInc(n);\nslowa[n] := s;\nend;\nend;\nCloseFile(f);\nprzeslanie := '';\ni := 40;\nwhile i <= n do begin\nprzeslanie := przeslanie + slowa[i][10]; // Pascal indeksuje od 1\ni := i + 40;\nend;\nWriteln('4.1 ', przeslanie);\nend.\n\n## Reference informatyczny - przetwarzanie pliku tekstowego\n\n> Reference - Czytanie pliku linia-po-linii:\n> - **Python**: `for linia in open('file.txt'):` lub `f.readlines()`.\n> - **C++**: `while (f >> s)` lub `getline(f, s)`.\n> - **Pascal**: `while not Eof(f) do Readln(f, s)`.\n>\n> Reference - Indeksowanie znaków:\n> - **Python**: od 0. `s[9]` = 10. znak.\n> - **C++**: od 0. `s[9]` = 10. znak.\n> - **Pascal**: od 1. `s[10]` = 10. znak.\n>\n> Reference - Co k-ty element:\n> - **Range step**: Python `range(40, n+1, 40)` lub `[i for i in range(n) if (i+1) % 40 == 0]`.\n> - **C++**: `for (int i = 40; i <= n; i += 40)`.\n> - Wzór: `i = k * 40` dla k = 1, 2, , n/40.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 4.1, max 3 pkt):\n> - **3 pkt** - prawidłowa odpowiedź **ZAPISZODPOWIEDZIWPLIKUTXT**\n> - **1 pkt** - wynik z 1 błędem (np. zła litera)\n> - **0 pkt** - błędna lub brak\n>\n> **Uwaga: NIE PRZYZNAJE SIĘ 2 PUNKTÓW.**\n\n## Typowe pułapki\n\n- **Off-by-one przy indeksie litery** - \"dziesiąta\" to indeks 9 (Python) lub 10 (Pascal). Łatwo wziąć 9. (indeks 8) lub 11. (indeks 10).\n- **Off-by-one przy numerze słowa** - \"40-te\" to indeks 39 w Python, 40 w Pascal. Lepiej iterować jasno: `for i in [40, 80, ]`.\n- **\"Zaczynając od czterdziestego\"** - pierwsze słowo to numer 40, NIE pierwsze (1) ani 41-sze.\n- **Pomyłka z \"co czterdzieste\"** - `range(40, 1001, 40)` da 40, 80, , 1000 = 25 elementów. NIE `range(40, 1000, 40)` które zatrzymuje się na 960.\n- **Nieskasowanie newline** - `.strip()` lub `s.trim()` na końcu.\n- **Słowo krótsze niż 10 znaków** - gwarancja z treści: \"każde co czterdzieste ma co najmniej 10 znaków\".\n\n## Złożoność obliczeniowa\n\n- Wczytanie 1000 słów: **O(N)**.\n- Przejście co 40-te: **O(N/40)** = O(25).\n- Pobranie 10. litery: O(1).\n- **Łącznie: O(N) ≈ 1000 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 4. WEGA</p>\n<p>W ramach projektu WEGA naukowcom udało się odczytać sygnały radiowe pochodzące z przestrzeni kosmicznej. Po wstępnej obróbce zapisali je do pliku sygnaly.txt.</p>\n<p>W pliku sygnaly.txt znajduje się 1000 wierszy. Każdy wiersz zawiera jedno niepuste słowo złożone z wielkich liter alfabetu angielskiego. Długość jednego słowa nie przekracza 100 znaków.</p>\n<p>Napisz program(y), który(e) da(dzą) odpowiedzi do poniższych zadań. Odpowiedzi zapisz w pliku wyniki4.txt, a każdą odpowiedź poprzedź numerem oznaczającym odpowiednie zadanie.</p>\n<p>Uwaga: Plik przyklad.txt zawiera dane przykładowe spełniające warunki zadania. Odpowiedzi dla danych z pliku przyklad.txt są podane pod pytaniami.</p>\n<p>Naukowcy zauważyli, że po złączeniu dziesiątych liter co czterdziestego słowa (zaczynając od słowa czterdziestego) otrzymamy pewne przesłanie. Wypisz to przesłanie.</p>\n<p><strong>Uwaga:</strong> Każde co czterdzieste słowo ma co najmniej 10 znaków.</p>\n<p>Dla danych z pliku przyklad.txt wynikiem jest:<br>NIECHCIMATURAPROSTABEDZIE</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p><strong>ZAPISZODPOWIEDZIWPLIKUTXT</strong> (dla sygnaly.txt)</p>\n<p><strong>NIECHCIMATURAPROSTABEDZIE</strong> (dla przyklad.txt)</p>\n<h4>Sposób 1 - interpretacja zadania</h4>\n<p><strong>&quot;Co czterdzieste słowo zaczynając od czterdziestego&quot;:</strong> słowa o numerach 40, 80, 120, 160, , 1000.<br>Dla 1000 słów: 1000 / 40 = <strong>25 słów</strong> w sekwencji.</p>\n<p><strong>&quot;Dziesiąta litera&quot;:</strong> indeks 9 (od 0) lub indeks 10 (od 1).</p>\n<p><strong>Algorytm:</strong></p>\n<ol><li>Wczytaj wszystkie słowa.</li><li>Wybierz słowa o numerach 40, 80, 120, , 1000 (lub w pythonie indeksy 39, 79, 119, ).</li><li>Z każdego wybranego słowa weź 10. literę.</li><li>Złącz w jeden string.</li></ol>\n<h4>Sposób 2 - implementacja Python</h4>\n<p>```python<br>slowa = []<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 s:<br>slowa.append(s)</p>\n<p>przeslanie = &#x27;&#x27;<br>for i in range(40, len(slowa) + 1, 40): # 40, 80, , 1000<br>slowo = slowa[i - 1] # 40-te słowo to indeks 39<br>przeslanie += slowo[9] # 10. litera to indeks 9</p>\n<p>print(przeslanie) # ZAPISZODPOWIEDZIWPLIKUTXT</p>\n<h3>Zapis do pliku</h3>\n<p>with open(&#x27;wyniki4.txt&#x27;, &#x27;w&#x27;, encoding=&#x27;utf-8&#x27;) as f:<br>f.write(f&quot;4.1 {przeslanie}\\n&quot;)</p>\n<p><strong>Weryfikacja długości:</strong> liczba liter w przesłaniu = 1000 / 40 = 25. Słowo &quot;ZAPISZODPOWIEDZIWPLIKUTXT&quot; ma 25 liter ✓.</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;vector&gt;<br>using namespace std;</p>\n<p>int main() {<br>ifstream f(&quot;sygnaly.txt&quot;);<br>vector&lt;string&gt; slowa;<br>string s;<br>while (f &gt;&gt; s) slowa.push_back(s);<br>string przeslanie;<br>for (int i = 40; i &lt;= (int)slowa.size(); i += 40) {<br>przeslanie += slowa[i - 1][9]; // 10. litera = indeks 9<br>}<br>cout &lt;&lt; &quot;4.1 &quot; &lt;&lt; przeslanie &lt;&lt; endl;<br>return 0;<br>}</p>\n<h4>Sposób 4 - Pascal</h4>\n<p>```pascal<br>program Wega41;<br>var f: TextFile; s: String; slowa: array[1 1000] of String;<br>i, n: Integer; przeslanie: String;<br>begin<br>AssignFile(f, &#x27;sygnaly.txt&#x27;); Reset(f);<br>n := 0;<br>while not Eof(f) do begin<br>Readln(f, s);<br>if Length(s) &gt; 0 then begin<br>Inc(n);<br>slowa[n] := s;<br>end;<br>end;<br>CloseFile(f);<br>przeslanie := &#x27;&#x27;;<br>i := 40;<br>while i &lt;= n do begin<br>przeslanie := przeslanie + slowa[i][10]; // Pascal indeksuje od 1<br>i := i + 40;<br>end;<br>Writeln(&#x27;4.1 &#x27;, przeslanie);<br>end.</p>\n<h4>Reference informatyczny - przetwarzanie pliku tekstowego</h4>\n<blockquote>Reference - Czytanie pliku linia-po-linii:<br>- <strong>Python</strong>: <code>for linia in open(&#x27;file.txt&#x27;):</code> lub <code>f.readlines()</code>.<br>- <strong>C++</strong>: <code>while (f &gt;&gt; s)</code> lub <code>getline(f, s)</code>.<br>- <strong>Pascal</strong>: <code>while not Eof(f) do Readln(f, s)</code>.<br><br>Reference - Indeksowanie znaków:<br>- <strong>Python</strong>: od 0. <code>s[9]</code> = 10. znak.<br>- <strong>C++</strong>: od 0. <code>s[9]</code> = 10. znak.<br>- <strong>Pascal</strong>: od 1. <code>s[10]</code> = 10. znak.<br><br>Reference - Co k-ty element:<br>- <strong>Range step</strong>: Python <code>range(40, n+1, 40)</code> lub <code>[i for i in range(n) if (i+1) % 40 == 0]</code>.<br>- <strong>C++</strong>: <code>for (int i = 40; i &lt;= n; i += 40)</code>.<br>- Wzór: <code>i = k * 40</code> dla k = 1, 2, , n/40.</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 4.1, max 3 pkt):<br>- <strong>3 pkt</strong> - prawidłowa odpowiedź <strong>ZAPISZODPOWIEDZIWPLIKUTXT</strong><br>- <strong>1 pkt</strong> - wynik z 1 błędem (np. zła litera)<br>- <strong>0 pkt</strong> - błędna lub brak<br><br><strong>Uwaga: NIE PRZYZNAJE SIĘ 2 PUNKTÓW.</strong></blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>Off-by-one przy indeksie litery</strong> - &quot;dziesiąta&quot; to indeks 9 (Python) lub 10 (Pascal). Łatwo wziąć 9. (indeks 8) lub 11. (indeks 10).</li><li><strong>Off-by-one przy numerze słowa</strong> - &quot;40-te&quot; to indeks 39 w Python, 40 w Pascal. Lepiej iterować jasno: <code>for i in [40, 80, ]</code>.</li><li><strong>&quot;Zaczynając od czterdziestego&quot;</strong> - pierwsze słowo to numer 40, NIE pierwsze (1) ani 41-sze.</li><li><strong>Pomyłka z &quot;co czterdzieste&quot;</strong> - <code>range(40, 1001, 40)</code> da 40, 80, , 1000 = 25 elementów. NIE <code>range(40, 1000, 40)</code> które zatrzymuje się na 960.</li><li><strong>Nieskasowanie newline</strong> - <code>.strip()</code> lub <code>s.trim()</code> na końcu.</li><li><strong>Słowo krótsze niż 10 znaków</strong> - gwarancja z treści: &quot;każde co czterdzieste ma co najmniej 10 znaków&quot;.</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>Wczytanie 1000 słów: <strong>O(N)</strong>.</li><li>Przejście co 40-te: <strong>O(N/40)</strong> = O(25).</li><li>Pobranie 10. litery: O(1).</li><li><strong>Łącznie: O(N) ≈ 1000 operacji.</strong></li></ul>"}]}