kongresszus.py
1    # kongresszus - dig.kult. mintafeladat
2    def F1():
3        print('1. feladat - fájl beolvasása')
4        fbe=open('eloadasok.txt','r',encoding='utf-8')
5        for sor in fbe:
6            sor=sor.strip().split('\t')     # tabulátorokkal tagolt a forrás
7            sor[2:5]=map(int,sor[2:5])      # a számokat érdemes számként tárolni
8            adatok.append(sor)
9        fbe.close()
10       return sorted(adatok,key=lambda ea:(ea[2],ea[3]))       # rendezés: nap és előadás sorszáma szerint növekvően
11   
12   def osszerak():
13       # osszerak: Összerakjuk az adatok alapján naponta, időrendben az eseményeket:
14       #           kezdőidő, befejezés ideje, előadó, cím, eszköz vagy
15       #           kezdőidő, befejezés ideje, vita vagy ebédszünet...
16       # mindezt a további feladatok előkészítéseként...
17       ido=8*60                    # idő percben, és 8 órakor kezdődnek az előadások
18       index=-1                    # indexnek egy olyan értéket adjunk, amit biztosan le kell majd "cserélni"...
19       for ea in rendezett:        # vegyük sorban az előadásokat a rendezett mátrixból
20           if ea[2]-5!=index:      # ea[2] az előadás napja (5-8 között vannak a napok)
21               index=ea[2]-5       # index az előadás napja alapján (-5, mert 5-8 között vannak a napok)
22               ido=8*60            # idő percben, és 8 órakor kezdődnek az előadások
23               ebed=True           # feltételezzük, hogy lesz ebédszünet...
24           # napok mátrix: minden napra (5-8) összeszedjük a programokat:
25           #                   kezdés idő; vége (kezdés + ea. hossza); előadó neve; ea. címe; eszközigény
26           napok[index].append(str(ido)+';'+str(ido+ea[4])+';'+ea[0]+';'+ea[5]+';'+'('+ea[6]+')')
27           ido+=ea[4]              # ido növelés az ea. hosszával
28           nap_ido[index]+=ea[4]   # nap_ido mátrix: adott napi összidő! ea[4] az előadás hossza
29           napok[index].append(str(ido)+';'+str(ido+20)+';'+'Vita')    # napok mátrix: adott napi új bejegyzés a +20 perc vita kezdés és vége, és a 'Vita" szöveg
30           ido+=20                 # ido növelése a vita idejével (20 perc)
31           if ido>12*60 and ebed:  # lesz-e ebédszünet
32               napok[index].append(str(ido)+';'+str(ido+60)+';'+'Ebédszünet')  # ha lesz, akkor új esemény bejegyzése aktuális napra
33               ido+=60             # ido növelése ebédidővel (+60 perc)
34               ebed=False          # ebed legyen false, hogy még egyszer ne számoljuk már vele...
35       # print(napok)
36       
37   def F2():
38       print('---------------------------------------------------------------------')
39       print('2. feladat - napi előadások')
40       s=5                                     # kezdőnap 5.
41       for nap in napok:                       # osszerakban előállított napok máttrix feldolgozása
42           print(f'november {s}.')         
43           ssz=1                               # előadás sorszáma adott napon belül
44           for ea in nap:                      # előadások az adott napon
45               ea=ea.split(';')                # ea lista előállítása a szöveg alapján, elválasztó a ; karakter
46               if ea[2] not in ('Vita', 'Ebédszünet'):   # 2-es indexen az előadó neve van vagy a 'Vita', 'Ebédszünet' szöveg
47                   print(f'\t{ssz}. {ea[2]}: {ea[3]}') 
48                   ssz+=1                      # sorszám növelése
49           s+=1
50           
51   def F3():
52       print('---------------------------------------------------------------------')
53       print('3. feladat - előadások összideje (vita nélkül) naponta')
54       for i in range(len(nap_ido)):           # nap_ido (osszerak) listában minden megvan már...
55           print(f'{i+1}. nap: {nap_ido[i]//60}:{str(nap_ido[i]%60).zfill(2).rjust(2)}')   # óra:perc alakban írjuk ki...
56           
57   def F4():
58       print('---------------------------------------------------------------------')
59       print('4. feladat - ki tartja a leghosszabb előadást + előadás hossza')
60       r=sorted(adatok,key=lambda ea:(ea[2],-ea[4]))       # eredeti adatok mátrix rendezése: nap szerint növekvő, azon belül ea hossza csökkenőben
61       i=0
62       while r[i][2]!=6:       # ismétlődés amíg 6. nem lesz
63           i+=1
64       maxi=r[i][4]            # a rendezés miatt 6. első adata a maximumot tartalmazó érték
65       while r[i][4]==maxi:    # 6-ikai napon addig megyünk, amíg maximális ea hosszokat találunk
66           print(f'{r[i][0]} {r[i][4]}')
67           i+=1
68           
69   def F5():
70       print('---------------------------------------------------------------------')
71       print('5. feladat - előadások vége naponta (vitával együtt)')
72       for i in range(4):
73           last=napok[i][-1].split(';')        # napokban az utolsó (last) adatban benne van a vége percekben
74           print(f'{i+1}. nap: {int(last[1])//60}:{str(int(last[1])%60).zfill(2).rjust(2)}')
75           
76   def F6():
77       print('6. feladat - ebédszünet a 3. napon')
78       harmadik=napok[2]       # napok[2] a harmadik nap adatait tartalmazza
79       i=0
80       while harmadik[i].split(';')[2]!='Ebédszünet':  # addig megyünk amíg nem botlunk bele az ebédszünet szövegbe
81           i+=1
82       kezd=int(harmadik[i].split(';')[0])  # biztos, hogy van ebédszünet a harmadik napon, ezt nyugodtan feltételzhetjük 5. feladat alapján
83       print(f'A 3. napon az ebédszünet {kezd//60}:{str(kezd%60).zfill(2).rjust(2)}-kor kezdődik!')
84       
85   def F7():
86       print('---------------------------------------------------------------------')
87       print('7. feladat - azonos nevű előadók és előadásaik száma')
88       # ez egy rossz feldatmegfogalmazás, de mindegy (nem azonos nevű előadóink vannak, hanem ugyanaz a személy több előadást is tart(hat))
89       nevek=set()     # az előadók nevét egy halmzba "dobáljuk", ezzel lesz egy gyűjteményünk az egyedi nevekről
90       nevek_lst=[]    # kell egy lista is a count használata miatt, csakis azért...
91       for ea in adatok:               # eredeti adatokon megyünk végig
92           nevek.add(ea[0])            # nevet a nevek halmazba és
93           nevek_lst.append(ea[0])     # a nevek_lst listába is elhelyezzük
94       for nev in nevek:               # halamzon megyünk végig, mert ott minden név csak egyszer van...
95           db=nevek_lst.count(nev)     # és a név alapján a listában "countolunk"...
96           if db>1:
97               print(f'{nev} {db}')
98   
99   def F8():
100      print('---------------------------------------------------------------------')
101      print('8. feladat - megadott napon és időpontban milyen esemény zajlik')
102      n=int(input('Kérek egy napot (5-8): '))
103      o=int(input('Kérek egy órát: '))
104      p=int(input('Kérek egy percet: '))
105      vido=o*60+p                         # vido: vizsgált időpont
106      nap=napok[n-5]
107      rendben=False                       # rendben: az időpont már fel lett dolgozva
108      if vido<480:                        # reggel 8 órakor kezdődnek az előadások (8*60)
109          print('Még nem kezdődött el')
110          rendben=True
111      for esemeny in nap:
112          esemeny=esemeny.split(';')
113          k=int(esemeny[0])
114          v=int(esemeny[1])
115          if k<=vido<v:
116              rendben=True
117              if esemeny[2] not in ('Vita', 'Ebédszünet'):
118                  print('Előadás')
119              else:
120                  print(esemeny[2])
121      if not rendben:
122          print('Már véget ért')
123      
124  def F9():
125      print('---------------------------------------------------------------------')
126      print('9. feladat - fájl kiírása - időrend naponta')
127      fki=open('idorend.txt','w')
128      
129      for n in range(4):
130          print(f'november {n+5}.',file=fki)
131          for ea in napok[n]:
132              ea=ea.split(';')
133              if len(ea)>3:
134                  print(f'{int(ea[0])//60}:{str(int(ea[0])%60).zfill(2).rjust(2)}-{int(ea[1])//60}:{str(int(ea[1])%60).zfill(2).rjust(2)} {ea[2]}: {ea[3]} {ea[4]}',file=fki)
135              else:
136                  print(f'{int(ea[0])//60}:{str(int(ea[1])%60).zfill(2).rjust(2)}-{int(ea[1])//60}:{str(int(ea[1])%60).zfill(2).rjust(2)} {ea[2]}',file=fki)
137      
138      fki.close()
139  # ----------------------------------- F Ő M O D U L -----------------------------------    
140  adatok=[]
141  rendezett=F1()
142  napok=[[],[],[],[]]
143  nap_ido=[0,0,0,0]
144  # print(rendezett)
145  osszerak()
146  F2()
147  F3()
148  F4()
149  F5()
150  F6()
151  F7()
152  F8()
153  F9()
154