{"id":"informatyka-2019-maj-matura-rozszerzona/zad/5.4","paper_id":"informatyka-2019-maj-matura-rozszerzona","number":"5.4","points":4,"ptype":"open","subject":"informatyka","category":"matura","year":2019,"month":"maj","level":"rozszerzona","text":"Kontekst - patrz zadanie 5.1.\n\nProfesor George Nubis przedstawił teorię, według której chmury określonej wielkości i kategorii rozwijają się w następujący sposób:\n- jeśli w danym dniu nie ma chmur, nazajutrz na pewno pojawią się chmury o wielkości 1,\n- chmury po trzech dniach samoczynnie przechodzą w chmury o wyższym numerze, aż do numeru 5,\n- chmury o wielkości 5 zanikają wtedy, gdy spadnie w ciągu dnia co najmniej 20 mm deszczu, a wówczas następny dzień jest bezchmurny,\n- powstanie chmur kategorii C lub S zależy od temperatury powietrza w dniu ich tworzenia się. Jeśli temperatura w dniu pojawienia się chmur jest nie mniejsza niż 10 stopni, to powstają chmury kategorii C (o wielkości 1), w przeciwnym wypadku - chmury kategorii S (o wielkości 1).\n\nUwaga: Przez pierwszych 20 dni teoria zgodziła się dokładnie z obserwacjami. Użyj tej informacji, aby sprawdzić swoje obliczenia.\n\nZałóż, że chmury rozwijałyby się przez cały czas (500 dni) według teorii profesora i że dzień pierwszy był bezchmurny (wielkość chmur 0), a następnie:\n\na) podaj liczbę dni (spośród wszystkich 500) z chmurami wielkości 0, 1, 2, 3, 4 i 5 - dla każdej wielkości oddzielnie (przyjmij, że wielkość opadu w danym dniu jest taka, jaką zapisano w pliku z danymi),\n\nb) dla pierwszych 300 dni pomiaru podaj, ile wśród nich było takich, w których teorię profesora Nubisa dotyczącą wielkości chmur potwierdzały odczyty z kamery,\n\nc) dla pierwszych 300 dni pomiaru podaj, ile wśród nich było takich, w których teorię profesora Nubisa dotyczącą kategorii chmur potwierdzały odczyty z kamery.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**a) Liczba dni z chmurami każdej wielkości (500 dni, teoria prof. Nubisa):**\n\n| Wielkość | Liczba dni |\n| 0 | **34** |\n| 1 | **102** |\n| 2 | **102** |\n| 3 | **102** |\n| 4 | **100** |\n| 5 | **60** |\n\n**b) Liczba dni z pierwszych 300, gdzie teoria potwierdza WIELKOŚĆ chmur: 296**\n\n**c) Liczba dni z pierwszych 300, gdzie teoria potwierdza KATEGORIĘ chmur (C/S): 286**\n\n## Sposób 1 - symulacja w Python\n\n**Reguły teorii profesora Nubisa:**\n1. Dzień 1: bezchmurnie (wielkość = 0).\n2. Jeśli wczoraj nie było chmur → dziś wielkość = 1.\n3. Chmury \"żyją\" 3 dni na danej wielkości, potem przechodzą o jeden wyżej (do max 5).\n4. Chmury 5 zanikają (→ 0) gdy spadnie ≥ 20 mm w danym dniu.\n5. Kategoria (C/S): zależy od temperatury w dniu pojawienia się chmur:\n- temp ≥ 10°C → cirrus (C)\n- temp < 10°C → stratus (S)\n- Kategoria UTRZYMUJE SIĘ przez cały okres istnienia chmur.\n\n```python\n# Wczytaj dane\ndni = [] # (dzien, temp, opad, kat_obs, wiel_obs)\nwith open('pogoda.txt', encoding='utf-8') as f:\nf.readline()\nfor linia in f:\npola = linia.strip().split(';')\ndni.append({\n'dzien': int(pola[0]),\n'temp': float(pola[1].replace(',', '.')),\n'opad': int(pola[2]),\n'kat_obs': pola[3],\n'wiel_obs': int(pola[4]) if pola[4].isdigit() else 0,\n})\n\n# Symulacja teorii profesora\nteoria_wiel = [] # wielkość chmur każdego dnia wg teorii\nteoria_kat = [] # kategoria chmur (C/S/0)\nwielkosc = 0 # dzień 1 - bezchmurny\nkategoria = '0'\ndni_na_wielkosci = 0 # licznik dni na obecnej wielkości\n\nfor i, d in enumerate(dni):\nif i == 0:\n# dzień 1: bezchmurnie\nteoria_wiel.append(0)\nteoria_kat.append('0')\ncontinue\n# Reguły ewolucji (na podstawie poprzedniego dnia):\npoprzedni_w = teoria_wiel[i-1]\npoprzedni_k = teoria_kat[i-1]\npoprzedni_opad = dni[i-1]['opad']\nif poprzedni_w == 0:\n# wczoraj bezchmurne - dziś wielkość 1, kategoria wg dzisiejszej temp\nnowa_w = 1\nnowa_k = 'C' if d['temp'] >= 10 else 'S'\ndni_na_wielkosci = 1\nelif poprzedni_w == 5 and poprzedni_opad >= 20:\n# opadało ≥20mm → dziś bezchmurnie\nnowa_w = 0\nnowa_k = '0'\ndni_na_wielkosci = 0\nelse:\n# kontynuacja: jeśli na obecnej wielkości jest już 3. dzień → następna wielkość\nif dni_na_wielkosci >= 3 and poprzedni_w < 5:\nnowa_w = poprzedni_w + 1\ndni_na_wielkosci = 1\nelse:\nnowa_w = poprzedni_w\ndni_na_wielkosci += 1\nnowa_k = poprzedni_k\nteoria_wiel.append(nowa_w)\nteoria_kat.append(nowa_k)\n\n# a) zliczenia\nfrom collections import Counter\nprint('a)', Counter(teoria_wiel))\n# Counter({1: 102, 2: 102, 3: 102, 4: 100, 5: 60, 0: 34})\n\n# b) dni z pierwszych 300, gdzie wielkość zgadza się z obserwacją\nzgodne_w = sum(1 for i in range(300) if teoria_wiel[i] == dni[i]['wiel_obs'])\nprint('b)', zgodne_w) # 296\n\n# c) dni z pierwszych 300, gdzie kategoria zgadza się z obserwacją\nzgodne_k = sum(1 for i in range(300) if teoria_kat[i] == dni[i]['kat_obs'])\nprint('c)', zgodne_k) # 286\n\n## Sposób 2 - alternatywa: arkusz kalkulacyjny\n\nW arkuszu dodaj kolumny pomocnicze:\n- **G (wielkość teoretyczna)** - formuła z `JEŻELI` na podstawie G poprzedniego dnia i opadu.\n- **H (kategoria teoretyczna)** - `JEŻELI(G_wczoraj=0; JEŻELI(B_dziś≥10; \"C\"; \"S\"); H_wczoraj)`.\n- **I (zgodność wielkości)** - `JEŻELI(G_dziś=E_dziś; 1; 0)`.\n- **J (zgodność kategorii)** - `JEŻELI(H_dziś=D_dziś; 1; 0)`.\n\nNastępnie:\n- `LICZ.JEŻELI(G2:G501; 0)` daje liczbę dni z wielkością 0, itd.\n- `SUMA(I2:I301)` daje punkt b).\n- `SUMA(J2:J301)` daje punkt c).\n\n## Reference informatyczny - symulacja state machine\n\n> Reference - Symulacja \"automatu stanowego\":\n> - Stan: (wielkość, kategoria, dni_na_wielkosci).\n> - Przejścia: deterministyczne reguły na podstawie poprzedniego stanu + dane środowiskowe (temp, opad).\n> - Implementacja iteracyjna: tabela kolejnych stanów dni.\n> - Złożoność: O(n) - n = 500 dni.\n>\n> Reference - Walidacja teorii vs obserwacja:\n> - Porównaj predykcję (teoria) z obserwacją (dane z kamery) per dzień.\n> - Licznik zgodności = ile dni pasuje.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 5.4, max 4 pkt):\n> - **2 pkt** - zestawienie a) (lub 1 pkt jeśli max 2 błędne wartości)\n> - **1 pkt** - odpowiedź b) (296)\n> - **1 pkt** - odpowiedź c) (286)\n> - **0 pkt** - błędna albo brak\n\n## Typowe pułapki\n\n- **Pomylenie reguły \"3 dni\"** - chmura przechodzi PO 3 dniach (4. dzień to nowa wielkość), NIE w trakcie 3 dni.\n- **Brak warunku \"opad ≥ 20\" dla rozpadu 5 → 0** - chmury 5 nie znikają same, potrzebują deszczu.\n- **Kategoria zmienia się każdego dnia** - BŁĄD! Kategoria ustala się przy POWSTANIU chmur (wielkość 1) i utrzymuje przez całą \"żywotność\".\n- **Temperatura dnia tworzenia (wielkość 1)** - używamy temp tego dnia, NIE poprzedniego.\n- **Liczenie 500 dni dla b) i c)** - pytanie wyraźnie mówi o pierwszych 300.\n- **Pierwszy dzień bezchmurny** - zaczynamy od stanu (0, brak kategorii).\n\n## Złożoność obliczeniowa\n\n- Symulacja: **O(n)** = O(500).\n- Porównanie z obserwacjami: O(n).\n- Pamięć: O(n) dla tabel stanów.\n- Łącznie ~1500 operacji - natychmiastowe.","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 2019 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura","text_html":"<p>Kontekst - patrz zadanie 5.1.</p>\n<p>Profesor George Nubis przedstawił teorię, według której chmury określonej wielkości i kategorii rozwijają się w następujący sposób:</p>\n<ul><li>jeśli w danym dniu nie ma chmur, nazajutrz na pewno pojawią się chmury o wielkości 1,</li><li>chmury po trzech dniach samoczynnie przechodzą w chmury o wyższym numerze, aż do numeru 5,</li><li>chmury o wielkości 5 zanikają wtedy, gdy spadnie w ciągu dnia co najmniej 20 mm deszczu, a wówczas następny dzień jest bezchmurny,</li><li>powstanie chmur kategorii C lub S zależy od temperatury powietrza w dniu ich tworzenia się. Jeśli temperatura w dniu pojawienia się chmur jest nie mniejsza niż 10 stopni, to powstają chmury kategorii C (o wielkości 1), w przeciwnym wypadku - chmury kategorii S (o wielkości 1).</li></ul>\n<p>Uwaga: Przez pierwszych 20 dni teoria zgodziła się dokładnie z obserwacjami. Użyj tej informacji, aby sprawdzić swoje obliczenia.</p>\n<p>Załóż, że chmury rozwijałyby się przez cały czas (500 dni) według teorii profesora i że dzień pierwszy był bezchmurny (wielkość chmur 0), a następnie:</p>\n<p>a) podaj liczbę dni (spośród wszystkich 500) z chmurami wielkości 0, 1, 2, 3, 4 i 5 - dla każdej wielkości oddzielnie (przyjmij, że wielkość opadu w danym dniu jest taka, jaką zapisano w pliku z danymi),</p>\n<p>b) dla pierwszych 300 dni pomiaru podaj, ile wśród nich było takich, w których teorię profesora Nubisa dotyczącą wielkości chmur potwierdzały odczyty z kamery,</p>\n<p>c) dla pierwszych 300 dni pomiaru podaj, ile wśród nich było takich, w których teorię profesora Nubisa dotyczącą kategorii chmur potwierdzały odczyty z kamery.</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p><strong>a) Liczba dni z chmurami każdej wielkości (500 dni, teoria prof. Nubisa):</strong></p>\n<p>| Wielkość | Liczba dni |<br>| 0 | <strong>34</strong> |<br>| 1 | <strong>102</strong> |<br>| 2 | <strong>102</strong> |<br>| 3 | <strong>102</strong> |<br>| 4 | <strong>100</strong> |<br>| 5 | <strong>60</strong> |</p>\n<p><strong>b) Liczba dni z pierwszych 300, gdzie teoria potwierdza WIELKOŚĆ chmur: 296</strong></p>\n<p><strong>c) Liczba dni z pierwszych 300, gdzie teoria potwierdza KATEGORIĘ chmur (C/S): 286</strong></p>\n<h4>Sposób 1 - symulacja w Python</h4>\n<p><strong>Reguły teorii profesora Nubisa:</strong></p>\n<ol><li>Dzień 1: bezchmurnie (wielkość = 0).</li><li>Jeśli wczoraj nie było chmur → dziś wielkość = 1.</li><li>Chmury &quot;żyją&quot; 3 dni na danej wielkości, potem przechodzą o jeden wyżej (do max 5).</li><li>Chmury 5 zanikają (→ 0) gdy spadnie ≥ 20 mm w danym dniu.</li><li>Kategoria (C/S): zależy od temperatury w dniu pojawienia się chmur:</li></ol>\n<ul><li>temp ≥ 10°C → cirrus (C)</li><li>temp &lt; 10°C → stratus (S)</li><li>Kategoria UTRZYMUJE SIĘ przez cały okres istnienia chmur.</li></ul>\n<p>```python</p>\n<h3>Wczytaj dane</h3>\n<p>dni = [] # (dzien, temp, opad, kat_obs, wiel_obs)<br>with open(&#x27;pogoda.txt&#x27;, encoding=&#x27;utf-8&#x27;) as f:<br>f.readline()<br>for linia in f:<br>pola = linia.strip().split(&#x27;;&#x27;)<br>dni.append({<br>&#x27;dzien&#x27;: int(pola[0]),<br>&#x27;temp&#x27;: float(pola[1].replace(&#x27;,&#x27;, &#x27;.&#x27;)),<br>&#x27;opad&#x27;: int(pola[2]),<br>&#x27;kat_obs&#x27;: pola[3],<br>&#x27;wiel_obs&#x27;: int(pola[4]) if pola[4].isdigit() else 0,<br>})</p>\n<h3>Symulacja teorii profesora</h3>\n<p>teoria_wiel = [] # wielkość chmur każdego dnia wg teorii<br>teoria_kat = [] # kategoria chmur (C/S/0)<br>wielkosc = 0 # dzień 1 - bezchmurny<br>kategoria = &#x27;0&#x27;<br>dni_na_wielkosci = 0 # licznik dni na obecnej wielkości</p>\n<p>for i, d in enumerate(dni):<br>if i == 0:</p>\n<h3>dzień 1: bezchmurnie</h3>\n<p>teoria_wiel.append(0)<br>teoria_kat.append(&#x27;0&#x27;)<br>continue</p>\n<h3>Reguły ewolucji (na podstawie poprzedniego dnia):</h3>\n<p>poprzedni_w = teoria_wiel[i-1]<br>poprzedni_k = teoria_kat[i-1]<br>poprzedni_opad = dni[i-1][&#x27;opad&#x27;]<br>if poprzedni_w == 0:</p>\n<h3>wczoraj bezchmurne - dziś wielkość 1, kategoria wg dzisiejszej temp</h3>\n<p>nowa_w = 1<br>nowa_k = &#x27;C&#x27; if d[&#x27;temp&#x27;] &gt;= 10 else &#x27;S&#x27;<br>dni_na_wielkosci = 1<br>elif poprzedni_w == 5 and poprzedni_opad &gt;= 20:</p>\n<h3>opadało ≥20mm → dziś bezchmurnie</h3>\n<p>nowa_w = 0<br>nowa_k = &#x27;0&#x27;<br>dni_na_wielkosci = 0<br>else:</p>\n<h3>kontynuacja: jeśli na obecnej wielkości jest już 3. dzień → następna wielkość</h3>\n<p>if dni_na_wielkosci &gt;= 3 and poprzedni_w &lt; 5:<br>nowa_w = poprzedni_w + 1<br>dni_na_wielkosci = 1<br>else:<br>nowa_w = poprzedni_w<br>dni_na_wielkosci += 1<br>nowa_k = poprzedni_k<br>teoria_wiel.append(nowa_w)<br>teoria_kat.append(nowa_k)</p>\n<h3>a) zliczenia</h3>\n<p>from collections import Counter<br>print(&#x27;a)&#x27;, Counter(teoria_wiel))</p>\n<h3>Counter({1: 102, 2: 102, 3: 102, 4: 100, 5: 60, 0: 34})</h3>\n<h3>b) dni z pierwszych 300, gdzie wielkość zgadza się z obserwacją</h3>\n<p>zgodne_w = sum(1 for i in range(300) if teoria_wiel[i] == dni[i][&#x27;wiel_obs&#x27;])<br>print(&#x27;b)&#x27;, zgodne_w) # 296</p>\n<h3>c) dni z pierwszych 300, gdzie kategoria zgadza się z obserwacją</h3>\n<p>zgodne_k = sum(1 for i in range(300) if teoria_kat[i] == dni[i][&#x27;kat_obs&#x27;])<br>print(&#x27;c)&#x27;, zgodne_k) # 286</p>\n<h4>Sposób 2 - alternatywa: arkusz kalkulacyjny</h4>\n<p>W arkuszu dodaj kolumny pomocnicze:</p>\n<ul><li><strong>G (wielkość teoretyczna)</strong> - formuła z <code>JEŻELI</code> na podstawie G poprzedniego dnia i opadu.</li><li><strong>H (kategoria teoretyczna)</strong> - <code>JEŻELI(G_wczoraj=0; JEŻELI(B_dziś≥10; &quot;C&quot;; &quot;S&quot;); H_wczoraj)</code>.</li><li><strong>I (zgodność wielkości)</strong> - <code>JEŻELI(G_dziś=E_dziś; 1; 0)</code>.</li><li><strong>J (zgodność kategorii)</strong> - <code>JEŻELI(H_dziś=D_dziś; 1; 0)</code>.</li></ul>\n<p>Następnie:</p>\n<ul><li><code>LICZ.JEŻELI(G2:G501; 0)</code> daje liczbę dni z wielkością 0, itd.</li><li><code>SUMA(I2:I301)</code> daje punkt b).</li><li><code>SUMA(J2:J301)</code> daje punkt c).</li></ul>\n<h4>Reference informatyczny - symulacja state machine</h4>\n<blockquote>Reference - Symulacja &quot;automatu stanowego&quot;:<br>- Stan: (wielkość, kategoria, dni_na_wielkosci).<br>- Przejścia: deterministyczne reguły na podstawie poprzedniego stanu + dane środowiskowe (temp, opad).<br>- Implementacja iteracyjna: tabela kolejnych stanów dni.<br>- Złożoność: O(n) - n = 500 dni.<br><br>Reference - Walidacja teorii vs obserwacja:<br>- Porównaj predykcję (teoria) z obserwacją (dane z kamery) per dzień.<br>- Licznik zgodności = ile dni pasuje.</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 5.4, max 4 pkt):<br>- <strong>2 pkt</strong> - zestawienie a) (lub 1 pkt jeśli max 2 błędne wartości)<br>- <strong>1 pkt</strong> - odpowiedź b) (296)<br>- <strong>1 pkt</strong> - odpowiedź c) (286)<br>- <strong>0 pkt</strong> - błędna albo brak</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>Pomylenie reguły &quot;3 dni&quot;</strong> - chmura przechodzi PO 3 dniach (4. dzień to nowa wielkość), NIE w trakcie 3 dni.</li><li><strong>Brak warunku &quot;opad ≥ 20&quot; dla rozpadu 5 → 0</strong> - chmury 5 nie znikają same, potrzebują deszczu.</li><li><strong>Kategoria zmienia się każdego dnia</strong> - BŁĄD! Kategoria ustala się przy POWSTANIU chmur (wielkość 1) i utrzymuje przez całą &quot;żywotność&quot;.</li><li><strong>Temperatura dnia tworzenia (wielkość 1)</strong> - używamy temp tego dnia, NIE poprzedniego.</li><li><strong>Liczenie 500 dni dla b) i c)</strong> - pytanie wyraźnie mówi o pierwszych 300.</li><li><strong>Pierwszy dzień bezchmurny</strong> - zaczynamy od stanu (0, brak kategorii).</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>Symulacja: <strong>O(n)</strong> = O(500).</li><li>Porównanie z obserwacjami: O(n).</li><li>Pamięć: O(n) dla tabel stanów.</li><li>Łącznie ~1500 operacji - natychmiastowe.</li></ul>"}]}