furdostat201705idny_2.py
1    vendegek=dict()
2    def masodperc(o,p,mp):
3        return o*3600+p*60+mp
4    
5    def orapercmp(idomp):
6        o=idomp//3600
7        p=(idomp%3600)//60
8        mp=(idomp%3600)%60
9        return [o,p,mp]
10   #----------------------------------------------------------------------------------------------
11   # 1. Olvassa be a furdoadat.txt fájl tartalmát!
12   #----------------------------------------------------------------------------------------------
13   def F1():
14       print('1. feladat - adatok beolvasása')
15       fbe=open('furdoadat.txt','r')
16       #Első sor külön kell, mert kell a vendég azonosítója a szótárkulcshoz.
17       #A beolvasott sorból lista lesz (strip().split()).
18       #Mindent integerré alakítok (map), illetve listává.
19       elsosor=list(map(int,fbe.readline().strip().split()))
20       key=elsosor[0]  #kulcs a vendégezonosító
21       temp=[]
22       temp.append(elsosor[1:])    #Kulcshoz tartozó bejegyzés a sor többi eleméből
23                                   #képzett lista.
24       for sor in fbe:
25           sor=list(map(int,sor.strip().split()))   #minden legyen integer
26           if sor[0]==key:
27               temp.append(sor[1:])
28           else:
29               vendegek[key]=temp
30               temp=[]
31               temp.append(sor[1:])
32               key=sor[0]
33       vendegek[key]=temp
34       fbe.close()
35   
36   #----------------------------------------------------------------------------------------------
37   # 2. Írja a képernyőre, hogy az első és az utolsó vendég mikor lépett ki az
38   #    öltözőből!
39   #----------------------------------------------------------------------------------------------
40   def F2():
41       print('\n2. feladat')
42       #Tudjuk, hogy időrendben vannak az adatok!! Így az első vendég és az utolsó is adott!
43       lst = list(vendegek.values())
44       elso=lst[0][0]
45       print(f'Az első vendég {elso[2]}:{elso[3]}:{elso[4]}-kor lépett ki az öltözőből.')
46       utolso=lst[-1][0]    #utolsó adatunk indexe -1 (utolsó előtti -2, és így tovább...)
47       print(f'Az utolsó vendég {utolso[2]}:{utolso[3]}:{utolso[4]}-kor lépett ki az öltözőből.')
48   
49   #----------------------------------------------------------------------------------------------
50   # 3. Határozza meg és írja ki a képernyőre, hogy hány olyan fürdővendég volt,
51   #    aki az öltözőn kívül csak egy részlegen járt és azt a részleget csak
52   #    egyszer használta!
53   #----------------------------------------------------------------------------------------------
54   def F3():
55       print('\n3. feladat')
56       #Az adatok vendégenként csoportosítva vannak a szótárnak köszönhetően. Ha csak egy
57       #részlegen járt egy vendég, és ott is csak egyszer, akkor az ő szótár bejegyzése 4 elemű
58       #lista lesz (ahol minden elem egy lista, persze)! (Öltözőból ki, valahova be, onnan ki,
59       #és öltözőbe vissza)
60       vendegszam=0
61       #Egy szótárbejegyzés így néz ki:
62       # 112: [[0, 1, 6, 14, 56], [1, 0, 6, 17, 47], [1, 1, 6, 42, 47], [0, 0, 6, 45, 44]]
63       #Így pl.:
64       #key: 112
65       #vendegek[key]=[[0, 1, 6, 14, 56], [1, 0, 6, 17, 47], [1, 1, 6, 42, 47], [0, 0, 6, 45, 44]]
66       for key in vendegek.keys():
67           if len(vendegek[key])==4:
68               vendegszam+=1
69       print('A fürdőben %d vendég járt csak egy részlegen.' %vendegszam)
70           
71   #----------------------------------------------------------------------------------------------
72   # 4. Határozza meg, hogy melyik vendég töltötte a legtöbb időt a fürdőben!
73   #    A vendég azonosítóját és a fürdőben tartózkodás idejét írja ki a képernyőre!
74   #    A fürdőben a legtöbb időt töltő vendégek közül elegendő egy vendég adatait
75   #    megjelenítenie.
76   #----------------------------------------------------------------------------------------------
77   def F4():
78       print('\n4. feladat')
79       max_ido=0
80       for key in vendegek.keys():
81           kezd=vendegek[key][0]
82           vege=vendegek[key][-1]
83           ido=masodperc(vege[2],vege[3],vege[4])-masodperc(kezd[2],kezd[3],kezd[4])
84           if ido>max_ido:
85               max_ido=ido
86               a_mi_emberunk=key
87       
88       
89       idopont=orapercmp(max_ido)    
90       print('A legtöbb időt eltöltő vendég:')
91       print(f'{a_mi_emberunk}. vendég {idopont[0]}:{idopont[1]}:{idopont[2]}')
92   
93   #----------------------------------------------------------------------------------------------
94   # 5. Készítsen statisztikát, hogy 06:00:00-08:59:59 óra között, 09:00:00-15:59:59
95   #    óra között és 16:00:00-19:59:59 óra között hány vendég érkezett a fürdőbe!
96   #    Az eredményt írja ki a képernyőre a mintán látható formában!
97   #----------------------------------------------------------------------------------------------
98   def F5():
99       print('\n4. feladat')
100      #Három kategóriánk van:
101      #1.kategória: óra rész 6 és 8 között legyen,
102      #2.kategória: óra rész 9 és 15 között legyen,
103      #3.kategória: óra rész 16 és 19 között legyen,
104      kat=[0]*3
105      for adat in vendegek.values():
106          ora=adat[0][2]
107          if ora>=6 and ora<=8:
108              kat_index=0
109          if ora>=9 and ora<=15:
110              kat_index=1
111          if ora>=16 and ora<=19:
112              kat_index=2
113          kat[kat_index]+=1
114          
115      print('6-9 óra között %d vendég' %kat[0])
116      print('9-16 óra között %d vendég' %kat[1])
117      print('16-20 óra között %d vendég' %kat[2])
118      
119  
120  #----------------------------------------------------------------------------------------------
121  # 6. Készítsen egy listát a szauna részlegen járt vendégekről és az általuk ott
122  #    töltött időről! A vendég azonosítóját és a részlegen eltöltött időt a
123  #    szauna.txt fájlba írja ki! A fájlban egy sorban a vendég azonosítója és
124  #    szóközzel elválasztva a részlegen eltöltött idő szerepeljen
125  #    óra:perc:másodperc formában! Ügyeljen arra, hogy egy vendég a szauna 
126  #    részlegben a nap folyamán többször is járhatott! 
127  #----------------------------------------------------------------------------------------------
128  def F6():
129      print('\n6. feladat - adatok kiírása fájlba')
130      fki=open('szauna.txt','w')
131      
132      #szauna részleg azonosítója: 2 (a részleg a kislistákban az első adat!)
133      #Például: a furdoadat.txt-ben a 471. sortól van a 288-as vendég mozgása
134      #288 0 1 17 4 17    ---> öltözőből kilépett
135      #288 2 0 17 6 19    ---> szaunába bement 17:06:19-kor
136      #288 2 1 17 16 33   ---> szaunából kijött 17:16:33-kor
137      #288 3 0 17 17 43
138      #288 3 1 17 35 58
139      #288 2 0 17 37 17   ---> ismét szaunába ment 17:37:17-kor
140      #288 2 1 17 50 26   ---> kijött a szaunából 17:50:26-kor (ez összesen 23 perc 23 mp)
141      #288 0 0 17 51 33
142      #Ez a fenti sorozat a szótárunkban, mint BEJEGYZÉS, így fest:
143      #288: [[0, 1, 17, 4, 17],[2, 0, 17, 6, 19],[2, 1, 17, 16, 33],...]
144      for bejegyzes in vendegek.items():
145          vendeg=bejegyzes[0]   #vendeg=288
146          vendegmozgas=bejegyzes[1]  #vendegmozgas=[[0, 1, 17, 4, 17],[2, 0, 17, 6, 19],[2, 1, 17, 16, 33],...]
147          szauna_ido=0
148          for elem in vendegmozgas:   #Itt egy elem így néz ki például: [2, 0, 17, 6, 19].
149              if elem[0]==2:
150                  if elem[1]==0:
151                      be=masodperc(elem[2],elem[3],elem[4])
152                  if elem[1]==1:
153                      ki=masodperc(elem[2],elem[3],elem[4])
154                      szauna_ido+=ki-be
155          if szauna_ido>0:
156              ido=orapercmp(szauna_ido)
157              print(str(vendeg)+' '+str(ido[0]).zfill(2).rjust(2)+':'+str(ido[1]).zfill(2).rjust(2)+
158                    ':'+str(ido[2]).zfill(2).rjust(2),file=fki)
159  
160      fki.close()
161          
162  #----------------------------------------------------------------------------------------------
163  # 7. Készítsen egy listát, amelyben megadja, hogy az egyes részlegeket hányan
164  #    használták! Az eredményt a minta szerint írja ki a képernyőre! Ha egy
165  #    vendég egy részlegen többször is járt a nap folyamán, azt a statisztikában
166  #    csak egynek számolja!
167  #----------------------------------------------------------------------------------------------
168  def F7():
169      print('\n7. feladat')
170      reszleg=['Uszoda','Szaunák','Gyógyvizes medencék','Strand']     #177.sor miatt
171      fo=[0]*4    #Számlálók listája az egyes részlegekhez.
172      voltmar={0}     #176.sor miatt az öltözőt már itt beleírom a halmazba (öltöző kódja:0)
173      #Kihasználom, hogy a részlegkódok (1,2,3,4 értékek) indexeknek (0,1,2,3) is jók!
174      for bejegyzes in vendegek.values():
175          for mozgas in bejegyzes:
176              if mozgas[0] not in voltmar:    #Ha még nincs a halmazban az adott részlegkód, akkor
177                  fo[mozgas[0]-1]+=1          #a részlegkódnak megfelelő indexen (-1) növelem a számlálót!
178                  voltmar.add(mozgas[0])      #A már megszámlált részleg kódját a halmazba teszem!
179          voltmar={0}     #Amikor végzek egy bejegyzéssel, azaz egy vendéggel, a halmazt inicializálom!
180      for i in range(4):
181          print('%s: %d' %(reszleg[i],fo[i]))  #Ez csak azért, hogy ne legyen 4 print parancsom... :)
182  
183      # VAGY - halmazok bevetésével oldhatjuk meg
184      # a reszleg lista a részleg neve mellett egy halmazt is tartalmaz,
185      # melybe "beledobáljuk" az adott részlegen járó vendég azonosítóját,
186      # kihasználva azt, hogy a halmaz nem tartalmaz ismétlődő elemeket...
187      print('------------------- halmazos megoldás -------------------')
188      reszleg=[('Öltöző',set()),('Uszoda',set()),('Szaunák',set()),('Gyógyvizes medencék',set()),('Strand',set())]
189      for bejegyzes in vendegek.items():
190          for mozgas in bejegyzes[1]:
191              reszleg[mozgas[0]][1].add(bejegyzes[0])
192      for i in range(1,len(reszleg)):
193          print('%s: %d' %(reszleg[i][0],len(reszleg[i][1])))
194  #-------------------------------F Ő M O D U L--------------------------------------------------
195  
196  F1()
197  F2()
198  F3()
199  F4()
200  F5()
201  F6()
202  F7()
203