Zadanie 2
Matura z informatyki, maj 2025, poziom rozszerzony
Wymaganie: I.4) do realizacji rozwiązania problemu dobiera odpowiednią metodę lub technikę algorytmiczną i struktury danych. I.5) objaśnia dobrany algorytm, uzasadnia poprawność rozwiązania na wybranych przykładach danych i ocenia jego efektywność. I.7) przedstawia sposoby reprezentowania w komputerze znaków, liczb […]. I+II.1) zapisuje za pomocą listy kroków lub pseudokodu i implementuje w wybranym języku programowania algorytmy poznane na wcześniejszych etapach […]. P.I.2) stosuje przy rozwiązywaniu problemów z różnych dziedzin algorytmy poznane w szkole podstawowej oraz algorytmy: a) na liczbach: […], zamiany reprezentacji liczb między pozycyjnymi systemami liczbowymi […]; b) na tekstach: porównywania tekstów, wyszukiwania wzorca w tekście metodą naiwną, szyfrowania tekstu metodą Cezara. P.II.1) projektuje i programuje rozwiązania problemów z różnych dziedzin […]. II.1) projektuje i tworzy programy w procesie rozwiązywania problemów, wykorzystuje w programach dobrane do algorytmów struktury danych, w tym struktury dynamiczne, i korzysta z dostępnych bibliotek dla tych struktur. II.2) sprawnie posługuje się zintegrowanym środowiskiem programistycznym przy pisaniu, uruchamianiu i testowaniu programów.
Treść zadania
Zadanie 2. Zapis symboliczny
W pliku symbole.txt zapisano 2000 napisów. Każdy z nich jest zapisany w osobnym wierszu i składa się z dokładnie 12 znaków spośród: o, +, *.
Napisz program (lub kilka programów) znajdujący(-ch) odpowiedzi do podanych zadań. Każdą odpowiedź zapisz w pliku wyniki2.txt i poprzedź ją numerem oznaczającym zadanie.
Do Twojej dyspozycji jest plik symbole_przyklad.txt, który zawiera 20 wierszy danych spełniających warunki zadania. Odpowiedzi dla pliku symbole_przyklad.txt są podane pod każdym zadaniem.
Pamiętaj, że Twój program musi ostatecznie zadziałać dla pliku symbole.txt zawierającym 2000 napisów.
Zadanie 2.1. (0–2)
Podaj wszystkie takie napisy z pliku symbole.txt, które są palindromami (czytane od przodu i od tyłu są takie same). Wypisz je po jednym w wierszu, w kolejności takiej jak w pliku symbole.txt.
Odpowiedź dla pliku symbole_przyklad.txt to:
oooo+**+oooo
(w tym pliku jest jeden palindrom)
Zadanie 2.2. (0–4)
W pliku symbole.txt szukamy „kwadratów” złożonych z dziewięciu sąsiadujących identycznych symboli:
+ + + o o o * * *
+ + + lub o o o lub * * *
+ + + o o o * * *
Podaj, ile takich kwadratów występuje w pliku symbole.txt. Jeżeli w pliku występuje jeden taki kwadrat, podaj numer wiersza i numer pozycji w wierszu (licząc od 1) jego środkowego pola. Jeżeli jest więcej takich kwadratów, podaj numer wiersza i numer pozycji w wierszu dla środkowego pola każdego z nich.
Przykład. Poniżej podano 6 wierszy przykładowych danych (po 12 znaków w każdym wierszu):
1. + * * + o * o + + * o +
2. + + + o o o o * o * * *
3. + o * o o o o * * + + +
4. * + * o o o o o o + + +
5. o * * o + + + o + + + +
6. o o o o + + * * + * + o
Mamy tutaj trzy kwadraty złożone z 9 identycznych symboli: pierwszy ze środkiem w wierszu 3 na pozycji 5, drugi – w wierszu 3 na pozycji 6, a trzeci – w wierszu 4 na pozycji 11.
Odpowiedź dla pliku symbole_przyklad.txt to:
1 6 3
(jeden kwadrat, który ma środkowe pole w wierszu 6, na pozycji 3).
Informacja do zadań 2.3 i 2.4
Każdy z napisów podanych w pliku symbole.txt będziemy traktować jako liczbę zapisaną w systemie trójkowym, w którym: znak o odpowiada cyfrze 0, znak + odpowiada cyfrze 1, znak * odpowiada cyfrze 2.
Zadanie 2.3. (0–2)
Podaj największą liczbę spośród liczb zapisanych w pliku symbole.txt. W odpowiedzi podaj tę liczbę w zapisie dziesiętnym oraz napis jej odpowiadający.
Odpowiedź dla pliku symbole_przyklad.txt to:
519789 ***+o*ooo++o
Zadanie 2.4. (0–3)
Oblicz sumę wszystkich liczb z pliku symbole.txt. Podaj jej wartość w zapisie dziesiętnym oraz w zapisie trójkowym z użyciem symboli: o, +, *.
Odpowiedź dla pliku symbole_przyklad.txt to:
4841542 +oooo****+oo+o+
Do oceny oddajesz:
- plik tekstowy
wyniki2.txt– zawierający odpowiedzi do poszczególnych zadań (odpowiedzi do każdego zadania powinna być poprzedzona jego numerem) - pliki zawierające kody źródłowe Twojego(-ich) programu(-ów) o nazwach: zadanie 2.1, zadanie 2.2, zadanie 2.3, zadanie 2.4.
Źródło: arkusz CKE MINP-R0-100-2505. Otwórz oryginalny PDF
Rozwiązanie
2.1. Odpowiedź z zasad oceniania CKE (napisy będące palindromami, w kolejności z pliku):
++o+o++o+o++
+*+**++**+*+
*+o++**++o+*
*oo*o**o*oo*
+*++*oo*++*+
+o++oooo++o+
Program — dla każdego wiersza sprawdzamy, czy napis jest równy odwróconemu:
with open("symbole.txt") as f:
for s in f:
s = s.strip()
if s == s[::-1]:
print(s)
2.2. Odpowiedź: 3 kwadraty o środkach (399, 5), (546, 2), (630, 11) — w pliku wynikowym: 3 399 5 546 2 630 11.
Plik traktujemy jako tablicę T[i][j] (2000 wierszy × 12 pozycji). Kwadrat 3×3 ze środkiem w (i, j) wymaga, by wszystkie 9 znaków T[i-1..i+1][j-1..j+1] było identyczne:
T = [l.strip() for l in open("symbole.txt")]
pozycje = []
for i in range(1, len(T) - 1):
for j in range(1, 11):
c = T[i][j]
if all(T[i + di][j + dj] == c for di in (-1, 0, 1) for dj in (-1, 0, 1)):
pozycje.append((i + 1, j + 1)) # numeracja od 1
print(len(pozycje), *[x for p in pozycje for x in p])
2.3. Odpowiedź: 531246, napis *******o+*+o.
2.4. Odpowiedź: 527865439, w zapisie symbolicznym ++oo*+oo*++ooo*o*++.
Wspólne funkcje do 2.3 i 2.4 (znak najbardziej z lewej to najstarsza cyfra trójkowa):
def wartosc(s):
v = 0
for c in s:
v = v * 3 + {"o": 0, "+": 1, "*": 2}[c]
return v
def zapis(n):
if n == 0:
return "o"
w = ""
while n > 0:
w = "o+*"[n % 3] + w
n //= 3
return w
napisy = [l.strip() for l in open("symbole.txt")]
najw = max(napisy, key=wartosc)
print(wartosc(najw), najw) # 2.3
suma = sum(wartosc(s) for s in napisy)
print(suma, zapis(suma)) # 2.4
Dla pliku przykładowego program daje 519789 ***+o*ooo++o oraz 4841542 +oooo****+oo+o+.
W 2.2 numeracja wierszy i pozycji jest od 1, a środek kwadratu nie może leżeć w pierwszym ani ostatnim wierszu ani na skrajnej pozycji (wyjście poza tablicę). W 2.3 i 2.4 znak najbardziej z lewej to najstarsza cyfra trójkowa, nie najmłodsza. W 2.1 bez usunięcia znaku końca wiersza (strip()) żaden napis nie wyjdzie palindromem. W 2.4 suma ma więcej niż 12 cyfr trójkowych, więc zapis wyniku trzeba wygenerować w całości, bez obcinania do 12 znaków.
Strona arkusza CKE z treścią zadania
Rozwiązanie krok po kroku
2.1 – palindromy
Czytamy plik wiersz po wierszu, każdy napis porównujemy z jego odwrotnością (s[::-1] w Pythonie). Te równe wypisujemy w kolejności pojawienia się w pliku.
2.2 – kwadraty 3×3
Konstruujemy tablicę 2D ze znakami z pliku. Iterujemy po wszystkich potencjalnych środkach (i ∈ 2..1999, j ∈ 2..11) i sprawdzamy, czy wszystkie 9 sąsiadujących znaków jest identycznych. Zliczamy i zapamiętujemy pary (wiersz, kolumna).
2.3 – suma w systemie trójkowym
Każdy 12-znakowy napis zamieniamy na liczbę trójkową (o=0, +=1, *=2), wartość najbardziej z lewej ma wagę 3^11. Sumujemy wartości wszystkich 2000 napisów. Wynik wypisujemy dziesiętnie i jako reprezentację symboliczną w systemie trójkowym.
2.4 – ekstrema lub liczby spełniające warunek
W zależności od dokładnej treści (na pełnym arkuszu) – analogiczna konwersja + agregacja: min/max/sortowanie/filtrowanie.
Rozumiesz, jak to rozwiązać?
Przećwicz podobne typy zadań w aplikacji
matury-online.pl ma tysiące zadań pogrupowanych po dziedzinach. Sprawdź, czy temat „zapis symboliczny, palindromy, kwadraty z symboli, kodowanie pozycyjne, przetwarzanie plików tekstowych” zrobisz samodzielnie.
Otwórz matury-online.pl