def kiir(ssz, szoveg):
    print('{}. feladat - {}'.format(ssz, szoveg))

# ------------------------------------------------------------------------------
# 1. Kérjen be a felhasználótól egy szöveget, majd határozza meg, hogy
#    hány különböző karakter található a szövegben! A darabszámot és a
#    karaktereket írja ki a képernyőre!
# ------------------------------------------------------------------------------
kiir(1, 'Karakterszámlálás')

def kul_kar(sz):
    volt_mar = set()  # sz szó betűinek halmaza lesz
    i = 0
    while i < len(sz):  # végignézzük a szó betűit
        if sz[i] not in volt_mar:  # ha adott betű még nem eleme a halmaznak,
            volt_mar.add(sz[i])  # akkor hozzáadjuk
        i += 1
    return len(volt_mar)  # a halmaz elemszáma a különböző betűk száma

sz = input('Kérek egy szót: ')
print('Különböző karakterek száma: ', kul_kar(sz))

# ------------------------------------------------------------------------------
# 2. Olvassa be a szotar.txt állományból a szavakat, és a következő feladatok
#   megoldása során ezekkel dolgozzon! Amennyiben nem tudja beolvasni az
#   állományból a szavakat, akkor az első 10 szóval dolgozzon!
# ------------------------------------------------------------------------------
kiir(2, 'Fájl beolvasása...')

fbe = open('szotar.txt', 'r')

szavak = []
for szo in fbe:
    szo = szo.rstrip()
    szavak.append(szo)

fbe.close()

# ------------------------------------------------------------------------------
# 3. Az állományból beolvasott szavakat alakítsa át úgy, hogy minden szó
#    karaktereit egyenként tegye ábécérendbe! Az így létrehozott szavakat
#    írja ki az abc.txt állományba az eredeti állománnyal egyező sorrendben!
# ------------------------------------------------------------------------------
kiir(3, 'Szavak rendezése, fájlírás (abc.txt)')


def szorendezo(sz):
    return ''.join(sorted(sz))

# sorted hatására rendezett listává esik szét a szó
# join hatására újra szöveggé áll össze
# pl.:   sz="bla" --> sorted: ['a','b','l']
#       join: 'abl'

fki = open('abc.txt', 'w')

for szo in szavak:
    print(szorendezo(szo), file=fki)

fki.close()

# ------------------------------------------------------------------------------
# 4. Kérjen be a felhasználótól két szót, és döntse el, hogy a két szó
#    anagramma-e! Ha azok voltak, írja ki a képernyőre az „Anagramma” szót,
#    ha nem, akkor pedig a „Nem anagramma” szöveget!
# ------------------------------------------------------------------------------
kiir(4, 'Két szó anagramma-e?')


def anagramma(sz1, sz2):
    sz1 = szorendezo(sz1)
    sz2 = szorendezo(sz2)
    return sz1 == sz2

sz1 = input('Kérem az első szót: ')
sz2 = input('Kérem a második szót: ')

if anagramma(sz1, sz2):
    print('Anagramma')
else:
    print('Nem anagramma')

# ------------------------------------------------------------------------------
# 5. Kérjen be a felhasználótól egy szót! A szotar.txt állomány szavaiból
#   keresse meg a szó anagrammáit (a szót önmagát is annak tekintve)! Ha van
#   találat, azokat egymás alá írja ki a képernyőre, ha nem volt találat,
#   akkor írja ki a „Nincs a szótárban anagramma” szöveget!
# ------------------------------------------------------------------------------
kiir(5, 'Anagrammák keresése adott szóhoz')

sz = input('Kérek egy szót: ')
db = 0
for szo in szavak:
    if anagramma(sz, szo):
        print(szo)
        db += 1
if db == 0:
    print('Nincs a szótárban anagramma!')

# ------------------------------------------------------------------------------
# 6. Határozza meg, hogy a szotar.txt állományban melyik a leghosszabb
#    szó! Ha több, ugyanannyi karakterből álló leghosszabb szó volt, akkor az
#    ugyanazokat a karaktereket tartalmazó szavakat (amelyek egymás
#    anagrammái) közvetlenül egymás alá írja ki! A feltételnek megfelelő
#    összes szó pontosan egyszer szerepeljen a kiírásban!
# ------------------------------------------------------------------------------
kiir(6, 'Leghosszabb szavak, anagrammák')

# rendezés hossz szerint, azon belül abc sorrendbe

for i in range(0, len(szavak) - 1):
    for j in range(i + 1, len(szavak)):
        if len(szavak[i]) < len(szavak[j]) or len(szavak[i]) == len(szavak[j]) and szavak[i] > szavak[j]:
            szavak[i], szavak[j] = szavak[j], szavak[i]

maxh = len(szavak[0])
print('Leghosszabb szó: ', szavak[0], end=' ')
i = 1
while len(szavak[i]) == maxh:
    while anagramma(szavak[i - 1], szavak[i]):
        print(szavak[i])
        i += 1
    i += 1

# ------------------------------------------------------------------------------
# 7. Rendezze a szotar.txt állományban lévő szavakat a karakterek száma szerint
#    növekvő sorrendbe! Az egyforma hosszúságú és ugyanazokat a karaktereket
#    tartalmazó szavak (amelyek egymás anagrammái) szóközzel elválasztva
#    ugyanabba a sorba kerüljenek! Az egyforma hosszúságú, de nem ugyanazokat
#    a karaktereket tartalmazó szavak külön sorba kerüljenek! A különböző
#    hosszúságú szavakat egy üres sorral különítse el egymástól! Az így
#    rendezett szavakat írja ki a rendezve.txt állományba!
# ------------------------------------------------------------------------------
kiir(7, 'Rendezés, anagammák, fájlírás')

fki = open('rendezve.txt', 'w')

szavak2 = []  # másolat: anagrammavizsgálathoz

for i in range(len(szavak)):
    szavak2.append(szorendezo(szavak[i]))

# rendezzük a másolatot szavak hossza szerint növekvő sorrendbe,
# és azon belül abc-rendbe egyszerű cserés rendezéssel
for i in range(0, len(szavak2) - 1):
    for j in range(i + 1, len(szavak2)):
        if len(szavak2[i]) > len(szavak2[j]) or len(szavak2[i]) == len(szavak2[j]) and szavak2[i] > szavak2[j]:
            szavak2[i], szavak2[j] = szavak2[j], szavak2[i]
            # a szavak eredeti állapotát együtt rendezzük az "anagrammás" másolattal
            szavak[i], szavak[j] = szavak[j], szavak[i]

# fájlbaírás
N = len(szavak)
for i in range(N):
    if i < N - 1 and len(szavak[i]) == len(szavak[i + 1]):  # ha azonos  a szavak hossza
        if szavak2[i] == szavak2[i + 1]:  # és anagrammák is, akkor egy sorba mehetnek
            print(szavak[i], end=' ', file=fki)
        else:
            print(szavak[i], file=fki)
    else:
        if i == N - 1:  # utolsó szó kiírása
            print(szavak[i], file=fki)
        else:
            print(szavak[i], file=fki)  # az i+1. már különböző hosszú,
            print('', file=fki)  # így az i. írása után üres sort is írunk

fki.close()