Szyfr Cezara, wyszukiwanie wzorca, operacje na lancuchach znakow
ð Podstawa programowa: II.1+I.2bW Pythonie lancuchy znakow (str) to sekwencje znakow, po ktorych mozna iterowac. Kazdy znak ma swoj kod ASCII/Unicode.
# Kody znakow
print(ord('A')) # 65
print(ord('a')) # 97
print(ord('Z')) # 90
print(chr(65)) # 'A'
print(chr(97)) # 'a'
# Przydatne metody
tekst = "Hello World"
print(tekst.upper()) # HELLO WORLD
print(tekst.lower()) # hello world
print(tekst.find("lo")) # 3 (indeks pierwszego wystapienia)
print(tekst.count("l")) # 3
print(tekst.replace("World", "Python")) # Hello Python
def szyfruj_cezar(tekst, klucz):
"""Szyfruje tekst szyfrem Cezara z podanym kluczem."""
wynik = ""
for znak in tekst:
if znak.isalpha():
# Okreslamy baze (wielka lub mala litera)
baza = ord('A') if znak.isupper() else ord('a')
# Przesuwamy i zawijamy w zakresie 26 liter
nowy_kod = (ord(znak) - baza + klucz) % 26 + baza
wynik += chr(nowy_kod)
else:
wynik += znak # znaki niealfabetyczne bez zmian
return wynik
# Deszyfrowanie - przesuniecie w odwrotnym kierunku
def deszyfruj_cezar(tekst, klucz):
return szyfruj_cezar(tekst, -klucz)
zaszyfrowany = szyfruj_cezar("ATAK O SWICIE", 3)
print(zaszyfrowany) # DWDN R VZLFH
odszyfrowany = deszyfruj_cezar(zaszyfrowany, 3)
print(odszyfrowany) # ATAK O SWICIE
Algorytm naiwny - porownywanie znak po znaku:
def szukaj_wzorca(tekst, wzorzec):
"""Wyszukuje wszystkie wystapienia wzorca w tekscie."""
pozycje = []
n = len(tekst)
m = len(wzorzec)
for i in range(n - m + 1):
znaleziono = True
for j in range(m):
if tekst[i + j] != wzorzec[j]:
znaleziono = False
break
if znaleziono:
pozycje.append(i)
return pozycje
tekst = "ala ma ala kota i ala ma psa"
print(szukaj_wzorca(tekst, "ala")) # [0, 7, 18]
def czy_palindrom(tekst):
"""Sprawdza, czy tekst jest palindromem."""
tekst = tekst.lower().replace(" ", "")
return tekst == tekst[::-1]
print(czy_palindrom("kajak")) # True
print(czy_palindrom("Kobyła ma mały bok".replace("ł","l").replace("ó","o")))
# True (po uproszczeniu)
Napisz program, ktory pyta uzytkownika o tekst i klucz (przesuniecie), a nastepnie wyswietla zaszyfrowany i odszyfrowany tekst. Przetestuj dla roznych kluczy.
def szyfruj_cezar(tekst, klucz):
wynik = ""
for znak in tekst:
if znak.isalpha():
baza = ord('A') if znak.isupper() else ord('a')
wynik += chr((ord(znak) - baza + klucz) % 26 + baza)
else:
wynik += znak
return wynik
tekst = input("Podaj tekst: ")
klucz = int(input("Podaj klucz (przesuniecie): "))
zaszyfrowany = szyfruj_cezar(tekst, klucz)
odszyfrowany = szyfruj_cezar(zaszyfrowany, -klucz)
print(f"Zaszyfrowany: {zaszyfrowany}")
print(f"Odszyfrowany: {odszyfrowany}")
Napisz program, ktory wczytuje tekst i wyswietla: liczbe znakow, slow, zdan (kończacych sie na . ? !), oraz najczesciej wystepujaca litere.
tekst = input("Podaj tekst: ")
znaki = len(tekst)
slowa = len(tekst.split())
zdania = tekst.count('.') + tekst.count('?') + tekst.count('!')
# Najczessza litera
licznik = {}
for znak in tekst.lower():
if znak.isalpha():
licznik[znak] = licznik.get(znak, 0) + 1
if licznik:
najczestsza = max(licznik, key=licznik.get)
print(f"Znakow: {znaki}")
print(f"Slow: {slowa}")
print(f"Zdan: {zdania}")
print(f"Najczestsza litera: '{najczestsza}' ({licznik[najczestsza]} razy)")
Napisz program z wlasna funkcja wyszukiwania wzorca (bez uzycia .find()). Program wyswietla wszystkie pozycje, na ktorych znaleziono wzorzec w tekscie.
def szukaj(tekst, wzorzec):
pozycje = []
for i in range(len(tekst) - len(wzorzec) + 1):
pasuje = True
for j in range(len(wzorzec)):
if tekst[i + j] != wzorzec[j]:
pasuje = False
break
if pasuje:
pozycje.append(i)
return pozycje
tekst = input("Podaj tekst: ")
wzorzec = input("Podaj wzorzec: ")
wyniki = szukaj(tekst, wzorzec)
if wyniki:
print(f"Znaleziono '{wzorzec}' na pozycjach: {wyniki}")
print(f"Liczba wystapien: {len(wyniki)}")
else:
print("Wzorzec nie zostal znaleziony.")
Napisz program, ktory probuje zlamac szyfr Cezara metoda brute-force - wyswietla odszyfrowany tekst dla wszystkich 25 mozliwych kluczy. Uzytkownik sam ocenia, ktory wynik jest poprawny.
def szyfruj_cezar(tekst, klucz):
wynik = ""
for znak in tekst:
if znak.isalpha():
baza = ord('A') if znak.isupper() else ord('a')
wynik += chr((ord(znak) - baza + klucz) % 26 + baza)
else:
wynik += znak
return wynik
zaszyfrowany = input("Podaj zaszyfrowany tekst: ")
print("\nProbowanie wszystkich kluczy:")
print("-" * 50)
for klucz in range(1, 26):
odszyfrowany = szyfruj_cezar(zaszyfrowany, -klucz)
print(f"Klucz {klucz:2}: {odszyfrowany}")