from math import sqrt as negyzetgyok    # 6. feladathoz kell

#---------------------------------------------------------
# 1. Olvassa be a jel.txt állomány tartalmát, tárolja el a
#    rögzített jelek adatait, és azok felhasználásával 
#    oldja meg a következő feladatokat!    
#---------------------------------------------------------
jelek=[]    # ez lesz a "mátrix", globális adat

def F1():   # első feladat modulja
    
    fbe=open('jel.txt','r')
    for sor in fbe:     # fájl sorainak ciklikus feldolgozás
        sor=sor.strip().split()  # pl. sor: ['3', '11', '19', '122', '644']
        for i in range(len(sor)):   # sor elemeinek integerekké alakítása
            sor[i]=int(sor[i])
        jelek.append(sor)       # mátrix feltöltése a "kis" listákkal
    fbe.close()
    
    # a fenti 7 sor röviden így is lehetne:
    global jelek2
    jelek2=[list(map(int,sor.strip().split())) for sor in open('jel.txt','r')]
    # így a további feladatokat a jelek2-vel kell elképzelni...

#---------------------------------------------------------
# 2. Kérje be a felhasználótól egy jel sorszámát
#    (a sorszámozás 1-től indul), és írja a képernyőre
#    az adott jeladáshoz tartozó x és y koordinátát!
#---------------------------------------------------------
def F2():
    print('2. feladat')
    sorszam=int(input('Adja meg a jel sorszámát! '))
    x=jelek[sorszam-1][3]       # -1 az index és sorszám különbsége miatt
    y=jelek[sorszam-1][4]
    print(f'x={x} y={y}\n')     # \n, hogy legyen egy plusz soremelés

#---------------------------------------------------------    
# 3. Készítsen függvényt eltelt néven, amely megadja, hogy
#    a paraméterként átadott két időpont között hány
#    másodperc telik el! A két időpontot, mint paramétert
#    tetszőleges módon átadhatja. Használhat három-három
#    számértéket, két tömböt vagy listát, de más, a célnak
#    megfelelő típusú változót is. Ezt a függvényt később
#    használja fel legalább egy feladat megoldása során!
#---------------------------------------------------------
def eltelt(o1,p1,m1,o2,p2,m2):
    eltelt_mp=(o2*3600+p2*60+m2)-(o1*3600+p1*60+m1)
    return eltelt_mp

#---------------------------------------------------------
# 4. Adja meg, mennyi idő telt el az első és az utolsó
#    észlelés között! Az időt óra:perc:mperc alakban írja
#    a képernyőre!
#---------------------------------------------------------
def F4():
    print('4. feladat')
    elso=jelek[0]
    e_o = elso[0]
    e_p = elso[1]
    e_mp= elso[2]
    
    utolso=jelek[-1]
    u_o = utolso[0]
    u_p = utolso[1]
    u_mp= utolso[2]
    eltelt_ido=eltelt(e_o,e_p,e_mp,u_o,u_p,u_mp)
    
    # másodpercben adott idő óra:perc:másodperc alakra bontása:
    ora=eltelt_ido//3600        # // osztás egész részét adja
    perc=(eltelt_ido%3600)//60  # % osztás maradékát adja
    masodperc=(eltelt_ido%3600)%60
    print(f'Időtartam: {ora}:{perc}:{masodperc}\n')

#---------------------------------------------------------
# 5. Határozza meg azt a legkisebb, a koordináta-rendszer
#    tengelyeivel párhuzamos oldalú téglalapot, amelyből
#    nem lépett ki a jeladó! Adja meg a téglalap bal alsó
#    és jobb felső sarkának koordinátáit!
#---------------------------------------------------------
def F5():
    print('5. feladat')
    x_koord=[jel[3] for jel in jelek]
    y_koord=[jel[4] for jel in jelek]

    bal_also_x=min(x_koord)
    bal_also_y=min(y_koord)
    jobb_felso_x=max(x_koord)
    jobb_felso_y=max(y_koord)

    # a \ csak azért, hogy itt a kódban sortörés legyen
    # a kimentben ez nem "látszik" majd...
    print(f'Bal alsó: {bal_also_x} {bal_also_y}, \
jobb felső: {jobb_felso_x} {jobb_felso_y}\n')

#---------------------------------------------------------
# 6. Írja a képernyőre, hogy mennyi volt a jeladó elmozdu-
#    lásainak összege! Úgy tekintjük, hogy a jeladó két
#    pozíciója közötti elmozdulása a pozíciókat összekötő
#    egyenes mentén történt.
#    Az összeget három tizedes pontossággal jelenítse meg!
#    A kiírásnál a tizedesvessző és tizedespont kiírása is
#    elfogadott. Az i-edik és az i+1-edik pontok távolsá-
#    gát a megadott képlet segítségével határozhatja meg. 
#---------------------------------------------------------
def F6():
    print('6. feladat')
    szumma_elmozdulas=0
    # az i. és i+1. jel feldolgozásához index kell, ezért
    # a "range-típusú for" ciklust használjuk:
    for i in range(len(jelek)-1):   # -1, mert...
        x=jelek[i][3]   # i. lista 3. eleme
        y=jelek[i][4]
        kov_x=jelek[i+1][3]   # ...így i+1-gyel a végén nem lesz baj
        kov_y=jelek[i+1][4]
        elmozdulas=negyzetgyok(pow(x-kov_x,2)+pow(y-kov_y,2))
        szumma_elmozdulas+=elmozdulas

    print(f'Elmozdulás: {szumma_elmozdulas:.3f} egység\n')

#---------------------------------------------------------
# 7. Írja a kimaradt.txt fájlba a kimaradt észlelésekkel
#    kapcsolatos adatokat! A kimeneti fájlban azok a beme-
#    neti állományban rögzített vételi időpontok jelenje-
#    nek meg, amelyek előtt közvetlenül egy vagy több
#    észlelés kimaradt! Az időpont mellett – a mintának
#    megfelelően – jelenjen meg, hogy legalább hány jel
#    maradt ki, és az is, hogy miből következtet a hiányra!
#    Ha idő- és koordináta-eltérésből is adódik jelkimara-
#    dás, akkor a nagyobb értéket írja ki! Ha az időelté-
#    rés és a koordináták eltérése alapján is ugyanannyi
#    jelkimaradásra következtetünk, akkor bármelyiket
#    kiírhatja.
#---------------------------------------------------------
def F7():
    # jeladó 5 percenként jelet küld, illetve ha bármely
    # koordináta 10 egységgel megváltozik!
    # figyeljük az i. és i+1. jelsorozatokra, hogy ez a
    # szabály sérült-e, és ha igen melyik miatt, illetve
    # milyen mértékben: azaz hány jeladás maradt ki... stb.
    ot_perc=300     # mp-ben az 5 perc
    fki=open('kimaradt.txt','w')

    # Elég hosszú, meg bonyolult, meg sok változó van,
    # de így talán követhetőbb a logika!?
    # Később ez egyszerűsíthető!
    for i in range(len(jelek)-1):
        j1=jelek[i]     # aktuális jel adatai
        j2=jelek[i+1]   # következő jel adatai
        elter=0         # koordináták eltérést mutatnak-e
        elter_x,elter_y=0,0
        ido=0           # időbeli eltérés van-e
        van=False       # lesz-e a normálisnál nagyobb eltérés

        # eltelt idő meghatározása:
        eltelt_ido=eltelt(j1[0],j1[1],j1[2],j2[0],j2[1],j2[2])
        if eltelt_ido>ot_perc:
            van=True
            ido=(eltelt_ido-ot_perc)//ot_perc
            if eltelt_ido%ot_perc>0:
                ido+=1
        # elmozdulások vizsgálata:
        elmozdulas_x=abs(j2[3]-j1[3])       # abszolútérték, mert
        elmozdulas_y=abs(j2[4]-j1[4])       # bármerre lehet elmozdulás
        if elmozdulas_x>10:
            van=True
            elter_x=(elmozdulas_x-10)//10
            if elmozdulas_x%10>0:
                elter_x+=1
        if elmozdulas_y>10:
            van=True
            elter_y=(elmozdulas_y-10)//10
            if elmozdulas_y%10>0:
                elter_y+=1

        # végül is van a normálistól eltérő kimaradás:
        if van:
            elter=max(elter_x,elter_y)
            mennyiseg=max(ido,elter)
            ok='időeltérés' if ido>=elter else 'koordináta-eltérés'
            print(f'{j2[0]} {j2[1]} {j2[2]} {ok} {mennyiseg}',file=fki)

    fki.close()      
    
#********************** F Ő M O D U L **********************
F1()
F2()
F4()
F5()
F6()
F7()



