
# -----------------------------------------------------------------------------------------------
# 1. A konyv.txt szöveges állomány egy könyvet ábrázoló ASCII-ábrát tartalmaz. Olvassa be
#    ezt az állományt, és jelenítse meg a tartalmát a képernyőn!
# -----------------------------------------------------------------------------------------------
def beolvas(fajl):
    abra = []
    with open(fajl, 'r') as fbe:
        for sor in fbe:                 # a fájl minden sorát szövegként (enterek nélkül) olvassuk be
            sor = sor.strip('\n')
            abra.append(sor)            # ezekkel a szöveggel töltjuk fel a listánkat (ábra)
    return abra
# -----------------------------------------------------------------------------------------------
# 2. Jelenítse meg többször egymás mellett a konyv.txt állományban található ábrát! Kérje be
#    a felhasználótól az ábra ismétlődéseinek számát! Az ábrák után elválasztásként a „ | ”
#    karakterláncot jelenítse meg! Ügyeljen arra, hogy az egyes sorok különböző hosszúságúak
#    is lehetnek. Azt nem kell ellenőriznie, hogy az ábra az adott ismétlésszámmal valóban elfére
#    egymás mellett a képernyőn.
# -----------------------------------------------------------------------------------------------
def kiir(abra, ism, fajl):      # kiiras paraméterezése: lista, ismétlésszám, fájlba is kell-e írni?
    if fajl != '':
        fki = open(fajl, 'w')
    if ism == 1:
        ende = ''
    else:
        ende = ' | '            # ha van ismétlés, akkor ez az "elválasztó" karaktersorozat
    # max fv. megadja azt a szöveget, ami a leghosszabb, lambda kifejezéssel szabályozzuk, hogy
    # mit vizsgáljon maximumkereséskor - itt most a szövegek hosszát (len)
    # len fv. a végén --> a leghosszabb szöveg karakterszáma (hossza)
    maxhossz = len(max(abra, key = lambda x: len(x)))
    for sor in abra:
        for i in range(ism):
            # ljust() fv. szóközökkel tölti fel a szöveget, úgy hogy a szöveg balra kerül, a szóközök jobbra
            sor = sor.ljust(maxhossz)       # ez azért kell, hogy a ' | ' jó helyre kerüljön a képernyőn
            print(sor, end = ende)
            if  fajl != '':
                print(sor, end = ende, file = fki)
        print()     # minden sor után soremelés kell
        if  fajl != '':
            print(file = fki)
    if  fajl != '':
        fki.close()
# -----------------------------------------------------------------------------------------------
# 3. Készítsen függvényt atalakit néven, amely egy tömörített ábra egy sorát tömörítetlen
#    formára alakítja! (Egy tömörített sor legfeljebb 200 karakterből állhat.)
# -----------------------------------------------------------------------------------------------
def atalakit(blokkok):
    tomoritetlen = ''               # egy szöveget építünk fel
    for i in range(len(blokkok)):
        if i % 2 == 0:              # a blokkok szöveget indexeljük, páros indexen vannak a számok
            x = int(blokkok[i])     # x db jelet kell majd ismételni
        else:
            # blokkok[i] karakter ismétlése x-szer
            tomoritetlen += blokkok[i] * x      # így a legegyszerűbb Pythonban a megfelelő ismétlés
    return tomoritetlen
# -----------------------------------------------------------------------------------------------
# 4. Az szg_t.txt állomány tömörített formában tartalmaz egy rajzot. Alakítsa a tömörített
#    ábrát tömörítetlen formába az atalakit függvény használatával, és szg.txt néven mentse el az 
#    eredményt, valamint jelenítse meg azt a képernyőn!
# -----------------------------------------------------------------------------------------------
def szg(fajlin, fajlout):
    print('4. feladat')
    forras = beolvas(fajlin)        # beolvas modul itt is felhasználható
    abra = []                       # abra uj lista
    for sor in forras:              
        abra.append(atalakit(sor))  # tömörített "szövegsorok" átalakítása az atalakit modullal
    kiir(abra, 1, fajlout)          # "általánosított" kiir modul fájlba írással
# -----------------------------------------------------------------------------------------------
# 5. Izgalmas kérdés, hogy egy-egy ábrát milyen mértékben sikerült tömöríteni a fenti
#    módszerrel. Kérje be a felhasználótól a tömörített, valamint tömörítetlen adatokat
#    tartalmazó fájl neveit majd írja ki, hogy az egyes állományok hány karaktert tartalmaznak!
#    A sorvégjel karaktereket (\r\n) ne vegye figyelembe! A következő sorban jelenítse meg
#    a tömörítési arányt két tizedesjegyre kerekítve! A tömörítési arány a tömörített ábra
#    karakterszáma osztva a tömörítetlen ábra karaktereinek számával.
# -----------------------------------------------------------------------------------------------  
def tomorites_vizsgalat():
    print('5. feladat')
    # szöveges fájlok esetén a read() művelet a teljes fájltartalmat egy szövegbe olvassa be  
    t1 = open(input('Kérem adja meg a tömörített ábra fájlnevét: '), 'r').read()           # konyv_t.txt
    t2 = open(input('Kérem adja meg a tömörítetlen ábra fájlnevét: '), 'r').read()         # konyv.txt
    t1_hossz = len(t1) - t1.count('\n')         # szöveg esetén is használhatjuk a count metódust 
    t2_hossz = len(t2) - t2.count('\n')         # az enterek megszámlálására
    print(f'A karakterek száma a tömörített állományban: {t1_hossz}')       # enterek nélküli szöveghosszak
    print(f'A karakterek száma a tömörítetlen állományban: {t2_hossz}')
    print(f'A tömörítési arány: {t1_hossz/t2_hossz:.2f}')                   # valós szám, két tizedesjeggyel
# -----------------------------------------------------------------------------------------------
# 6. Készítsen statisztikát a konyv_t.txt állományban található ábráról! A képernyőn jelenjen
#    meg, hogy az ábra hány sorból áll, hány blokkot tartalmaz, valamint hogy mekkora az ábra
#    szélessége karakterekben. Utóbbi adat a leghosszabb sor karakterszámát jelenti.
# -----------------------------------------------------------------------------------------------
def statisztika(fajl):
    print('6. feladat')
    abra = beolvas(fajl)                # ez az előnye a modulok használatának
    print(f'Az ábra magassága sorokban: {len(abra)}')
    hosszak = []            # az egyes sorok milyen hosszúak lesznek, azt tároljuk...
    blokkok = 0             # hány blokk van összesen a tömörített dormulában...
    for sor in abra:        # abra lista szövegeinek bejárása
        hossz = 0           # egy aktuális sor hány karakteres lesz a blokkok alapján
        for i in range(len(sor)):
            if i % 2 == 0:              # páros indexeken vannak a számok (lsd. 3. feladat is)
                hossz += int(sor[i])    # hossz "akkumulálása"
                blokkok += 1            # blokkok számolása
        hosszak.append(hossz)           # hosszak lista bővítése
    maxhossz = max(hosszak)
    print(f'Az ábra szélessége karakterekben: {maxhossz}')      # a válasz a leghosszabb érték
    print(f'A blokkok száma: {blokkok}')
# -----------------------------------------------------------------------------------------------
#                                           FŐMODUL
# -----------------------------------------------------------------------------------------------
if __name__ == '__main__':
    print('1. feladat')
    konyv = beolvas('konyv.txt')
    kiir(konyv, 1, '')
    print('2. feladat')
    ism = int(input('Kérem adja meg az ismétlések számát: '))
    kiir(konyv, ism, '')
    szg('szg_t.txt', 'szg.txt')
    tomorites_vizsgalat()
    statisztika('konyv_t.txt')