Przejdź do treści
Matura 2027 • Zadania praktyczne

Algorytmy Tekstowe (Stringi)

Przed Tobą 10 zadań testowych. Sprawdź, czy Twoja wiedza z działu Algorytmy Tekstowe (Stringi) wystarczy, by zdobyć komplet punktów na maturze.

Pytanie 1 / 10Programowanie
Najbardziej zwięzły, „pythoniczny” sposób na sprawdzenie, czy zmienna tekstowa `s` jest palindromem (czyta się tak samo od przodu i od tyłu) to:
Wszystkie 10 pytań z wyjaśnieniamiRozwiń, jeśli wolisz przejrzeć zestaw bez rozwiązywania testu.

Zadania ze słowami, hasłami i genetyką. Anagramy, palindromy, operacje na kodach ASCII oraz klasyczne szyfry (Cezara, Vigenère'a).

1.Najbardziej zwięzły, „pythoniczny” sposób na sprawdzenie, czy zmienna tekstowa `s` jest palindromem (czyta się tak samo od przodu i od tyłu) to:

  • A.`s == s.reversed()`
  • B.`s == s[::-1]`— poprawna
  • C.`s == reverse(s)`
  • D.`s.is_palindrome()`
Dlaczego: Zastosowanie notacji wycinania `[::-1]` odwraca ciąg znaków. Porównanie oryginalnego napisu z jego odwróconą wersją (np. `"kajak" == "kajak"`) to najszybszy sposób na sprawdzenie palindromu.

2.Jaki jest najkrótszy sposób na sprawdzenie, czy dwa słowa (zmienne `A` i `B`) są anagramami (składają się z dokładnie tych samych liter)?

  • A.`A == B`
  • B.`A.letters() == B.letters()`
  • C.`sorted(A) == sorted(B)`— poprawna
  • D.`set(A) == set(B)`
Dlaczego: Funkcja `sorted()` dzieli napis na listę pojedynczych znaków i sortuje je alfabetycznie. Jeśli dwa słowa są anagramami (mają te same litery w tej samej ilości), ich posortowane listy znaków będą identyczne. Zbiór `set()` usunąłby powielone litery, więc nie nadaje się do anagramów.

3.Która wbudowana funkcja w Pythonie zwraca liczbowy kod ASCII (lub Unicode) dla podanego pojedynczego znaku?

  • A.`ascii()`
  • B.`char()`
  • C.`ord()`— poprawna
  • D.`code()`
Dlaczego: Funkcja `ord()` (od *ordinal*) przyjmuje pojedynczy znak, np. `ord('A')`, i zwraca jego odpowiednik liczbowy w tablicy ASCII (czyli 65). Jest to absolutnie kluczowe we wszelkich zadaniach z szyfrowaniem.

4.Otrzymałeś po przekształceniach kod ASCII równy `66`. Jakiej funkcji użyjesz, aby zamienić tę liczbę z powrotem na znak tekstowy (literę 'B')?

  • A.`chr(66)`— poprawna
  • B.`str(66)`
  • C.`letter(66)`
  • D.`char(66)`
Dlaczego: Funkcja `chr()` (od *character*) działa odwrotnie do `ord()`. Przyjmuje kod liczbowy (np. wyliczony w Szyfrze Cezara) i zwraca odpowiadający mu znak ASCII jako typ string.

5.Szyfrując małą literę (od 'a' do 'z', kody ASCII od 97 do 122) Szyfrem Cezara o stałe przesunięcie `k`, poprawny wzór wykorzystujący operację modulo zapobiegającą wyjściu poza alfabet to:

  • A.`chr(ord(c) + k % 26)`
  • B.`chr((ord(c) + k) % 26)`
  • C.`chr((ord(c) - 97 + k) % 26 + 97)`— poprawna
  • D.`chr(ord(c) % 97 + k)`
Dlaczego: Zabieg `ord(c) - 97` sprowadza literę 'a' do zera, 'b' do 1 itd. Następnie dodajemy przesunięcie `k`, robimy `% 26` (bo alfabet łaciński ma 26 liter), by zapętlić na wypadek przekroczenia 'z', a na koniec z powrotem dodajemy 97, aby odzyskać zakres ASCII dla małych liter.

6.Czym z perspektywy programistycznej i koncepcyjnej różni się Szyfr Vigenère'a od klasycznego Szyfru Cezara?

  • A.W Szyfrze Vigenère'a wszystkie litery zamieniane są na odpowiadające im cyfry rzymskie.
  • B.W Szyfrze Vigenère'a przesunięcie nie jest stałe, lecz zależy od kodów kolejnych liter użytego słowa-klucza.— poprawna
  • C.Szyfr Vigenère'a wymaga znajomości liczb pierwszych, podczas gdy Cezar używa dowolnego klucza `k`.
  • D.Szyfr Vigenère'a polega na lustrzanym odbiciu alfabetu (np. A->Z, B->Y).
Dlaczego: Szyfr Vigenère'a to szyfr polialfabetyczny. Jeśli hasłem jest "TAJNE", pierwszą literę tekstu przesuwamy o kod litery 'T', drugą o kod litery 'A' i tak dalej (cyklicznie powtarzając klucz).

7.Jak szybko sprawdzić w języku Python, czy mniejszy wyraz `wzorzec` jest podciągiem (znajduje się wewnątrz) dłuższego napisu `tekst`?

  • A.`wzorzec in tekst`— poprawna
  • B.`tekst.contains(wzorzec)`
  • C.`tekst.includes(wzorzec)`
  • D.`wzorzec.is_substring(tekst)`
Dlaczego: Operator zawierania `in` to naturalny i wydajny sposób w Pythonie na sprawdzenie, czy jeden string stanowi fragment drugiego (zwraca `True` lub `False`).

8.Analizujesz genetyczny ciąg DNA: `sekwencja = "ACGTACGTAA"`. Jaka wbudowana metoda najszybciej zliczy, ile razy wystąpił w nim nukleotyd (litera) "A"?

  • A.`sekwencja.length("A")`
  • B.`sekwencja.find("A")`
  • C.`sekwencja.count("A")`— poprawna
  • D.`count(sekwencja, "A")`
Dlaczego: Metoda łańcuchowa `.count(wzorzec)` zlicza nienachodzące na siebie wystąpienia danego znaku lub podciągu w docelowym stringu.

9.O czym kluczowym należy pamiętać, próbując bezpośrednio modyfikować pojedyncze znaki w zmiennej typu string (np. przypisując `s[0] = 'X'`) przy szyfrowaniu?

  • A.Operacja powiedzie się, ale tylko dla wielkich liter.
  • B.Stringi w Pythonie są niezmienne (immutable). Ta operacja wyrzuci błąd. Trzeba zbudować nowy napis lub zrzutować na listę.— poprawna
  • C.Należy najpierw zaimportować moduł `strings`.
  • D.Znak zostanie podmieniony, ale dotychczasowa wielkość (długość) stringa ulegnie zresetowaniu.
Dlaczego: W Pythonie ciągi znaków (string) nie mogą być mutowane w miejscu. Zwykle przy algorytmach rozwiązuje się to tworząc pomocniczą pustą listę (lub string), do której `append()`-ujemy kolejne, przetworzone już znaki.

10.Na czym opiera się tzw. "naiwny" algorytm wyszukiwania wzorca w tekście, z którym uczeń może spotkać się na maturze?

  • A.Na wstępnym posortowaniu całego przeszukiwanego tekstu i zastosowaniu wyszukiwania binarnego.
  • B.Na stworzeniu hashów wszystkich możliwych wyrazów w tekście.
  • C.Na zgadywaniu położenia wzorca metodą funkcji losującej aż do znalezienia odpowiedniego wyniku.
  • D.Na przemieszczaniu wzorca o jedną pozycję wzdłuż tekstu od lewej do prawej i za każdym razem sprawdzaniu zgodności znak po znaku.— poprawna
Dlaczego: Algorytm naiwny porównuje pierwszy znak wzorca z pierwszym znakiem tekstu, potem drugi z drugim itd. Jeśli wykryje niezgodność, przesuwa całe poszukiwania o zaledwie jedno miejsce w prawo i zaczyna porównywanie od nowa. Ma złożoność O(nm)O(n \cdot m).

O czym musisz pamiętać w zadaniach z Programowania?

Zadania z programowania na maturze to sprawdzian logicznego myślenia, znajomości klasycznych algorytmów (np. sortowania, wyszukiwania, operacji na liczbach i napisach) oraz czytania ze zrozumieniem.

  • Pamiętaj, że w Pythonie indeksowanie struktur (jak listy czy napisy) zaczyna się od 0, natomiast w pseudokodzie CKE najczęściej od 1.
  • Zwracaj szczególną uwagę na poprawne wczytywanie danych – pamiętaj o rzutowaniu na odpowiednie typy (np. int()) i pozbywaniu się białych znaków (strip()).
  • Dbaj o złożoność obliczeniową. Jeśli to możliwe, unikaj wielokrotnie zagnieżdżonych pętli, aby Twój program zdążył się wykonać w regulaminowym czasie.

Strategia Maturalna (Python / Algorytmy):

"Zanim rzucisz się do pisania kodu na komputerze, zrozum problem na kartce papieru. Zawsze korzystaj z danych z pliku przyklad.txtw trakcie testowania swoich rozwiązań. Jeśli odpowiedź zgadza się z plikiem z odpowiedziami do przykładu, masz ogromne szanse, że Twój kod zadziała poprawnie również dla głównych danych z arkusza."

To nie koniec powtórki!

Przećwicz kolejny zestaw pytań i utrwal składnię oraz algorytmy.

Dalej: Wyszukiwanie i sortowanie