Notes and Talks/UJEP/PRG1/05/palindrom

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:

Ú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() ?