ipv6201405.py
1    def kiir(ssz,szoveg):
2        print('{}. feladat - {}'.format(ssz,szoveg))
3    
4    #-----------------------------------------------------------------------------
5    # 1. Olvassa be az ip.txt állományban talált adatokat, s annak
6    #    felhasználásával oldja meg a következő feladatokat!
7    #-----------------------------------------------------------------------------
8    kiir(1,'Adatok beolvasása')
9    fv=open('ip.txt','r')
10   
11   ip_cimek=[]     #egyszerű listában tároljuk az adatokat, minden elem egy sztring
12   for ip in fv:
13       ip_cimek.append(ip.rstrip())
14   fv.close() 
15   
16   #-----------------------------------------------------------------------------
17   # 2. Határozza meg és írja a képernyőre, hogy hány adatsor van az állományban!
18   #-----------------------------------------------------------------------------
19   kiir(2,'Adatsorok száma')
20   
21   print(f'Az állományban {len(ip_cimek)} darab adatsor van.')
22   
23   #-----------------------------------------------------------------------------
24   # 3. Írja a képernyőre az állományban található legalacsonyabb IP-címet!
25   #    A megoldásában felhasználhatja, hogy a betűk ASCII-kódjai a számok
26   #    ASCII-kódjai után találhatók a kódtáblában.
27   #-----------------------------------------------------------------------------
28   kiir(3,'Legalacsonyabb IP-cím')
29   
30   ip_cimek2=sorted(ip_cimek)  #rendezéssel oldjuk meg ezt a feladatot
31   print('A legalacsonyabb tárolt IP-cím:')
32   print(ip_cimek2[0])
33   
34   #-----------------------------------------------------------------------------
35   # 4. Határozza meg, hogy az állományban hány darab IP-cím van az egyes
36   #    fajtákból! Az eredményt jelenítse meg a képernyőn a mintának megfelelően!
37   #-----------------------------------------------------------------------------
38   kiir(4,'IP-címek fajtánként')
39   # 2001:0db8 - dokumentációs címek
40   # 2001:0e - globális egyedi címek
41   # fc és fd - helyi egyedi címek
42   ip_fajta=[0]*3
43   #megszámlálás, semmi más...
44   for ip in ip_cimek:
45       if ip[:9]=='2001:0db8':
46           ip_fajta[0]+=1
47       if ip[:7]=='2001:0e':
48           ip_fajta[1]+=1
49       if ip[:2]=='fc' or ip[:2]=='fd':
50           ip_fajta[2]+=1
51   
52   print('Dokumentációs cím: {} darab'.format(ip_fajta[0]))
53   print('Globális egyedi cím: {} darab'.format(ip_fajta[1]))
54   print('Helyi egyedi cím: {} darab'.format(ip_fajta[2]))
55   
56   #-----------------------------------------------------------------------------
57   # 5. Gyűjtse ki a sok.txt állományba azokat az IP-címeket, melyek legalább
58   #    18 nullát tartalmaznak! A fájlban minden sor elején szerepeljen az eredeti
59   #    állományból a cím sorszáma! Ezt kövesse egy szóközzel elválasztva a cím
60   #    az ip.txt állományban szereplő alakjával!
61   #-----------------------------------------------------------------------------
62   kiir(5,'Legalább 18 nullát tartalmazó címek')
63   
64   sok=open('sok.txt','w')
65   
66   #"kihasználjuk" a Pythont: count
67   for i in range(len(ip_cimek)):
68       if ip_cimek[i].count('0')>=18:
69           print(str(i)+' '+ip_cimek[i], file=sok)
70   
71   sok.close()
72   
73   #-----------------------------------------------------------------------------
74   # 6. Kérjen be a felhasználótól egy sorszámot! Az állományban a megadott
75   #    sorszámon található IP-címet rövidítse a csoportokon belüli bevezető
76   #    nullák elhagyásával! Az állományban található alakot és a rövidített
77   #    változatot írja a képernyőre egymás alá!
78   #-----------------------------------------------------------------------------
79   kiir(6,'IP-cím rövidítése')
80   
81   # bevezető nullák elhagyása:
82   # eredeti:      2001:0db8:03cd:0000:0000:ef45:0006:0123
83   # rövidített:   2001:db8:3cd:0:0:ef45:6:123
84   
85   #függvény, csak hogy "rend" legyen... :)
86   def rovidites(ipc):
87       reszek=[]   #listát készítünk az ip címeből
88       reszek=ip_cimek[s].split(':')   #úgy, hogy a : a szeparáló elem
89       uj_ip=[]    #az új, rövidített cím ebben lesz
90       for resz in reszek:
91           resz=':'+resz   #a reszek lista elemei elé : kerül, hogy...
92           while resz.startswith(':0'):     #vizsgálhassuk a ':0' esetet
93               resz=resz.replace(':0',':')  #és addig cseréljük a ':0'-t, amíg van
94           if resz==':':       #ha csak ennyi "maradna" a reszből
95               resz=':0'       #akkor kiegészítjük egy nullával
96           uj_ip.append(resz)  #készül az új cím listája
97       uj_ip=''.join(uj_ip)    #szöveggé alakítjuk a listát
98       uj_ip=uj_ip[1:]         #az elején ':' van, ezért azt kihagyjuk
99       return uj_ip
100  
101  s=int(input('Kérek egy sorszámot: '))-1
102  rovid_ip=rovidites(ip_cimek[s])
103  print('Az ip-cím: ',ip_cimek[s])
104  print('Az új cím: ',rovid_ip)
105  
106  #-----------------------------------------------------------------------------
107  # 7. Az előző feladatban használt IP-címet rövidítse tovább az egymást követő
108  #    nullás csoportok rövidítésére vonatkozó szabályoknak megfelelően!
109  #    Az eredményt jelenítse meg a képernyőn! Amennyiben nem rövidíthető,
110  #    írja ki: „Nem rövidíthető tovább.”!
111  #-----------------------------------------------------------------------------
112  kiir(7,'IP-cím további rövidítése')
113  
114  #leghosszabb rövidíthető sorozat keresése
115  ip_lst=rovid_ip.split(':')  #ismét listát csinálunk a ip-címből
116  maxh=0  #leghosszabb ':0' sorozat hossza ebben lesz
117  db=0    #számoljuk az egymást követő '0' értékű elemeket az ip_lst-ban
118  for i in range(len(ip_lst)):
119      if ip_lst[i]=='0':  #ha a listaelem 0, akkor
120          db+=1           #elkezdjük számolni, hogy hány ilyen van sorozatban
121      else:               #ha nem 0 a listaelem, akkor megnézzük:
122          if db>maxh:     #ez-e a maximum
123              maxh=db     #ha igen, akkor mennyiségét és helyét eltároljuk
124              hely=i-db
125              db=0        #db nullázása, mert lehet még ennél hosszabb eset is
126  
127  if maxh<=1:     #ha max<=1, akkor max egy 0 volt a listában, így nem rövidíthető
128      print('Nem rövidíthető tovább!')
129  else:
130      for i in range(maxh):   #egyébként
131          ip_lst.pop(hely)    #"kitörölgetjük" a nullákat
132      ip_lst.insert(hely,'')  #a kitörlgetett elemek helyett egy "üres" elem lesz
133      ip=':'.join(ip_lst)     #majd szöveggé alakítjuk : karakterrel "tagolva"
134                              #a listát
135      print('Tovább rövidítve: ',ip)