def kiir(ssz,szoveg):
    print('{}. feladat - {}'.format(ssz,szoveg))

#-----------------------------------------------------------------------------
# 1. Olvassa be az ip.txt állományban talált adatokat, s annak
#    felhasználásával oldja meg a következő feladatokat!
#-----------------------------------------------------------------------------
kiir(1,'Adatok beolvasása')
fv=open('ip.txt','r')

ip_cimek=[]     #egyszerű listában tároljuk az adatokat, minden elem egy sztring
for ip in fv:
    ip_cimek.append(ip.rstrip())
fv.close()

#-----------------------------------------------------------------------------
# 2. Határozza meg és írja a képernyőre, hogy hány adatsor van az állományban!
#-----------------------------------------------------------------------------
kiir(2,'Adatsorok száma')

print(f'Az állományban {len(ip_cimek)} darab adatsor van.')

#-----------------------------------------------------------------------------
# 3. Írja a képernyőre az állományban található legalacsonyabb IP-címet!
#    A megoldásában felhasználhatja, hogy a betűk ASCII-kódjai a számok
#    ASCII-kódjai után találhatók a kódtáblában.
#-----------------------------------------------------------------------------
kiir(3,'Legalacsonyabb IP-cím')

ip_cimek2=sorted(ip_cimek)  #rendezéssel oldjuk meg ezt a feladatot
print('A legalacsonyabb tárolt IP-cím:')
print(ip_cimek2[0])

#-----------------------------------------------------------------------------
# 4. Határozza meg, hogy az állományban hány darab IP-cím van az egyes
#    fajtákból! Az eredményt jelenítse meg a képernyőn a mintának megfelelően!
#-----------------------------------------------------------------------------
kiir(4,'IP-címek fajtánként')
# 2001:0db8 - dokumentációs címek
# 2001:0e - globális egyedi címek
# fc és fd - helyi egyedi címek
ip_fajta=[0]*3
#megszámlálás, semmi más...
for ip in ip_cimek:
    if ip[:9]=='2001:0db8':
        ip_fajta[0]+=1
    if ip[:7]=='2001:0e':
        ip_fajta[1]+=1
    if ip[:2]=='fc' or ip[:2]=='fd':
        ip_fajta[2]+=1

print('Dokumentációs cím: {} darab'.format(ip_fajta[0]))
print('Globális egyedi cím: {} darab'.format(ip_fajta[1]))
print('Helyi egyedi cím: {} darab'.format(ip_fajta[2]))

#-----------------------------------------------------------------------------
# 5. Gyűjtse ki a sok.txt állományba azokat az IP-címeket, melyek legalább
#    18 nullát tartalmaznak! A fájlban minden sor elején szerepeljen az eredeti
#    állományból a cím sorszáma! Ezt kövesse egy szóközzel elválasztva a cím
#    az ip.txt állományban szereplő alakjával!
#-----------------------------------------------------------------------------
kiir(5,'Legalább 18 nullát tartalmazó címek')

sok=open('sok.txt','w')

#"kihasználjuk" a Pythont: count
for i in range(len(ip_cimek)):
    if ip_cimek[i].count('0')>=18:
        print(str(i)+' '+ip_cimek[i], file=sok)

sok.close()

#-----------------------------------------------------------------------------
# 6. Kérjen be a felhasználótól egy sorszámot! Az állományban a megadott
#    sorszámon található IP-címet rövidítse a csoportokon belüli bevezető
#    nullák elhagyásával! Az állományban található alakot és a rövidített
#    változatot írja a képernyőre egymás alá!
#-----------------------------------------------------------------------------
kiir(6,'IP-cím rövidítése')

# bevezető nullák elhagyása:
# eredeti:      2001:0db8:03cd:0000:0000:ef45:0006:0123
# rövidített:   2001:db8:3cd:0:0:ef45:6:123

#függvény, csak hogy "rend" legyen... :)
def rovidites(ipc):
    reszek=[]   #listát készítünk az ip címeből
    reszek=ip_cimek[s].split(':')   #úgy, hogy a : a szeparáló elem
    uj_ip=[]    #az új, rövidített cím ebben lesz
    for resz in reszek:
        resz=':'+resz   #a reszek lista elemei elé : kerül, hogy...
        while resz.startswith(':0'):     #vizsgálhassuk a ':0' esetet
            resz=resz.replace(':0',':')  #és addig cseréljük a ':0'-t, amíg van
        if resz==':':       #ha csak ennyi "maradna" a reszből
            resz=':0'       #akkor kiegészítjük egy nullával
        uj_ip.append(resz)  #készül az új cím listája
    uj_ip=''.join(uj_ip)    #szöveggé alakítjuk a listát
    uj_ip=uj_ip[1:]         #az elején ':' van, ezért azt kihagyjuk
    return uj_ip

s=int(input('Kérek egy sorszámot: '))-1
rovid_ip=rovidites(ip_cimek[s])
print('Az ip-cím: ',ip_cimek[s])
print('Az új cím: ',rovid_ip)

#-----------------------------------------------------------------------------
# 7. Az előző feladatban használt IP-címet rövidítse tovább az egymást követő
#    nullás csoportok rövidítésére vonatkozó szabályoknak megfelelően!
#    Az eredményt jelenítse meg a képernyőn! Amennyiben nem rövidíthető,
#    írja ki: „Nem rövidíthető tovább.”!
#-----------------------------------------------------------------------------
kiir(7,'IP-cím további rövidítése')

#leghosszabb rövidíthető sorozat keresése
ip_lst=rovid_ip.split(':')  #ismét listát csinálunk a ip-címből
maxh=0  #leghosszabb ':0' sorozat hossza ebben lesz
db=0    #számoljuk az egymást követő '0' értékű elemeket az ip_lst-ban
for i in range(len(ip_lst)):
    if ip_lst[i]=='0':  #ha a listaelem 0, akkor
        db+=1           #elkezdjük számolni, hogy hány ilyen van sorozatban
    else:               #ha nem 0 a listaelem, akkor megnézzük:
        if db>maxh:     #ez-e a maximum
            maxh=db     #ha igen, akkor mennyiségét és helyét eltároljuk
            hely=i-db
            db=0        #db nullázása, mert lehet még ennél hosszabb eset is

if maxh<=1:     #ha max<=1, akkor max egy 0 volt a listában, így nem rövidíthető
    print('Nem rövidíthető tovább!')
else:
    for i in range(maxh):   #egyébként
        ip_lst.pop(hely)    #"kitörölgetjük" a nullákat
    ip_lst.insert(hely,'')  #a kitörlgetett elemek helyett egy "üres" elem lesz
    ip=':'.join(ip_lst)     #majd szöveggé alakítjuk : karakterrel "tagolva"
                            #a listát
    print('Tovább rövidítve: ',ip)  