# ----------------------------------------------------------------------------------------------------------
# 1. Olvassa be és tárolja el az ut.txt állományban lévő adatokat!
# ----------------------------------------------------------------------------------------------------------
ut = []         # mátrix: [szám, jel]
fbe = open('ut.txt', 'r', encoding = 'utf-8')
uthossz = int(fbe.readline().strip())
for sor in fbe:
    sor = sor.strip().split()
    sor[0] = int(sor[0])
    ut.append(sor)
fbe.close()
# ----------------------------------------------------------------------------------------------------------
# 2. Írja ki az úton található települések nevét! Minden település neve új sorban jelenjen meg!
# ----------------------------------------------------------------------------------------------------------
print('2. feladat')
print('A települések neve:')
for szakasz in ut:                          # szakasz: [szám, jel] lista
    if len(szakasz[1]) > 3:
        print(szakasz[1])
# ----------------------------------------------------------------------------------------------------------
# 3. Kérjen be a felhasználótól egy valós számot, amely megadja, hogy az út első hány km-es
#    szakaszát vizsgáljuk! Adja meg, hogy mi volt ezen a szakaszon a legalacsonyabb
#    sebességhatár! Figyeljen arra, hogy sebességhatárt nem csak sebességkorlátozó tábla
#    szabhat meg! Megoldását az 1, 2, …, 5 km-t megadva is tesztelje!
# ----------------------------------------------------------------------------------------------------------
print('3. feladat')
vkm = float(input('Adja meg a vizsgált szakasz hosszát km-ben! '))
vm = vkm * 1000
min_sebesseg = 90
varosban = False
for szakasz in ut:                      # szakasz: [szám, jel] lista
    jel = szakasz[1]
    if szakasz[0] < vm:
        # lehetséges jel-esetek
        if jel.isdigit():               # 1. konkrét sebességkorlátozó tábla esete
            sebesseg = int(jel)
        if len(jel) > 3:                # 2. beértünk egy városba
            varosban = True
            sebesseg = 50
        if jel == ']':                  # 3. település vége
            sebesseg = 90
            varosban = False
        if jel == '#' or jel == '%':    # 4. és 5. feloldó helyzet (kereszteződés vagy feloldó tábla)
            if varosban == True:
                sebesseg = 50
            else:
                sebesseg = 90
        # minimumkeresés!!!
        if sebesseg < min_sebesseg:
            min_sebesseg = sebesseg        
print(f'Az első {vkm} km-en {min_sebesseg} km/h volt a legalacsonyabb megengedett sebesség.')           
# ----------------------------------------------------------------------------------------------------------
# 4. Adja meg, hogy a bemeneti fájlban rögzített út hány százaléka vezet településen belül! Az út
#    teljes hossza a bemeneti fájl első sorában található. Az eredményt kéttizedes pontossággal
#    írja a képernyőre!
# ----------------------------------------------------------------------------------------------------------
print('4. feladat')
varosok = 0             # összegzése a városok hosszának
for szakasz in ut:      # szakasz: [szám, jel] lista
    if len(szakasz[1]) > 3:
        eleje = szakasz[0]
    if szakasz[1] == ']':
        vege = szakasz[0]
        varosok += (vege - eleje)
arany = varosok / uthossz * 100   
print(f'Az út {arany:.2f} százaléka vezet településen belül.')   # float
# ----------------------------------------------------------------------------------------------------------
# 5. Olvassa be egy település nevét, és adja meg, hogy a településen belül…
#            … hány sebességkorlátozó tábla van;
#            … milyen hosszan vezet az út!
# ----------------------------------------------------------------------------------------------------------
print('5. feladat')
varos = input('Adja meg egy település nevét! ')
db = 0
varos_hossz = 0
oke = False
for szakasz in ut:                          # szakasz: [szám, jel] lista
    if szakasz[1] == varos:
        oke = True                          # oke: megvan a városunk...
        eleje = szakasz[0]
    if oke and szakasz[1].isdigit():        # aktuális városban vagyunk és tábla jön
        db += 1
    if oke and szakasz[1] == ']':
        vege = szakasz[0]
        varos_hossz = vege - eleje
        break        

print(f'A sebességkorlátozó táblák száma: {db}')
print(f'Az út hossza a településen belül {varos_hossz} méter.')
# ----------------------------------------------------------------------------------------------------------
# 6. Adja meg a beolvasott településhez legközelebb eső település nevét! (Két település
#    távolsága alatt az úton korábbi település végének és a későbbi település kezdetének
#    különbségét értjük.) Ha a két szomszédos település távolsága egyezik, akkor a megfigyelés
#    kezdőpontjához közelebbit adja meg! Ügyeljen arra, hogy az első és az utolsó településnek
#    csak egy szomszédja van! Feltételezheti, hogy az út bemeneti fájl által leírt része legalább
#    két településen áthalad.
# ----------------------------------------------------------------------------------------------------------    
print('6. feladat')
oke = False
for i in range(len(ut)):
    if ut[i][1] == varos:                   # az 5. feladatban megadott város
        index = i                           # "megjegyezzük" az indexét
        eleje = ut[i][0]                    # az elejének távolságát a kezdőponttól
        oke = True                          # jelezzük, hogy megvolt a város
    if ut[i][1] == ']' and oke:             # ha egy város vége jön és az adott város megvan
        indexvege = i                       # akkor a mi városunk végén vagyunk, vége indexe rögzítésre kerül
        vege = ut[i][0]                     # és vége távolság is
        break                               # további vizsgálódásra már nincs szükség
evaros = ''                                 # varosunk előtti város keresése
for i in range(index - 1, -1, -1):          # itt használjuk fel a 77. sorban tárolt indexet
    if ut[i][1] == ']':                     # minden előző városra frissül az 
        evege = ut[i][0]                    # előző város vége változó és...
    if len(ut[i][1]) > 3:
        evaros = ut[i][1]                   # az előző város neve
        break                               # így jutunk el, ha van előző, az előző város adataihoz...
kvaros = ''                                 # hasonlóan a következő város adatainak előállítása, ha van...
for i in range(indexvege + 1, len(ut), 1):
    if len(ut[i][1]) > 3:
        keleje = ut[i][0]                   # a következő városnak ez eleje kell
        kvaros = ut[i][1]
        break
if evaros != '' and kvaros != '':           # ha van előző és következő, akkor...
    if (eleje - evege) <= (keleje - vege):  # a kisebb távolság kiválasztása...
        legkozelebbi = evaros
    else:
        legkozelebbi = kvaros
if evaros != '' and kvaros == '':           # ha következő nincs, akkor...
    legkozelebbi = evaros
if evaros == '' and kvaros != '':           # ha előző nincs, akkor...
    legkozelebbi = kvaros
print(f'A legközelebbi település: {legkozelebbi}')

# egyszerűbb megoldás, ha "összeszedjük" minden város esetében a nevüket és az
# elejük és végüg távolságát a kezdőponttól:

varosok = []            # mátrix: [városnév, kezdete, vége] listákból
for szakasz in ut:
    if len(szakasz[1]) > 3:
        varos_info = [szakasz[1], szakasz[0]]        # [városnév, kezdete]
    if szakasz[1] == ']':
        varos_info.append(szakasz[0])                # lista bővítése: [városnév, kezdete, vége]
        varosok.append(varos_info)                   # lista mátrixba helyezése  
        varos_info = []                              # lista ürítése, új városhoz előkészítése
# print(varosok)   

for i in range(len(varosok)):                        # a megadott város "megkeresése"
    if varosok[i][0] == varos:  
        break
szoveg = 'A legközelebbi település:'
if i == 0:
    # ez azt jelenti, hogy a városunk a legelső az eredeti adatok között
    print(f'{szoveg} {varosok[i+1][0]}')
elif i == len(varosok) - 1:
    # ez azt jelenti, hogy a városunk a legutolsó az eredeti adatok között
    print(f'{szoveg} {varosok[i-1][0]}')
else:
    # valami közbeeső várost adtunk meg...
    elozo = varosok[i][1] - varosok[i-1][2]
    kovetkezo = varosok[i+1][1] - varosok[i][2]
    if elozo <= kovetkezo:
        print(f'{szoveg} {varosok[i-1][0]}')
    else:
        print(f'{szoveg} {varosok[i+1][0]}')
              
        
        