park202210dk_emelt_dict.py
1    #---------------------------------------------------------------------
2    # 1. Olvassa be a felajanlas.txt állomány tartalmát, tárolja el a
3    #    felajánlások adatait, és annak felhasználásával oldja meg a
4    #    következő feladatokat!
5    #---------------------------------------------------------------------
6     
7    fbe=open('felajanlas.txt','r')
8    N=int(fbe.readline().strip())
9    park={}     # szótár (dictionary) típussal oldjuk meg a feladatot
10   for i,elem in enumerate(fbe,start=1):   # nem kell a klasszikus indexelés
11       elem=elem.strip().split()
12       elem[0]=int(elem[0])
13       elem[1]=int(elem[1])
14       park[i]=elem        # szótár feltöltése: minden bejegyzés egy lista
15   fbe.close()
16   #print(park)
17   #---------------------------------------------------------------------
18   # 2. Írja ki, hány felajánlást tartalmaz az állomány!
19   #---------------------------------------------------------------------
20   print('2. feladat')
21   print(f'A felajánlások száma: {len(park)}')
22   #---------------------------------------------------------------------
23   # 3. Jelenítse meg a képernyőn azon felajánlások sorszámát, amelyek
24   #    a bejárat bal és jobb oldalán található ágyást is beültetnék!
25   #    A sorszámokat egy-egy szóközzel válassza el egymástól!
26   #---------------------------------------------------------------------
27   print('3. feladat')
28   print('A bejárat mindkét oldalán ültetők:',end=' ')
29   for k,v in park.items():    # szótár bejárása: k - kulcs, v - value
30       if v[0]>v[1]:           # a v egy lista, ugye!
31           print(k,end=' ')    # kulcsok 1-től N-ig vannak
32   print()
33   #---------------------------------------------------------------------
34   # 4. Kérje be a felhasználótól egy ágyás sorszámát! A tesztelés során
35   #    használhatja az 1. ágyást, amelyet többen is beültetnének és a
36   #    269. ágyást, amelynek beültetésére senki sem vállalkozik.
37   #       a) Írja a képernyőre, hogy hány felajánlásban szerepel ez
38   #          az ágyás!
39   #       b) Adja meg, milyen színű lesz ez az ágyás, ha mindenki a
40   #          felajánlások sorrendjében végzi el az ültetést, de nem
41   #          ültet, ha másvalaki előtte már ültetett oda! Ha nem
42   #          ültetett oda senki, akkor „Ezt az ágyást nem ültetik be.”
43   #          szöveget jelenítse meg!
44   #       c) Adja meg, milyen színekben pompázna ez az ágyás, ha az
45   #          eredeti tervvel ellentétesen minden felajánló elültetné
46   #          virágait! Minden színt csak egyszer tüntessen fel!
47   #          Az egyes színeket szóközökkel válassza el egymástól! Ha nem
48   #          ültettek oda virágot, ne jelenítsen meg semmit! 
49   #---------------------------------------------------------------------
50   print('4. feladat')
51   agyas_ssz=int(input('Adja meg az ágyás sorszámát! '))
52   
53   db=0    # hány darab vállalásban szerepel
54   szin=[] # lista legyen, hogy az 1. elemre majd hivatkozhassunk (63. sor)
55   for v in park.values():
56       eltol=N if v[0]>v[1] else 0  # kapu körüli vállalás: így egyszerűbb
57       if v[0]<=agyas_ssz+eltol<=v[1]+eltol:
58           db+=1
59           szin.append(v[2])
60       
61   print(f'A felajánlók száma: {db}')
62   if db>0:
63       print(f'A virágágyás színe, ha csak az első ültet: {szin[0]}')
64       print(f'A virágágyás színei:',end=' ')
65       for sz in set(szin):    # itt legyen halmaz, minden szín csak 1-szer
66           print(sz,end=' ')
67   else:
68       print('Ezt az ágyást nem ültetik be.')
69   print()
70   #---------------------------------------------------------------------
71   # 5. A felajánlások alapján több eset lehetséges. Határozza meg,
72   #    melyik teljesül! Az idézőjelek közötti szöveget írja a képernyőre!
73   #       • „Minden ágyás beültetésére van jelentkező.”
74   #       • Ha nincs minden ágyásra jelentkező, de a felajánlásokban
75   #         vállalt ágyások számának összege nagyobb vagy egyenlő, mint,
76   #         az ágyások száma, akkor:
77   #         „Átszervezéssel megoldható a beültetés.”
78   #       • Ha kevesebb ágyás beültetésére vállalkoztak, mint amennyi van:
79   #         „A beültetés nem oldható meg.”
80   #---------------------------------------------------------------------
81   print('5. feladat')
82   agyas={}    # itt is szótár legyen
83   for key in range(1,N+1):
84       agyas[key]=False    # szótár feltöltése
85   db=0    
86   for v in park.values():
87       kezd=v[0]
88       vege=v[1]
89       db+=vege-kezd+1
90       if kezd<vege:   # "normál" felajánlás
91           for key in range(kezd,vege+1):
92               if agyas[key]==False:   # ha még nem foglalkoztunk vele...
93                   agyas[key]=True     # True, ha van rá felajánlás
94       else:
95           db=N-kezd+1+vege    # kapu körüli felajánlás
96           for key in range(kezd,N+1):
97               if agyas[key]==False:   # mint 92-93. sor a kapuig
98                   agyas[key]=True
99           for key in range(1,vege+1): # mint 92-93. sor a kaputól
100              if agyas[key]==False:
101                  agyas[key]=True
102  
103  true_db=0   # számoljuk meg az agyas szótárban a True értékeket
104  for v in agyas.values():
105      if v:
106          true_db+=1
107  
108  if true_db==N:
109      print('Minden ágyás beültetésére van jelentkező.')
110  elif db>=N:  # nem minden ágyásra, de elegendő számúra jelentkeztek
111      print('Átszervezéssel megoldható a beültetés.')
112  else:
113      print('A beültetés nem oldható meg.')
114  #---------------------------------------------------------------------
115  # 6. A beültetést a felajánlások sorrendjében végezték el. Ha egy
116  #    ágyást valaki már beültetett, akkor más már nem ültetett oda.
117  #    A munka eredményét tárolja el a szinek.txt fájlban!
118  #    A fájlban soronként az ágyások sorszámának sorrendjében két
119  #    értéket, az ágyás színét jelző karaktert és az ültetéshez tartozó
120  #    felajánlás sorszámát írja ki. Amelyik ágyás virág nélkül maradt,
121  #    színként a # karaktert, a felajánlás sorszámának helyére pedig a
122  #    0-t írja! 
123  #---------------------------------------------------------------------
124  print('6. feladat')
125  agyas={}    # 5. feladathoz hasonló logika szerint oldjuk meg!
126  for key in range(1,N+1):
127      agyas[key]=['#',0]
128  
129  for k,v in park.items():
130      kezd=v[0]
131      vege=v[1]
132      db+=vege-kezd+1
133      if kezd<vege:
134          for key in range(kezd,vege+1):
135              if agyas[key]==['#',0]:
136                  agyas[key]=[v[2],k]
137      else:
138          db=N-kezd+1+vege
139          for key in range(kezd,N+1):
140              if agyas[key]==['#',0]:
141                  agyas[key]=[v[2],k]
142          for key in range(1,vege+1):
143              if agyas[key]==['#',0]:
144                  agyas[key]=[v[2],k]
145  
146  fki=open('szinek.txt','w')
147  [print(elem[0],elem[1],file=fki) for elem in agyas.values()]
148  fki.close()
149