Wyjątkowe palindromy (podciągi bez zmiany kolejności)

Zadanie 8 z 8 · rozdział 12Trudność: 3 z 3napisypalindrompodnapisy

Treść zadania

Wczytaj słowo i znajdź wszystkie różne wyjątkowe palindromy, które są jego spójnymi fragmentami (podnapisami, czyli kolejnymi znakami słowa, np. slowo[i:j]).

Fragment jest wyjątkowym palindromem, jeśli:

  1. wszystkie jego znaki są identyczne (np. a, aaa), albo
  2. ma nieparzystą długość, a wszystkie jego znaki poza środkowym są identyczne (np. cbc, aabaa).

Dane wejściowe

  • 1. linia: słowo złożone z małych liter

Dane wyjściowe

Każdy wyjątkowy palindrom w osobnej linii, bez powtórzeń. Kolejność: od najkrótszych do najdłuższych, a palindromy tej samej długości — alfabetycznie.

Uwagi

  • Sprawdź wszystkie fragmenty slowo[i:j], a pasujące zbierz w zbiorze (set), żeby usunąć powtórzenia.
  • Wymaganą kolejność uzyskasz, przechodząc po długościach od 1 do długości słowa i dla każdej długości wypisując alfabetycznie (sorted) znalezione palindromy tej długości.

Przykład

Wejście
xxyxx
Wyjście
x
y
xx
xyx
xxyxx

Fragmenty xxy, xyxx itp. nie są wyjątkowymi palindromami. Palindrom xx występuje w słowie dwa razy, ale wypisujemy go raz.

Potrzebujesz teorii?

Zasady obowiązujące w rozdziale 12

Zadania w tym rozdziale dotyczą palindromów (napisów czytanych tak samo od przodu i od tyłu), anagramów (napisów złożonych z tych samych liter w innej kolejności) oraz permutacji liter słowa.

Konwencje wspólne:

  • Każde zadanie jest osobnym programem: czyta standardowe wejście i wypisuje wynik na standardowe wyjście.
  • Program nie wypisuje komunikatów typu „Podaj słowo:”.
  • Napis wczytuj jako całą linię. Spacje mogą w nim wystąpić tylko tam, gdzie treść mówi o zdaniu.
  • Słowo w zdaniu to fragment oddzielony od innych spacjami. Znaki interpunkcyjne (np. . , ! ? ; : -) stojące na początku lub końcu fragmentu nie należą do słowa (kara. → kara), a fragment złożony wyłącznie z interpunkcji nie jest słowem. W Pythonie: fragment.strip(string.punctuation) dla każdego fragmentu z zdanie.split().
  • Gdy zadanie każe ignorować wielkość liter, porównuj napisy np. po zamianie na małe litery (lower()), ale słowa wypisuj w postaci z wejścia (bez interpunkcji z brzegów).
  • Gdy wynikiem jest kilka napisów, wypisz każdy w osobnej linii. Jeśli nie ma żadnego — program nic nie wypisuje.

Zadanie pochodzi z otwartego zbioru Nauka-Programowania (z rozwiązaniami wzorcowymi). Zgłoś błąd w treści lub testach.

Python uruchomi się w przeglądarce przy pierwszym teście.

Kod zapisuje się automatycznie w tej przeglądarce. Tab wstawia wcięcie; aby opuścić edytor klawiaturą, naciśnij Esc, a potem Tab.

Testy

Program dostaje „Wejście” przez input() i musi wypisać „Oczekiwane wyjście”. Liczby porównywane są z tolerancją 0,01, a tekst podany w input("…") nie jest sprawdzany.

Test 1

Nie uruchomiono
Wejście
aaa
Oczekiwane wyjście
a
aa
aaa

Test 2

Nie uruchomiono
Wejście
aba
Oczekiwane wyjście
a
b
aba

Test 3

Nie uruchomiono
Wejście
abc
Oczekiwane wyjście
a
b
c

Test 4

Nie uruchomiono
Wejście
mnonopoo
Oczekiwane wyjście
m
n
o
p
oo
non
ono
opo

Test 5

Nie uruchomiono
Wejście
aabaa
Oczekiwane wyjście
a
b
aa
aba
aabaa

Test 6

Nie uruchomiono
Wejście
z
Oczekiwane wyjście
z

Test 7

Nie uruchomiono
Wejście
abcbaba
Oczekiwane wyjście
a
b
c
aba
bab
bcb
Uruchom z własnymi danymi