sebesseg.py
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