Implementacja algorytmow przetwarzania tekstu w Pythonie
ð Podstawa programowa: II.1+I.2bLancuchy tekstowe (stringi) w Pythonie sa niemutowalne - kazda operacja tworzy nowy string. Przypomnijmy najwazniejsze metody:
tekst = "Informatyka jest super!"
print(tekst.upper()) # INFORMATYKA JEST SUPER!
print(tekst.lower()) # informatyka jest super!
print(tekst.find("jest")) # 13 (indeks poczatku)
print(tekst.replace("super", "fajna")) # Informatyka jest fajna!
print(tekst.split()) # ['Informatyka', 'jest', 'super!']
print(tekst[0:11]) # Informatyka
print(tekst[::-1]) # !repus tsej akytamrofnI
Szyfr Cezara polega na przesunieciu kazdej litery o ustalona liczbe pozycji w alfabecie:
def szyfr_cezara(tekst, klucz):
wynik = ""
for znak in tekst:
if znak.isalpha():
baza = ord('A') if znak.isupper() else ord('a')
nowy = chr((ord(znak) - baza + klucz) % 26 + baza)
wynik += nowy
else:
wynik += znak
return wynik
def deszyfr_cezara(tekst, klucz):
return szyfr_cezara(tekst, -klucz)
zaszyfrowany = szyfr_cezara("Python jest super", 3)
print(zaszyfrowany) # Sbwkrq mhvw vxshu
print(deszyfr_cezara(zaszyfrowany, 3)) # Python jest super
Algorytm naiwny przeszukuje tekst, sprawdzajac kazda mozliwa pozycje:
def wyszukaj_wzorzec(tekst, wzorzec):
pozycje = []
n = len(tekst)
m = len(wzorzec)
for i in range(n - m + 1):
if tekst[i:i+m] == wzorzec:
pozycje.append(i)
return pozycje
tekst = "ala ma ala kota a ala ma psa"
print(wyszukaj_wzorzec(tekst, "ala")) # [0, 7, 18]
def czy_palindrom(tekst):
tekst = tekst.lower().replace(" ", "")
return tekst == tekst[::-1]
def czy_anagram(s1, s2):
return sorted(s1.lower().replace(" ", "")) == sorted(s2.lower().replace(" ", ""))
print(czy_palindrom("kajak")) # True
print(czy_palindrom("Kobyła ma mały bok".replace("ł", "l"))) # True
print(czy_anagram("listen", "silent")) # True
ord(znak) zwraca kod numeryczny znaku, a chr(kod) zwraca znak o danym kodzie. Np. ord('A') = 65, chr(97) = 'a'.
Napisz program, ktory dla podanego tekstu wyswietla: liczbe znakow, liczbe slow, liczbe zdan (koncza sie '.', '!', '?'), liczbe samoglosek i spolglosek, oraz najdluzsze slowo.
def statystyki(tekst):
samogloski = "aeiouAEIOU"
slowa = tekst.split()
zdania = sum(1 for z in tekst if z in ".!?")
sam = sum(1 for z in tekst if z in samogloski)
spol = sum(1 for z in tekst if z.isalpha() and z not in samogloski)
najdl = max(slowa, key=len)
print(f"Znakow: {len(tekst)}")
print(f"Slow: {len(slowa)}")
print(f"Zdan: {zdania}")
print(f"Samoglosek: {sam}")
print(f"Spolglosek: {spol}")
print(f"Najdluzsze slowo: {najdl}")
statystyki("Python jest super. Programowanie to swietna zabawa!")
Napisz program, ktory probuje zlamac szyfr Cezara metoda brute force - wyswietla wszystkie 25 mozliwych odszyfrowanych wersji. Przetestuj na tekscie: "Mdyd Sbwkrq!" (klucz 3).
def lam_cezara(tekst):
for klucz in range(1, 26):
odszyfrowany = ""
for znak in tekst:
if znak.isalpha():
baza = ord('A') if znak.isupper() else ord('a')
odszyfrowany += chr((ord(znak) - baza - klucz) % 26 + baza)
else:
odszyfrowany += znak
print(f"Klucz {klucz:2d}: {odszyfrowany}")
lam_cezara("Mdyd Sbwkrq!")
Napisz funkcje generujaca losowe haslo o podanej dlugosci, ktore zawiera co najmniej: 1 wielka litere, 1 mala litere, 1 cyfre i 1 znak specjalny. Uzyj modulu random i string.
import random
import string
def generuj_haslo(dlugosc=12):
if dlugosc < 4:
return "Haslo musi miec min. 4 znaki"
haslo = [
random.choice(string.ascii_uppercase),
random.choice(string.ascii_lowercase),
random.choice(string.digits),
random.choice("!@#$%^&*")
]
wszystkie = string.ascii_letters + string.digits + "!@#$%^&*"
haslo += [random.choice(wszystkie) for _ in range(dlugosc - 4)]
random.shuffle(haslo)
return "".join(haslo)
for _ in range(5):
print(generuj_haslo(16))
Zaimplementuj szyfr plotkowy (Rail Fence Cipher) z 3 szynami. W tym szyfrze tekst jest zapisywany zygzakiem na n wierszach, a nastepnie odczytywany wiersz po wierszu. Napisz funkcje szyfrujaca i deszyfrujaca.