I Liceum Ogólnokształcące w Jarosławiu – Informatyka

Algorytmy na tekstach Python / str

Streszczenie zagadnień: indeksowanie znaków, podstawy Unicode (chr/ord), walidacja e‑mail, usuwanie duplikatów słów oraz wyszukiwanie wzorca (algorytm naiwny).

1. Tekst w programowaniu

2. Poprawność adresów e‑mail

Adres uznajemy za poprawny, jeśli spełnia m.in. warunki:

  1. Występuje dokładnie jeden znak @ i nie znajduje się on na początku/końcu.
  2. Po @ jest co najmniej jedna kropka . – nie bezpośrednio po nim i nie na końcu.

3. Usuwanie „dubletów” (powtórzeń sąsiadujących słów)

Czytamy kolejne słowa i budujemy listę wyniku tak, by nie dodawać słowa identycznego jak poprzednie. Typowe użycie: lista zakupów, gdzie dane mogą zawierać powtórzenia.

4. Wyszukiwanie wzorca w tekście (naiwne)

  1. Dla każdej możliwej pozycji w tekście sprawdź zgodność kolejnych znaków z wzorcem.
  2. Jeśli całość pasuje – zwróć pozycję (liczbę znaków poprzedzających dopasowanie). W przeciwnym razie zwróć -1.

Zadania

Zadanie 1 – walidacja e‑mail

Napisz program, który wczytuje jeden adres e‑mail i informuje, czy jest poprawny (wg zasad z punktu 2).

Zadanie 2 – porównanie dwóch e‑maili

Program pobiera dwa adresy e‑mail. Jeśli są identyczne i oba poprawne – wypisz „Adres poprawny”. W przeciwnym razie wypisz odpowiedni komunikat błędu.

Zadanie 3 – usuwanie duplikatów słów

Wczytuj słowa (po jednym w linii) aż do napisu ***. Wypisz listę bez sąsiadujących powtórzeń w jednej linii, rozdzieloną spacją.

Zadanie 4 – wyszukaj wzorzec

Wczytaj tekst wielkimi literami oraz wzorzec, a następnie zwróć pozycję pierwszego dopasowania (albo -1 jeśli go nie ma).

Rozwiązania (Python)

Rozwiązanie 1 – walidacja e‑mail

def poprawny_email(adres: str) -> bool:
    # warunek 1: dokładnie jeden znak '@' i nie na brzegach
    if adres.count('@') != 1:
        return False
    i = adres.index('@')
    if i == 0 or i == len(adres) - 1:
        return False

    # warunek 2: jest kropka po '@' (nie tuż po nim i nie na końcu)
    po = adres[i+1:]
    if '.' not in po:
        return False
    if po[0] == '.' or po[-1] == '.':
        return False
    return True


if __name__ == '__main__':
    a = input('Podaj adres e-mail: ').strip()
    print('Poprawny' if poprawny_email(a) else 'Niepoprawny')

Rozwiązanie 2 – porównanie dwóch e‑maili

def poprawny_email(adres: str) -> bool:
    if adres.count('@') != 1:
        return False
    i = adres.index('@')
    if i == 0 or i == len(adres) - 1:
        return False
    po = adres[i+1:]
    return ('.' in po) and (po[0] != '.') and (po[-1] != '.')

a1 = input('Podaj e-mail: ').strip()
a2 = input('Powtórz e-mail: ').strip()

if a1 != a2:
    print('Podane adresy e-mail są różne!')
else:
    print('Adres poprawny' if poprawny_email(a1) else 'Adres ma złą strukturę')

Rozwiązanie 3 – usuwanie duplikatów słów

WYNIK = []
poprzedni = None

while True:
    w = input().strip()
    if w == '***':
        break
    if w != poprzedni:
        WYNIK.append(w)
    poprzedni = w

print(' '.join(WYNIK))

Rozwiązanie 4 – wyszukaj wzorzec (naiwny)

def znajdz_wzorzec(tekst: str, wzorzec: str) -> int:
    n, m = len(tekst), len(wzorzec)
    for start in range(0, n - m + 1):
        j = 0
        while j < m and tekst[start + j] == wzorzec[j]:
            j += 1
        if j == m:
            return start
    return -1

if __name__ == '__main__':
    tekst = input('Tekst (WIELKIMI literami): ').strip()
    wzorzec = input('Wzorzec: ').strip()
    print('Pozycja:', znajdz_wzorzec(tekst, wzorzec))

Notatka – Unicode i ASCII

Do konwersji między znakami a kodami użyj: ord(znak) → liczba, chr(liczba) → znak. Możesz wypisać zakres znaków, iterując po kodach i konwertując je funkcją chr.