{"id":"informatyka-2015-maj-matura-rozszerzona/zad/4.3","paper_id":"informatyka-2015-maj-matura-rozszerzona","number":"4.3","points":6,"ptype":"open","subject":"informatyka","category":"matura","year":2015,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 4.1.\n\nZnajdź najmniejszą i największą liczbę w pliku liczby.txt. Jako odpowiedź podaj numery wierszy, w których się one znajdują.\n\nPrzykład: dla zestawu 101011010011001100111, 10001001011101010, 1001000, 101010011100, 1000110 - odpowiedź to 5, 1 (wiersz 5 = najmniejsza, wiersz 1 = największa).","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n- **Najmniejsza liczba: wiersz 859**\n- **Największa liczba: wiersz 925**\n\n## Sposób 1 - porównywanie liczb binarnych jako stringów\n\n**Kluczowa obserwacja:** dla porównania liczb binarnych (bez wiodących zer) używamy reguły:\n1. **Dłuższy string = większa liczba** (bo 100000 > 11111 mimo że 11111 ma wyższe cyfry).\n2. **Przy równej długości** - porównanie leksykograficzne odpowiada numerycznemu (bo '0' < '1' i pozycje są takie same).\n\nDlatego porównujemy: `(len(s), s)` - tuple porównuje element po elemencie.\n\n**Python:**\n```python\nz_wierszem = []\nwith open('liczby.txt') as f:\nfor i, linia in enumerate(f, start=1):\ns = linia.strip()\nz_wierszem.append((len(s), s, i)) # (długość, string, nr wiersza)\n\n# Sortowanie: najmniejsza = najkrótsza, w razie remisu leksykograficznie\nz_wierszem.sort() # rosnąco\nnajmniejsza = z_wierszem[0]\nnajwieksza = z_wierszem[-1]\nprint('najmniejsza: wiersz', najmniejsza[2]) # 859\nprint('największa: wiersz', najwieksza[2]) # 925\n\nLub bez sortowania (1 przejście):\n```python\nmin_dl, min_s, min_w = None, None, None\nmax_dl, max_s, max_w = None, None, None\nwith open('liczby.txt') as f:\nfor i, linia in enumerate(f, start=1):\ns = linia.strip()\nklucz = (len(s), s)\nif min_dl is None or klucz < (min_dl, min_s):\nmin_dl, min_s, min_w = len(s), s, i\nif max_dl is None or klucz > (max_dl, max_s):\nmax_dl, max_s, max_w = len(s), s, i\nprint('min wiersz:', min_w) # 859\nprint('max wiersz:', max_w) # 925\n\n## Sposób 2 - Python z arbitrary precision int\n\nPython obsługuje liczby całkowite o dowolnej precyzji, więc można:\n```python\nliczby = []\nwith open('liczby.txt') as f:\nfor i, linia in enumerate(f, start=1):\nn = int(linia.strip(), 2) # konwersja binarna → dec\nliczby.append((n, i))\nliczby.sort()\nprint('min:', liczby[0][1]) # 859\nprint('max:', liczby[-1][1]) # 925\n\n**Uwaga:** w C++/Pascal nie ma arbitrary precision dla integerów - musimy używać porównania stringowego.\n\n**C++:**\n```cpp\n#include <iostream>\n#include <fstream>\n#include <string>\nusing namespace std;\n\nbool mniejsza(const string& a, const string& b) {\nif (a.length() != b.length()) return a.length() < b.length();\nreturn a < b; // leksykograficzne porównanie\n}\n\nint main() {\nifstream plik(\"liczby.txt\");\nstring s, minS, maxS;\nint i = 0, minW = 0, maxW = 0;\nwhile (plik >> s) {\ni++;\nif (minW == 0 || mniejsza(s, minS)) { minS = s; minW = i; }\nif (maxW == 0 || mniejsza(maxS, s)) { maxS = s; maxW = i; }\n}\ncout << \"min wiersz: \" << minW << endl; // 859\ncout << \"max wiersz: \" << maxW << endl; // 925\nreturn 0;\n}\n\n**Pascal:**\n```pascal\nfunction Mniejsza(a, b: String): Boolean;\nbegin\nif Length(a) <> Length(b) then\nMniejsza := Length(a) < Length(b)\nelse\nMniejsza := a < b;\nend;\n\nvar\nf: TextFile;\ns, minS, maxS: String;\ni, minW, maxW: Integer;\nbegin\nAssignFile(f, 'liczby.txt');\nReset(f);\ni := 0; minW := 0; maxW := 0;\nwhile not Eof(f) do\nbegin\nReadln(f, s);\nInc(i);\nif (minW = 0) or Mniejsza(s, minS) then begin minS := s; minW := i; end;\nif (maxW = 0) or Mniejsza(maxS, s) then begin maxS := s; maxW := i; end;\nend;\nCloseFile(f);\nWriteln('min wiersz: ', minW); // 859\nWriteln('max wiersz: ', maxW); // 925\nend.\n\n## Reference informatyczny - porównanie liczb i wielkości\n\n> Reference - Big number comparison:\n> - Liczby binarne BEZ wiodących zer: dłuższa = większa. Przy równej długości - leksykograficzne porównanie odpowiada numerycznemu.\n> - **Python**: `int(s, 2)` konwertuje string binarny na int (arbitrary precision).\n> - **C++/Pascal**: dla liczb > 63 bity konieczne porównanie stringowe lub biblioteka BigNum.\n> - **One-pass minmax**: jedno przejście, dwa porównania → O(n). Lepsze niż sortowanie O(n log n).\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 4.3, max 6 pkt):\n> - **6 pkt** - poprawne min wiersz 859 ORAZ max wiersz 925\n> - **4 pkt** - tylko 250 wierszy uwzględnione (wynik: 125 min, 107 max)\n> - **3 pkt** - poprawnie tylko jeden z dwóch wierszy (859 ALBO 925)\n> - **2 pkt** - tylko 250 wierszy ORAZ tylko jeden poprawny\n> - **0 pkt** - niepełna lub błędna albo brak\n> - Nie przyznaje się 5 pkt ani 1 pkt.\n\n## Typowe pułapki\n\n- **Porównanie leksykograficzne bez uwzględnienia długości**: \"110\" < \"22\" w sensie znaków, ale jako liczby 110 > 22. Dla liczb binarnych: \"110\" (=6) vs \"100\" (=4) - leksykograficzne `\"110\" > \"100\"` ✓ ZGADZA SIĘ. Problem dopiero przy różnej długości: \"11\" (=3) vs \"100\" (=4) - leksykograficzne `\"11\" > \"100\"` ❌ ALE numerycznie \"11\" < \"100\". Dlatego SPRAWDZAĆ DŁUGOŚĆ NAJPIERW.\n- **Próba konwersji na int w C++/Pascal** - przepełnienie dla 250-bitowych liczb.\n- **Off-by-one w numeracji wierszy** - zacząć od 1, nie 0.\n- **Limit 250 wierszy** - Pascal w starych wersjach.\n- **Pomylenie min z max** - łatwo zamienić warunki.\n\n## Złożoność obliczeniowa\n\n- One-pass minmax: **O(N · L)**, gdzie N = 1000, L = 250 (porównanie stringów).\n- Sortowanie: O(N log N · L) = wolniejsze, niepotrzebne.\n- Pamięć: O(L) (tylko 2 stringi: min i max).","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 2015 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura","text_html":"<p>Kontekst - patrz zadanie 4.1.</p>\n<p>Znajdź najmniejszą i największą liczbę w pliku liczby.txt. Jako odpowiedź podaj numery wierszy, w których się one znajdują.</p>\n<p>Przykład: dla zestawu 101011010011001100111, 10001001011101010, 1001000, 101010011100, 1000110 - odpowiedź to 5, 1 (wiersz 5 = najmniejsza, wiersz 1 = największa).</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<ul><li><strong>Najmniejsza liczba: wiersz 859</strong></li><li><strong>Największa liczba: wiersz 925</strong></li></ul>\n<h4>Sposób 1 - porównywanie liczb binarnych jako stringów</h4>\n<p><strong>Kluczowa obserwacja:</strong> dla porównania liczb binarnych (bez wiodących zer) używamy reguły:</p>\n<ol><li><strong>Dłuższy string = większa liczba</strong> (bo 100000 &gt; 11111 mimo że 11111 ma wyższe cyfry).</li><li><strong>Przy równej długości</strong> - porównanie leksykograficzne odpowiada numerycznemu (bo &#x27;0&#x27; &lt; &#x27;1&#x27; i pozycje są takie same).</li></ol>\n<p>Dlatego porównujemy: <code>(len(s), s)</code> - tuple porównuje element po elemencie.</p>\n<p><strong>Python:</strong><br>```python<br>z_wierszem = []<br>with open(&#x27;liczby.txt&#x27;) as f:<br>for i, linia in enumerate(f, start=1):<br>s = linia.strip()<br>z_wierszem.append((len(s), s, i)) # (długość, string, nr wiersza)</p>\n<h3>Sortowanie: najmniejsza = najkrótsza, w razie remisu leksykograficznie</h3>\n<p>z_wierszem.sort() # rosnąco<br>najmniejsza = z_wierszem[0]<br>najwieksza = z_wierszem[-1]<br>print(&#x27;najmniejsza: wiersz&#x27;, najmniejsza[2]) # 859<br>print(&#x27;największa: wiersz&#x27;, najwieksza[2]) # 925</p>\n<p>Lub bez sortowania (1 przejście):<br>```python<br>min_dl, min_s, min_w = None, None, None<br>max_dl, max_s, max_w = None, None, None<br>with open(&#x27;liczby.txt&#x27;) as f:<br>for i, linia in enumerate(f, start=1):<br>s = linia.strip()<br>klucz = (len(s), s)<br>if min_dl is None or klucz &lt; (min_dl, min_s):<br>min_dl, min_s, min_w = len(s), s, i<br>if max_dl is None or klucz &gt; (max_dl, max_s):<br>max_dl, max_s, max_w = len(s), s, i<br>print(&#x27;min wiersz:&#x27;, min_w) # 859<br>print(&#x27;max wiersz:&#x27;, max_w) # 925</p>\n<h4>Sposób 2 - Python z arbitrary precision int</h4>\n<p>Python obsługuje liczby całkowite o dowolnej precyzji, więc można:<br>```python<br>liczby = []<br>with open(&#x27;liczby.txt&#x27;) as f:<br>for i, linia in enumerate(f, start=1):<br>n = int(linia.strip(), 2) # konwersja binarna → dec<br>liczby.append((n, i))<br>liczby.sort()<br>print(&#x27;min:&#x27;, liczby[0][1]) # 859<br>print(&#x27;max:&#x27;, liczby[-1][1]) # 925</p>\n<p><strong>Uwaga:</strong> w C++/Pascal nie ma arbitrary precision dla integerów - musimy używać porównania stringowego.</p>\n<p><strong>C++:</strong><br>```cpp<br>#include &lt;iostream&gt;<br>#include &lt;fstream&gt;<br>#include &lt;string&gt;<br>using namespace std;</p>\n<p>bool mniejsza(const string&amp; a, const string&amp; b) {<br>if (a.length() != b.length()) return a.length() &lt; b.length();<br>return a &lt; b; // leksykograficzne porównanie<br>}</p>\n<p>int main() {<br>ifstream plik(&quot;liczby.txt&quot;);<br>string s, minS, maxS;<br>int i = 0, minW = 0, maxW = 0;<br>while (plik &gt;&gt; s) {<br>i++;<br>if (minW == 0 || mniejsza(s, minS)) { minS = s; minW = i; }<br>if (maxW == 0 || mniejsza(maxS, s)) { maxS = s; maxW = i; }<br>}<br>cout &lt;&lt; &quot;min wiersz: &quot; &lt;&lt; minW &lt;&lt; endl; // 859<br>cout &lt;&lt; &quot;max wiersz: &quot; &lt;&lt; maxW &lt;&lt; endl; // 925<br>return 0;<br>}</p>\n<p><strong>Pascal:</strong><br>```pascal<br>function Mniejsza(a, b: String): Boolean;<br>begin<br>if Length(a) &lt;&gt; Length(b) then<br>Mniejsza := Length(a) &lt; Length(b)<br>else<br>Mniejsza := a &lt; b;<br>end;</p>\n<p>var<br>f: TextFile;<br>s, minS, maxS: String;<br>i, minW, maxW: Integer;<br>begin<br>AssignFile(f, &#x27;liczby.txt&#x27;);<br>Reset(f);<br>i := 0; minW := 0; maxW := 0;<br>while not Eof(f) do<br>begin<br>Readln(f, s);<br>Inc(i);<br>if (minW = 0) or Mniejsza(s, minS) then begin minS := s; minW := i; end;<br>if (maxW = 0) or Mniejsza(maxS, s) then begin maxS := s; maxW := i; end;<br>end;<br>CloseFile(f);<br>Writeln(&#x27;min wiersz: &#x27;, minW); // 859<br>Writeln(&#x27;max wiersz: &#x27;, maxW); // 925<br>end.</p>\n<h4>Reference informatyczny - porównanie liczb i wielkości</h4>\n<blockquote>Reference - Big number comparison:<br>- Liczby binarne BEZ wiodących zer: dłuższa = większa. Przy równej długości - leksykograficzne porównanie odpowiada numerycznemu.<br>- <strong>Python</strong>: <code>int(s, 2)</code> konwertuje string binarny na int (arbitrary precision).<br>- <strong>C++/Pascal</strong>: dla liczb &gt; 63 bity konieczne porównanie stringowe lub biblioteka BigNum.<br>- <strong>One-pass minmax</strong>: jedno przejście, dwa porównania → O(n). Lepsze niż sortowanie O(n log n).</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 4.3, max 6 pkt):<br>- <strong>6 pkt</strong> - poprawne min wiersz 859 ORAZ max wiersz 925<br>- <strong>4 pkt</strong> - tylko 250 wierszy uwzględnione (wynik: 125 min, 107 max)<br>- <strong>3 pkt</strong> - poprawnie tylko jeden z dwóch wierszy (859 ALBO 925)<br>- <strong>2 pkt</strong> - tylko 250 wierszy ORAZ tylko jeden poprawny<br>- <strong>0 pkt</strong> - niepełna lub błędna albo brak<br>- Nie przyznaje się 5 pkt ani 1 pkt.</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>Porównanie leksykograficzne bez uwzględnienia długości</strong>: &quot;110&quot; &lt; &quot;22&quot; w sensie znaków, ale jako liczby 110 &gt; 22. Dla liczb binarnych: &quot;110&quot; (=6) vs &quot;100&quot; (=4) - leksykograficzne <code>&quot;110&quot; &gt; &quot;100&quot;</code> ✓ ZGADZA SIĘ. Problem dopiero przy różnej długości: &quot;11&quot; (=3) vs &quot;100&quot; (=4) - leksykograficzne <code>&quot;11&quot; &gt; &quot;100&quot;</code> ❌ ALE numerycznie &quot;11&quot; &lt; &quot;100&quot;. Dlatego SPRAWDZAĆ DŁUGOŚĆ NAJPIERW.</li><li><strong>Próba konwersji na int w C++/Pascal</strong> - przepełnienie dla 250-bitowych liczb.</li><li><strong>Off-by-one w numeracji wierszy</strong> - zacząć od 1, nie 0.</li><li><strong>Limit 250 wierszy</strong> - Pascal w starych wersjach.</li><li><strong>Pomylenie min z max</strong> - łatwo zamienić warunki.</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>One-pass minmax: <strong>O(N · L)</strong>, gdzie N = 1000, L = 250 (porównanie stringów).</li><li>Sortowanie: O(N log N · L) = wolniejsze, niepotrzebne.</li><li>Pamięć: O(L) (tylko 2 stringi: min i max).</li></ul>"}]}