{"id":"informatyka-2017-maj-matura-rozszerzona/zad/6.4","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"6.4","points":4,"ptype":"open","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 6.1.\n\nPodaj długość najdłuższej linii pionowej (czyli ciągu kolejnych pikseli w tej samej kolumnie obrazka), złożonej z pikseli tej samej jasności.\n\nDla danych z pliku przyklad.txt wynikiem jest 198.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**Najdłuższa linia pionowa o jednolitej jasności: 5 pikseli** (w `dane.txt`).\n\nDla `przyklad.txt`: 198.\n\nDla każdej kolumny przeglądamy wszystkie 200 wierszy z góry na dół i utrzymujemy aktualną długość ciągu identycznych wartości (\"streak\"). Wynikiem jest globalne maksimum tych streaków.\n\n## Sposób 1 - Python (najczytelniejszy)\n\n```python\n# Wczytaj obraz jako macierz [200][320]\nwith open('dane.txt') as f:\nobraz = [[int(x) for x in linia.split()] for linia in f]\n\nW, K = len(obraz), len(obraz[0]) # 200, 320\nmax_dl = 1\n\nfor c in range(K):\nbiezacy = 1\nfor r in range(1, W):\nif obraz[r][c] == obraz[r-1][c]:\nbiezacy += 1\nif biezacy > max_dl:\nmax_dl = biezacy\nelse:\nbiezacy = 1\n\nprint(max_dl) # 5\n\n## Sposób 2 - C++ (kolumna-po-kolumnie)\n\n```cpp\n#include <iostream>\n#include <fstream>\nusing namespace std;\n\nconst int W = 200, K = 320;\nint obraz[W][K];\n\nint main() {\nifstream plik(\"dane.txt\");\nfor (int r = 0; r < W; r++)\nfor (int c = 0; c < K; c++)\nplik >> obraz[r][c];\nint max_dl = 1;\nfor (int c = 0; c < K; c++) {\nint biezacy = 1;\nfor (int r = 1; r < W; r++) {\nif (obraz[r][c] == obraz[r-1][c]) {\nbiezacy++;\nif (biezacy > max_dl) max_dl = biezacy;\n} else {\nbiezacy = 1;\n}\n}\n}\ncout << max_dl << endl; // 5\nreturn 0;\n}\n\n## Sposób 3 - Pascal\n\n```pascal\nprogram NajdluzszaLinia;\nvar\nobraz: array[1 200, 1 320] of Integer;\nr, c, biezacy, max_dl: Integer;\nf: TextFile;\nbegin\nAssignFile(f, 'dane.txt'); Reset(f);\nfor r := 1 to 200 do\nfor c := 1 to 320 do Read(f, obraz[r, c]);\nCloseFile(f);\nmax_dl := 1;\nfor c := 1 to 320 do\nbegin\nbiezacy := 1;\nfor r := 2 to 200 do\nif obraz[r, c] = obraz[r-1, c] then\nbegin\nInc(biezacy);\nif biezacy > max_dl then max_dl := biezacy;\nend\nelse\nbiezacy := 1;\nend;\nWriteln(max_dl); // 5\nend.\n\n## Reference algorytmiczny - najdłuższy podciąg jednakowych\n\n> Reference - Run-Length Encoding (najdłuższy run):\n> - Przeglądaj sekwencję jeden raz, utrzymując zmienną \"biezacy\" liczącą długość bieżącego ciągu.\n> - Gdy element się ZMIENIA, resetuj biezacy = 1; gdy się POWTARZA, zwiększaj.\n> - Po każdym kroku aktualizuj globalne maksimum.\n> - Złożoność: O(n) na sekwencję.\n> - Dla obrazu 200×320 = 64 000 pikseli: O(W · K) = O(64 000) operacji. Szybko.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 6.4, max 4 pkt):\n> - **4 pkt** - prawidłowa odpowiedź: **5**.\n> - **2 pkt** - odpowiedź **4** lub **6** (off-by-one error: liczone końce/granice przedziału lub błędna inicjalizacja).\n> - **0 pkt** - inna błędna odpowiedź lub brak.\n> - **UWAGA:** Nie przyznaje się 3 pkt i 1 pkt.\n\n## Typowe pułapki\n\n- **Liczenie linii POZIOMYCH zamiast PIONOWYCH** - pionowa = w tej samej KOLUMNIE, idziemy w dół. Częsta pomyłka kierunku iteracji.\n- **Inicjalizacja biezacy = 0 vs 1** - pierwszy piksel zaczyna ciąg, więc biezacy = 1. Inicjalizacja = 0 da off-by-one (odpowiedź 4 lub 6 zamiast 5).\n- **Reset biezacy = 0 zamiast 1** - gdy element zmienia się, nowa wartość zaczyna NOWY ciąg długości 1, nie 0.\n- **Brak aktualizacji max_dl PRZY PIERWSZYM piksele** - można pomylić i pominąć kolumny gdzie wszystkie 200 pikseli są takie same. Inicjalizacja max_dl = 1 lub aktualizacja po każdej iteracji.\n- **Indeksowanie 0 vs 1** - w Pascalu od 1, w Python/C++ od 0. Pętla wewnętrzna `for r in range(1, W)` (Python) lub `for r := 2 to 200` (Pascal).\n- **dane.txt vs przyklad.txt** - przyklad zwraca 198 (prawie cała kolumna), dane.txt tylko 5 (obraz różnorodny).\n\n## Złożoność obliczeniowa\n\n- Wczytanie: O(W × K) = O(64 000).\n- Główna pętla: O(W × K) = O(64 000) operacji.\n- **Całkowita: O(W × K)**, liniowa względem rozmiaru obrazu.\n- Pamięć: O(W × K) na macierz lub O(W) (jednej kolumny naraz, gdyby trzymać tylko bieżącą kolumnę).","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 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura","text_html":"<p>Kontekst - patrz zadanie 6.1.</p>\n<p>Podaj długość najdłuższej linii pionowej (czyli ciągu kolejnych pikseli w tej samej kolumnie obrazka), złożonej z pikseli tej samej jasności.</p>\n<p>Dla danych z pliku przyklad.txt wynikiem jest 198.</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p><strong>Najdłuższa linia pionowa o jednolitej jasności: 5 pikseli</strong> (w <code>dane.txt</code>).</p>\n<p>Dla <code>przyklad.txt</code>: 198.</p>\n<p>Dla każdej kolumny przeglądamy wszystkie 200 wierszy z góry na dół i utrzymujemy aktualną długość ciągu identycznych wartości (&quot;streak&quot;). Wynikiem jest globalne maksimum tych streaków.</p>\n<h4>Sposób 1 - Python (najczytelniejszy)</h4>\n<p>```python</p>\n<h3>Wczytaj obraz jako macierz [200][320]</h3>\n<p>with open(&#x27;dane.txt&#x27;) as f:<br>obraz = [[int(x) for x in linia.split()] for linia in f]</p>\n<p>W, K = len(obraz), len(obraz[0]) # 200, 320<br>max_dl = 1</p>\n<p>for c in range(K):<br>biezacy = 1<br>for r in range(1, W):<br>if obraz[r][c] == obraz[r-1][c]:<br>biezacy += 1<br>if biezacy &gt; max_dl:<br>max_dl = biezacy<br>else:<br>biezacy = 1</p>\n<p>print(max_dl) # 5</p>\n<h4>Sposób 2 - C++ (kolumna-po-kolumnie)</h4>\n<p>```cpp<br>#include &lt;iostream&gt;<br>#include &lt;fstream&gt;<br>using namespace std;</p>\n<p>const int W = 200, K = 320;<br>int obraz[W][K];</p>\n<p>int main() {<br>ifstream plik(&quot;dane.txt&quot;);<br>for (int r = 0; r &lt; W; r++)<br>for (int c = 0; c &lt; K; c++)<br>plik &gt;&gt; obraz[r][c];<br>int max_dl = 1;<br>for (int c = 0; c &lt; K; c++) {<br>int biezacy = 1;<br>for (int r = 1; r &lt; W; r++) {<br>if (obraz[r][c] == obraz[r-1][c]) {<br>biezacy++;<br>if (biezacy &gt; max_dl) max_dl = biezacy;<br>} else {<br>biezacy = 1;<br>}<br>}<br>}<br>cout &lt;&lt; max_dl &lt;&lt; endl; // 5<br>return 0;<br>}</p>\n<h4>Sposób 3 - Pascal</h4>\n<p>```pascal<br>program NajdluzszaLinia;<br>var<br>obraz: array[1 200, 1 320] of Integer;<br>r, c, biezacy, max_dl: Integer;<br>f: TextFile;<br>begin<br>AssignFile(f, &#x27;dane.txt&#x27;); Reset(f);<br>for r := 1 to 200 do<br>for c := 1 to 320 do Read(f, obraz[r, c]);<br>CloseFile(f);<br>max_dl := 1;<br>for c := 1 to 320 do<br>begin<br>biezacy := 1;<br>for r := 2 to 200 do<br>if obraz[r, c] = obraz[r-1, c] then<br>begin<br>Inc(biezacy);<br>if biezacy &gt; max_dl then max_dl := biezacy;<br>end<br>else<br>biezacy := 1;<br>end;<br>Writeln(max_dl); // 5<br>end.</p>\n<h4>Reference algorytmiczny - najdłuższy podciąg jednakowych</h4>\n<blockquote>Reference - Run-Length Encoding (najdłuższy run):<br>- Przeglądaj sekwencję jeden raz, utrzymując zmienną &quot;biezacy&quot; liczącą długość bieżącego ciągu.<br>- Gdy element się ZMIENIA, resetuj biezacy = 1; gdy się POWTARZA, zwiększaj.<br>- Po każdym kroku aktualizuj globalne maksimum.<br>- Złożoność: O(n) na sekwencję.<br>- Dla obrazu 200×320 = 64 000 pikseli: O(W · K) = O(64 000) operacji. Szybko.</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 6.4, max 4 pkt):<br>- <strong>4 pkt</strong> - prawidłowa odpowiedź: <strong>5</strong>.<br>- <strong>2 pkt</strong> - odpowiedź <strong>4</strong> lub <strong>6</strong> (off-by-one error: liczone końce/granice przedziału lub błędna inicjalizacja).<br>- <strong>0 pkt</strong> - inna błędna odpowiedź lub brak.<br>- <strong>UWAGA:</strong> Nie przyznaje się 3 pkt i 1 pkt.</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>Liczenie linii POZIOMYCH zamiast PIONOWYCH</strong> - pionowa = w tej samej KOLUMNIE, idziemy w dół. Częsta pomyłka kierunku iteracji.</li><li><strong>Inicjalizacja biezacy = 0 vs 1</strong> - pierwszy piksel zaczyna ciąg, więc biezacy = 1. Inicjalizacja = 0 da off-by-one (odpowiedź 4 lub 6 zamiast 5).</li><li><strong>Reset biezacy = 0 zamiast 1</strong> - gdy element zmienia się, nowa wartość zaczyna NOWY ciąg długości 1, nie 0.</li><li><strong>Brak aktualizacji max_dl PRZY PIERWSZYM piksele</strong> - można pomylić i pominąć kolumny gdzie wszystkie 200 pikseli są takie same. Inicjalizacja max_dl = 1 lub aktualizacja po każdej iteracji.</li><li><strong>Indeksowanie 0 vs 1</strong> - w Pascalu od 1, w Python/C++ od 0. Pętla wewnętrzna <code>for r in range(1, W)</code> (Python) lub <code>for r := 2 to 200</code> (Pascal).</li><li><strong>dane.txt vs przyklad.txt</strong> - przyklad zwraca 198 (prawie cała kolumna), dane.txt tylko 5 (obraz różnorodny).</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>Wczytanie: O(W × K) = O(64 000).</li><li>Główna pętla: O(W × K) = O(64 000) operacji.</li><li><strong>Całkowita: O(W × K)</strong>, liniowa względem rozmiaru obrazu.</li><li>Pamięć: O(W × K) na macierz lub O(W) (jednej kolumny naraz, gdyby trzymać tylko bieżącą kolumnę).</li></ul>"}]}