class Szo:
    def __init__(self, szo):
        self.szo = szo
        self.hossz = len(self.szo)

    def kodol(self, betu) -> int:
        """egy betu kodja"""
        if betu in ('A', 'B', 'C'):
            return 2
        elif betu in ('D', 'E', 'F'):
            return 3
        elif betu in ('G', 'H', 'I'):
            return 4
        elif betu in ('J', 'K', 'L'):
            return 5
        elif betu in ('M', 'N', 'O'):
            return 6
        elif betu in ('P', 'Q', 'R', 'S'):
            return 7
        elif betu in ('T', 'U', 'V'):
            return 8
        else:
            return 9

    def kod(self) -> int:
        """egy szo kodja"""
        kodszo = ''
        for betu in self.szo:
            kodszo += str(self.kodol(betu.upper()))
        return int(kodszo)

    def rovid(self) -> bool:
        """rovid szo-e"""
        return [False, True][self.hossz <= 5]


class Szavak:
    def __init__(self, szavak=None):
        if szavak is None:
            szavak = []
        self.szavak = szavak

    def maxhossz(self) -> int:
        """legnagyobb hossz"""
        return max(szo.hossz for szo in self.szavak)

    def leghosszabb(self) -> list:
        """leghosszabb szavak"""
        return [szo for szo in self.szavak if szo.hossz == self.maxhossz()]

    def leghosszabb_kiir(self):
        """leghosszabb szavak kiiír"""
        sz = 'A leghosszabb szavak (' + str(self.maxhossz()) + ' karakter): '
        for szo in self.leghosszabb():
            sz += szo.szo + ' '
        return sz

    def rovid_db(self) -> int:
        """rovid szavak szama"""
        return sum(1 for szo in self.szavak if szo.rovid())

    def kodok(self) -> list:
        """kodokat tartalmazo lista"""
        return [szo.kod() for szo in self.szavak]

    def kodok_kiir(self) -> str:
        """kodok szovegbe"""
        sz = ''
        for kod in self.kodok():
            sz += str(kod) + '\n'
        return sz

    def szamsor_szavai(self, szamsor) -> list:
        """adott kodhoz tartozo szavak"""
        return [szo for szo in self.szavak if szo.kod() == szamsor]

    def szamsor_szavai_kiir(self, szamsor) -> str:
        """adott kodhoz tartozo szavak szovegbe"""
        sz = ''
        for szo in self.szamsor_szavai(szamsor):
            sz += str(szo.szo) + ' '
        return sz

    def kodok_stat(self) -> list:
        """kodok szama"""
        stat = {}
        for kod in self.kodok():
            stat[kod] = stat.get(kod, 0) + 1
        stat = list(stat.items())
        return stat

    def tobb_kodok(self) -> list:
        """kodok, amelyekhez tobb szo is tartozik"""
        return [kod[0] for kod in self.kodok_stat() if kod[1] > 1]

    def tobb_kodu_szavak_kiir(self) -> str:
        """kodokhoz tartozo szavak kiir csoportositva kod szerint"""
        sz = ''
        for kod in self.tobb_kodok():
            for szo in self.szavak:
                if szo.kod() == kod:
                    sz += szo.szo + ' : ' + str(szo.kod()) + '; '
        return sz

    def legtobb_kodok(self):
        """legtobb kodok"""
        maxdb = max(self.kodok_stat(), key=lambda x: x[1])[1]
        return [kod[0] for kod in self.kodok_stat() if kod[1] == maxdb]

    def legtobb_kodok_kiir(self):
        sz = ''
        for kod in self.legtobb_kodok():
            sz += str(kod) + ': '
            for szo in self.szavak:
                if szo.kod() == kod:
                    sz += szo.szo + ' '
            sz += '\n'
        return sz


class Fajl:
    def __init__(self, fnev):
        self.fnev = fnev

    def beolvas(self):
        """fajl adatainak beolvasasa"""
        f = open(self.fnev)
        szavak = [Szo(x.strip()) for x in f.readlines()]
        f.close()
        return szavak

    def kiir(self, adatok):
        """fajlba iras"""
        f = open(self.fnev, 'w')
        print(adatok, end='', file=f)
        f.close()


# 1. feladat
betu = input("1. feladat:\nAdjon meg egy betüt: ").upper()
print("A betu kódja:", Szo(betu).kod())

# 2. feladat
szo = input("2. feladat:\nAdjon meg egy szót: ").upper()
print("A szónak megfelelő számsor:", Szo(szo).kod())

# 3. feladat
fajl = Fajl('szavak.txt')
adatok = fajl.beolvas()
szavak = Szavak(adatok)

# 4. feladat
print("4. feladat\n", szavak.leghosszabb_kiir(), sep='')

# 5. feladat
print("5. feladat\nRövid szavak száma:", szavak.rovid_db())

# 6. feladat
fajl = Fajl('kodokOOP.txt')
fajl.kiir(szavak.kodok_kiir())

# 7. feladat
szamsor = int(input("7. feladat: Adjon meg egy szamsort: "))
print("A kódnak megfelelő szavak:", szavak.szamsor_szavai_kiir(szamsor))

# 8. feladat
print("8. feladat:\nA több kódhoz tartozó szavak", szavak.tobb_kodu_szavak_kiir())

# 9. feladat
print("9. feladat\nA legtöbb kód és a hozzá tartozó szavak:")
print(szavak.legtobb_kodok_kiir())
