from statistics import mean
#-----------------------------------------------------------------------
# 1. Olvassa be és tárolja el a tavirathu13.txt állomány adatait!
#-----------------------------------------------------------------------
print('1. feladat - adatok beolvasása')

adatok=[]  # ez lesz a mátrixunk (listák listája)
           # [település, idő_óra, idő_perc, szélirány és -erősség, hőmérséklet]
           
telepulesek=set()   #az 5. feladat miatt kell ez (utólag tértem ide vissza én is)

fbe=open('tavirathu13.txt','r')
for sor in fbe:
    sor=sor.strip().split()
    temp=[]
    for i,elem in enumerate(sor):
        if i==1:    #ezen az indexen van az idő óópp formátumban
            temp.append(elem[0:2])              #óó rész
            temp.append(elem[2:4])              #pp rész
        else:
            temp.append(elem)
            
    telepulesek.add(temp[0] )   
    adatok.append(temp)
fbe.close()
#csak úgy, a rend kedvéért:
telepulesek=sorted(list(telepulesek))

#-----------------------------------------------------------------------
# 2. Kérje be a felhasználótól egy város kódját! Adja meg, hogy az
#    adott városból mikor érkezett az utolsó mérési adat! A kiírásban
#    az időpontot óó:pp formátumban jelenítse meg!
#-----------------------------------------------------------------------
print('\n2. feladat\n')

tkod=input('Adja meg egy település kódját! Település: ')
#település kódja - tkod  
#Keressük meg ezt a településkódot az adatok végétől visszafelé!
#Lehet a klasszikus lineáris keresés a megoldás vagy egy for ciklus,
#és kiugrunk, ha megvan. Azt is figyelhetjük, hogy megvan-e egyáltalán.

i=-1    #utolsó elem indexe - ezen belül a 0 indexen lesznek a településkódok
while i>-len(adatok) and adatok[i][0]!=tkod:
    i-=1
if i>-len(adatok):
    #megvan a kód
    ora=adatok[i][1]
    perc=adatok[i][2]
    print(f'Az utolsó mérési adat a megadott településről {ora}:{perc}-kor érkezett.')
else:
    print('Ilyen kód nincs az adatok között!')

#-----------------------------------------------------------------------
# 3. Határozza meg, hogy a nap során mikor mérték a legalacsonyabb és
#    a legmagasabb hőmérsékletet! Jelenítse meg a méréshez kapcsolódó
#    település nevét, az időpontot és a hőmérsékletet! Amennyiben több
#    legnagyobb vagy legkisebb érték van, akkor elég az egyiket kiírnia. 
#-----------------------------------------------------------------------
print('\n3. feladat\n')
maxho=-1    #ennél biztosan lesz nagyobb (akkor kell, ha klasszikus megoldást adunk
minho=100   #ennél biztosan lesz kisebb

#szerintem itt sokféle út lehet, de most vagy
#klasszikus szélsőérték keresés vagy listába szedjük a hőmérsékleteket
#és abban alkalmazzuk a max és min függvényeket (most ez lesz)
homersekletek=[]
for adat in adatok:
    homersekletek.append(adat[4])

maxho=max(homersekletek)
maxi=homersekletek.index(maxho)    #meghatározzuk, hogy milyen indexen van ez az adat
minho=min(homersekletek)
mini=homersekletek.index(minho)    #meghatározzuk, hogy milyen indexen van ez az adat

#kiírandó adatsorok összeállítása
adatsor=adatok[mini][0]+' '+adatok[mini][1]+':'+adatok[mini][2]+' '+adatok[mini][4]
print('A legalacsonyabb hőmérséklet: %s fok' %adatsor)
adatsor=adatok[maxi][0]+' '+adatok[maxi][1]+':'+adatok[maxi][2]+' '+adatok[maxi][4]
print('A legmagasabb hőmérséklet: %s fok' %adatsor) 

#-----------------------------------------------------------------------    
# 4. Határozza meg, azokat a településeket és időpontokat, ahol és
#    amikor a mérések idején szélcsend volt! (A szélcsendet a táviratban
#    00000 kóddal jelölik.) Ha nem volt ilyen, akkor 
#    a „Nem volt szélcsend a mérések idején.” szöveget írja ki!
#    A kiírásnál a település kódját és az időpontot jelenítse meg. 
#-----------------------------------------------------------------------
print('\n4. feladat\n')

#kiválogatás és megszámolás tétele
#számoljuk azt, hogy megfelelő adat volt, hogy a végén tudjunk reagálni,
#ha egy sem volt...
db=0
for adat in adatok:
    if adat[3]=='00000':
        db+=1
        print(adat[0]+' '+adat[1]+':'+adat[2])
        
if db==0:
    print('Nem volt szélcsend a mérések idején!')

#-----------------------------------------------------------------------
# 5. Határozza meg a települések napi középhőmérsékleti adatát és a
#    hőmérséklet-ingadozását! A kiírásnál a település kódja szerepeljen
#    a sor elején a minta szerint! A kiírásnál csak a megoldott feladat-
#    részre vonatkozó szöveget és értékeket írja ki! 
#       a. A középhőmérséklet azon hőmérsékleti adatok átlaga, amikor
#          a méréshez tartozó óra értéke 1., 7., 13., 19. Ha egy telepü-
#          lésen a felsorolt órák valamelyikén nem volt mérés, akkor a
#          kiírásnál az „NA” szót jelenítse meg! Az adott órákhoz tartozó
#          összes adat átlagaként határozza meg a középhőmérsékletet,
#          azaz minden értéket azonos súllyal vegyen figyelembe!
#          A középhőmérsékletet egészre kerekítve jelenítse meg! 
#       b. A hőmérséklet-ingadozás számításhoz az adott településen a
#          napi legmagasabb és legalacsonyabb hőmérséklet különbségét
#          kell kiszámítania! (Feltételezheti, hogy minden település
#          esetén volt legalább két mérési adat.)
#-----------------------------------------------------------------------
print('\n5. feladat\n')

#óra értéke 1., 7., 13., 19.
orak={'01', '07', '13', '19'}

for t in telepulesek:   #lásd 10. sor
    atlag=[]    #ebben gyűjtöm a fenti órákban történt méréseket (fokokat)
    max_min=[]  #ebben gyűjtöm az összes mérést (fokokat)
    oke=set()   #ebbe a halmazba dobálom az órákat, és ha nem 4 elemű, akkor nem oké
    for adat in adatok:
        if adat[0]==t:      #megfelelő település
            hom=int(adat[4])        #ne felejtsük egészre alakítani a fokot
            max_min.append(hom)     #válogatás nélkül mindent bele ebbe
            if adat[1] in orak:     #ha jó óra van, akkor
                atlag.append(hom)   
                oke.add(adat[1])
            
    if len(oke)<4:    #mivel 4 figyelembe veendő időpont van
        s=' NA; '
    else:
                                         #mean fv. vagyis átlagszámítás, lásd 1. sor fent
        s=' Középhőmérséklet: '+str(round(mean(atlag)))+'; '
        
    hi='Hőmérséklet-ingadozás: '+str(max(max_min)-min(max_min))   
    print(t+s+hi)


#----------------------------------------------------------------------------
# 6. Hozzon létre településenként egy szöveges állományt, amely első
#    sorában a település kódját tartalmazza! A további sorokban a mérési
#    időpontok és a hozzá tartozó szélerősségek jelenjenek meg! A szél-
#    erősséget a minta szerint a számértéknek megfelelő számú kettős-
#    kereszttel (#) adja meg! A fájlban az időpontokat és a szélerősséget
#    megjelenítő kettőskereszteket szóközzel válassza el egymástól!
#    A fájl neve X.txt legyen, ahol az X helyére a település kódja kerüljön!
#----------------------------------------------------------------------------
print('\n6. feladat - fájlok elkészítése')

#pl.:
#BC 
#00:45 ###

for t in telepulesek:       #egyik település a másik után
    fki=open(t+'.txt','w')  #megnyitjuk a település kódja szerinti fájlt
    print(t,file=fki)       #kiírjuk a fájl első sorába a településkódot
    for adat in adatok:     #egyik adat a másik után
        if adat[0]==t:      #ha megfelelő településről van szó, akkor
            sor=adat[1]+':'+adat[2]+' '     #sorba bekerül óó:pp és egy szóköz
            szelero=int(adat[3][-2:])*'#'   #3-as indexen van a szélirány és erősség
                                            #az erősség az utolsó két karaktere [-2:]
            sor+=szelero                    #szöveg szorzása annyiszor ismétlést jelent
            print(sor,file=fki)
    fki.close()             #ha végig értünk az adatokon, akkor fájl bezár és
                            #jöhet a következő település
        

