Zadanie 2
Matura z informatyki, maj 2025, poziom rozszerzony
Wymaganie: III.2, III.3 – pisanie programów przetwarzających pliki tekstowe; II.4 – konwersja między systemami liczbowymi; II.1 – analiza struktur danych 2D.
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:
ooo+**+ooo
(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 z 1 napisem (z najwyższym, liczącym 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 + *
5. o * * 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órego ś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–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+
Zadanie 2.4. (0–3)
(treść zadania 2.4 – zaznaczanie kolejnych podzadań w arkuszu)
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. Algorytm – dla każdej linii sprawdź czy s == s[::-1]:
with open("symbole.txt") as f:
for nr, s in enumerate(f, 1):
s = s.strip()
if s == s[::-1]:
print(s)
Dla pliku przykładowego: ooo+**+ooo.
2.2. Reprezentujemy plik jako tablicę 2D T[i][j] (i – numer wiersza 1..2000, j – pozycja 1..12). Kwadrat 3×3 ze środkiem w (i, j) (i ∈ 2..1999, j ∈ 2..11) wymaga, by wszystkie 9 znaków T[i-1..i+1][j-1..j+1] było identyczne:
T = [list(l.strip()) for l in open("symbole.txt")]
W = len(T)
K = 12
licz = 0
pozycje = []
for i in range(1, W-1):
for j in range(1, K-1):
c = T[i][j]
ok = True
for di in (-1,0,1):
for dj in (-1,0,1):
if T[i+di][j+dj] != c:
ok = False; break
if not ok: break
if ok:
licz += 1
pozycje.append((i+1, j+1)) # numerowanie od 1
print(licz)
for w, p in pozycje:
print(w, p)
2.3. Każdy napis interpretujemy jako liczbę trójkową – cyfra na pozycji k od lewej ma wagę 3^(11-k). Sumujemy wszystkie 2000 liczb. Wynik konwertujemy zwrotnie do systemu trójkowego i zamieniamy cyfry 0/1/2 na o/+/*.
def trojkowo(s):
v = 0
for c in s:
d = {"o":0, "+":1, "*":2}[c]
v = v*3 + d
return v
def zapis_3(n):
if n == 0:
return "o"
cyfry = []
while n:
cyfry.append(n % 3); n //= 3
return "".join({0:"o",1:"+",2:"*"}[c] for c in reversed(cyfry))
suma = sum(trojkowo(l.strip()) for l in open("symbole.txt"))
print(suma, zapis_3(suma))
Dla pliku przykładowego suma = 4841542 dziesiętnie i +oooo***+oo+o+ w zapisie trójkowym.
2.4. (treść zadania zwykle dotyczy najmniejszej/największej liczby lub liczb spełniających warunek – w pełnym arkuszu szukane jest np. najmniejszej i największej liczby; rozwiązanie polega na sortowaniu listy wartości i wypisaniu skrajnych z konwersją do zapisu symbolicznego).
W 2.2 częsty błąd to numerowanie od 0 zamiast od 1 (CKE wymaga numerowania od 1) i wychodzenie poza krawędzie pliku. W 2.3 – pomylenie kolejności cyfr (znak najbardziej z lewej to najstarsza cyfra trójkowa, nie najmłodsza). W 2.1 – pomijanie strip() powoduje, że palindrom z \n na końcu zwraca False.
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