1 # ----------------------------------------------------------------------------------------------------------
2 # 1. Olvassa be és tárolja el az ut.txt állományban lévő adatokat!
3 # ----------------------------------------------------------------------------------------------------------
4 ut = [] # mátrix: [szám, jel]
5 fbe = open('ut.txt', 'r', encoding = 'utf-8')
6 uthossz = int(fbe.readline().strip())
7 for sor in fbe:
8 sor = sor.strip().split()
9 sor[0] = int(sor[0])
10 ut.append(sor)
11 fbe.close()
12 # ----------------------------------------------------------------------------------------------------------
13 # 2. Írja ki az úton található települések nevét! Minden település neve új sorban jelenjen meg!
14 # ----------------------------------------------------------------------------------------------------------
15 print('2. feladat')
16 print('A települések neve:')
17 for szakasz in ut: # szakasz: [szám, jel] lista
18 if len(szakasz[1]) > 3:
19 print(szakasz[1])
20 # ----------------------------------------------------------------------------------------------------------
21 # 3. Kérjen be a felhasználótól egy valós számot, amely megadja, hogy az út első hány km-es
22 # szakaszát vizsgáljuk! Adja meg, hogy mi volt ezen a szakaszon a legalacsonyabb
23 # sebességhatár! Figyeljen arra, hogy sebességhatárt nem csak sebességkorlátozó tábla
24 # szabhat meg! Megoldását az 1, 2, …, 5 km-t megadva is tesztelje!
25 # ----------------------------------------------------------------------------------------------------------
26 print('3. feladat')
27 vkm = float(input('Adja meg a vizsgált szakasz hosszát km-ben! '))
28 vm = vkm * 1000
29 min_sebesseg = 90
30 varosban = False
31 for szakasz in ut: # szakasz: [szám, jel] lista
32 jel = szakasz[1]
33 if szakasz[0] < vm:
34 # lehetséges jel-esetek
35 if jel.isdigit(): # 1. konkrét sebességkorlátozó tábla esete
36 sebesseg = int(jel)
37 if len(jel) > 3: # 2. beértünk egy városba
38 varosban = True
39 sebesseg = 50
40 if jel == ']': # 3. település vége
41 sebesseg = 90
42 varosban = False
43 if jel == '#' or jel == '%': # 4. és 5. feloldó helyzet (kereszteződés vagy feloldó tábla)
44 if varosban == True:
45 sebesseg = 50
46 else:
47 sebesseg = 90
48 # minimumkeresés!!!
49 if sebesseg < min_sebesseg:
50 min_sebesseg = sebesseg
51 print(f'Az első {vkm} km-en {min_sebesseg} km/h volt a legalacsonyabb megengedett sebesség.')
52 # ----------------------------------------------------------------------------------------------------------
53 # 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
54 # teljes hossza a bemeneti fájl első sorában található. Az eredményt kéttizedes pontossággal
55 # írja a képernyőre!
56 # ----------------------------------------------------------------------------------------------------------
57 print('4. feladat')
58 varosok = 0 # összegzése a városok hosszának
59 for szakasz in ut: # szakasz: [szám, jel] lista
60 if len(szakasz[1]) > 3:
61 eleje = szakasz[0]
62 if szakasz[1] == ']':
63 vege = szakasz[0]
64 varosok += (vege - eleje)
65 arany = varosok / uthossz * 100
66 print(f'Az út {arany:.2f} százaléka vezet településen belül.') # float
67 # ----------------------------------------------------------------------------------------------------------
68 # 5. Olvassa be egy település nevét, és adja meg, hogy a településen belül…
69 # … hány sebességkorlátozó tábla van;
70 # … milyen hosszan vezet az út!
71 # ----------------------------------------------------------------------------------------------------------
72 print('5. feladat')
73 varos = input('Adja meg egy település nevét! ')
74 db = 0
75 varos_hossz = 0
76 oke = False
77 for szakasz in ut: # szakasz: [szám, jel] lista
78 if szakasz[1] == varos:
79 oke = True # oke: megvan a városunk...
80 eleje = szakasz[0]
81 if oke and szakasz[1].isdigit(): # aktuális városban vagyunk és tábla jön
82 db += 1
83 if oke and szakasz[1] == ']':
84 vege = szakasz[0]
85 varos_hossz = vege - eleje
86 break
87
88 print(f'A sebességkorlátozó táblák száma: {db}')
89 print(f'Az út hossza a településen belül {varos_hossz} méter.')
90 # ----------------------------------------------------------------------------------------------------------
91 # 6. Adja meg a beolvasott településhez legközelebb eső település nevét! (Két település
92 # távolsága alatt az úton korábbi település végének és a későbbi település kezdetének
93 # különbségét értjük.) Ha a két szomszédos település távolsága egyezik, akkor a megfigyelés
94 # kezdőpontjához közelebbit adja meg! Ügyeljen arra, hogy az első és az utolsó településnek
95 # csak egy szomszédja van! Feltételezheti, hogy az út bemeneti fájl által leírt része legalább
96 # két településen áthalad.
97 # ----------------------------------------------------------------------------------------------------------
98 print('6. feladat')
99 oke = False
100 for i in range(len(ut)):
101 if ut[i][1] == varos: # az 5. feladatban megadott város
102 index = i # "megjegyezzük" az indexét
103 eleje = ut[i][0] # az elejének távolságát a kezdőponttól
104 oke = True # jelezzük, hogy megvolt a város
105 if ut[i][1] == ']' and oke: # ha egy város vége jön és az adott város megvan
106 indexvege = i # akkor a mi városunk végén vagyunk, vége indexe rögzítésre kerül
107 vege = ut[i][0] # és vége távolság is
108 break # további vizsgálódásra már nincs szükség
109 evaros = '' # varosunk előtti város keresése
110 for i in range(index - 1, -1, -1): # itt használjuk fel a 77. sorban tárolt indexet
111 if ut[i][1] == ']': # minden előző városra frissül az
112 evege = ut[i][0] # előző város vége változó és...
113 if len(ut[i][1]) > 3:
114 evaros = ut[i][1] # az előző város neve
115 break # így jutunk el, ha van előző, az előző város adataihoz...
116 kvaros = '' # hasonlóan a következő város adatainak előállítása, ha van...
117 for i in range(indexvege + 1, len(ut), 1):
118 if len(ut[i][1]) > 3:
119 keleje = ut[i][0] # a következő városnak ez eleje kell
120 kvaros = ut[i][1]
121 break
122 if evaros != '' and kvaros != '': # ha van előző és következő, akkor...
123 if (eleje - evege) <= (keleje - vege): # a kisebb távolság kiválasztása...
124 legkozelebbi = evaros
125 else:
126 legkozelebbi = kvaros
127 if evaros != '' and kvaros == '': # ha következő nincs, akkor...
128 legkozelebbi = evaros
129 if evaros == '' and kvaros != '': # ha előző nincs, akkor...
130 legkozelebbi = kvaros
131 print(f'A legközelebbi település: {legkozelebbi}')
132
133 # egyszerűbb megoldás, ha "összeszedjük" minden város esetében a nevüket és az
134 # elejük és végüg távolságát a kezdőponttól:
135
136 varosok = [] # mátrix: [városnév, kezdete, vége] listákból
137 for szakasz in ut:
138 if len(szakasz[1]) > 3:
139 varos_info = [szakasz[1], szakasz[0]] # [városnév, kezdete]
140 if szakasz[1] == ']':
141 varos_info.append(szakasz[0]) # lista bővítése: [városnév, kezdete, vége]
142 varosok.append(varos_info) # lista mátrixba helyezése
143 varos_info = [] # lista ürítése, új városhoz előkészítése
144 # print(varosok)
145
146 for i in range(len(varosok)): # a megadott város "megkeresése"
147 if varosok[i][0] == varos:
148 break
149 szoveg = 'A legközelebbi település:'
150 if i == 0:
151 # ez azt jelenti, hogy a városunk a legelső az eredeti adatok között
152 print(f'{szoveg} {varosok[i+1][0]}')
153 elif i == len(varosok) - 1:
154 # ez azt jelenti, hogy a városunk a legutolsó az eredeti adatok között
155 print(f'{szoveg} {varosok[i-1][0]}')
156 else:
157 # valami közbeeső várost adtunk meg...
158 elozo = varosok[i][1] - varosok[i-1][2]
159 kovetkezo = varosok[i+1][1] - varosok[i][2]
160 if elozo <= kovetkezo:
161 print(f'{szoveg} {varosok[i-1][0]}')
162 else:
163 print(f'{szoveg} {varosok[i+1][0]}')
164
165
166