Palindromy
Na přednášce byl (nebo bude) sestaven program, který ověřoval, zda zadaný řetězec (věta) je palindrom. Při testu českých palindromů se ignoruje:
velikost písmen
čárky a kroužek nad: á, é, í, ó, ú, ů, ý
číslice
mezery a jiné speciální znaky
Úloha:
Napište program na rozpoznání palindromu.
Možné řešení:
pythondef onlyAlpha(s):
""" Ponechá jen písmena. """
s2 = ''
for c in s:
if c.isalpha():
s2 += c
return s2
def shortenVowels(s):
""" Předpokládá malá písmena, zkrátí samohlásky. """
t1 = 'áéíóúůý' # tyto nahradí
t2 = 'aeiouuy' # těmito
for i in range(len(t1)):
s = s.replace(t1[i],t2[i])
return s
def isReversible(s):
""" Je s stejný i po obrácení? """
for i in range(len(s)//2): # stačí jít do poloviny
if s[i] != s[-i-1]: # pokud písmeno počítané od začátku je jiné než od konce
return False # předčasný návrat
return True # předčasný návrat nenastal, s je reverzibilní
# vstup, konverze na malá písmena
s = input('Věta: ').lower()
isPalindrom = isReversible(shortenVowels(onlyAlpha(s)))
print(isPalindrom)
# K zamyšlení:
# isReversible() zjišťuje, zda je řetězec po obrácení stejný,
# pomocí tzv. "in-place" algoritmu, tj. bez nutnosti vytvářet kopie
# dat, jak tomu je např. při použití výrazu s==s[::-1].
# Bylo by možné napsat celý program na rozeznání palindromu
# aniž by se vytvářely jakékoli kopie vstupního řetězce,
# jako to zde dělají funkce onlyAlpha() a shortenVowels() ?