FANDOM


Ha a Youtube-ról érkeztél, görgess lejjebb!

Hagyományos megoldásSzerkesztés

 f = open('ip.txt','r')
 lista = f.read().splitlines()
 f.close()
 db = len(lista)
 print('1. feladat - adatbeolvasás - kész')
 print('2. feladat: a forrás ',db, ' sort tartalmaz')
 rend = sorted(lista)
 print('3. feladat')
 print('A legalacsonyabb IP cím: ',rend[0])
 print('4. feladat')
 fajta = [0,0,0]
 for i in range(db):
     if lista[i][0:9] == '2001:0db8':
         fajta[0] += 1
     elif lista[i][0:7] == '2001:0e':
         fajta[1] += 1
     elif lista[i][0:2] in ('fc','fd'):
         fajta[2] += 1
 print('Dokumentációs cím: ',fajta[0],' darab')
 print('Globális egyedi cím: ', fajta[1],' darab')
 print('Helyi egyedi cím: ',fajta[2],' darab')
 print('5. feladat')
 f = open('sok.txt','w')
 for i in range(db):
     if lista[i].count('0')>=18:
         f.write(str(i+1)+' '+lista[i]+'\n')
 f.close()
 print('6. feladat')
 kert = int(input('Kérem a sorszámot! (1-'+str(db)+')'))-1
 rovidip6 =''
 for i in range(len(lista[kert])):
     if lista[kert][i]!='0':
         rovidip6 = rovidip6 + lista[kert][i]
 rovidip7 = rovidip6
 rovidip6 = rovidip6.replace('::',':0:')
 print(lista[kert])
 print(rovidip6)
 print('7. feladat')
 if rovidip6 == rovidip7:
     print('Nem rövidíthető tovább')
 else:
     print(rovidip7)

Megoldás reguláris kifejezésekkel Szerkesztés

Ambox important.svgEz a szakasz az érettségi követelményeket meghaladó ismeretet tartalmaz.

A programkód részletes magyarázata ezen a videón látható.
Check.svg Tesztelve a 3.6.1 verzióban.

# -*- coding: utf-8 -*-
"""
A 2014. tavaszi IPv6 érettségi feladat megoldása reguláris kifejezésekkel.
Ez a megoldás túlmutat az érettségi követelményen, de sokkal egyszerűbb
a hagyományos szövegfeldolgozásnál.
Az érettségi szabályainak megfelelően élni fogunk az egyszerűsítő feltételekkel.
Tehát cím nem kezdődhet nullával, bevezető nulla csak : után lehet.
A feladatból nem tűnik egyértelműnek, és a forrásban sincs ilyen, de a
"le lehet egyszerűsíteni két kettőspont közötti üres csoportra" a cím végén
álló nullás csoportra is érvényes (pl. a csupa 0-ból '::' lesz).
"""
 
import re
 
nullacsoport = re.compile(':0+([\da-f]+)') # Ennek mohónak kell lennie.
# Ha a végén nem lehet nullacsoport (ezt is elfogadták az érettségin):
tobbcsoport = re.compile(':(?:0:){2,}') # Vigyázat, csak non-capturing módban jó!
# Ha a végén is lehet nullacsoport (ez a teljes értékű megoldás, felülírjuk vele az előzőt):
tobbcsoport = re.compile(r'(?::0){2,}') # Vigyázat, csak non-capturing módban jó!
 
def f(i):
    print('\n%d. feladat' % i)
 
def rovidit1(s):
    return nullacsoport.sub(r':\1', s) # Itt a \1 smiley-t jelenítene meg.
 
def rovidit2(s):
    temp = rovidit1(s)
    # Piszkos trükk: a leghosszabb csoport lexikografikusan is a legnagyobb.
    # Ha a végén nem lehet nullacsoport, akkor a második replace nem kell.
    try:
        return temp.replace(max(tobbcsoport.findall(temp)), '::', 1).replace(':::', '::')
    except ValueError:
        return 'Nem rövidíthető tovább.'
 
def teszt(ip):
    print('\n%s\n%s\n%s\n' % (ip, rovidit1(ip), rovidit2(ip))
 
teszt('fc11:0000:0000:0f00:0000:0000:0000:2222') # A 2. csoport hosszabb.
teszt('fc11:0000:0000:0000:00a0:0000:0000:2222') # Az 1. csoport hosszabb.
teszt('fc11:0000:0000:0a00:00a0:0000:0000:2222') # Egyformák.
teszt('fc11:0000:0000:0a00:00a0:0000:0000:0000') # A végén van a leghosszabb.
teszt('fc11:0000:fc11:0000:0a00:00a0:0000:0000') # A végén van a leghosszabb, a többi egyszeres.
teszt('0000:0000:0000:0000:0000:0000:0000:0000') # Csupa 0.
teszt('fc05:00c0:c08c:0f00:0d00:fcc0:0093:7008') # Nincs 0.
teszt('2001:0ed0:0090:0000:010e:0098:0080:6d0c') # Nincs dupla 0.
 
egyben = open('ip.txt').read() # Van, amire célszerűbb egyben tartani.
lista = egyben.split('\n')[:-1] # De jó lesz egy listaverzió is. (A végső sortörés levágva.)
"""
A mintamegoldásokban általában pontosan egyféle tárolást látunk, itt célszerű
a kettő. A feladatsor nem követeli meg a beolvasott adatok tárolását, a javítási
útmutató viszont igen. Másik hasonló feladatsor javításakor találkoztam olyan
megoldással, ahol a vizsgázó minden feladatnál újra megnyitotta az állományt, 
és tárolás nélkül röptében feldolgozta – ezt is elfogadtam, mert a feladatnak
megfelelt.
"""
 
f(2)
print('Az állományban %d darab adatsor van.' % len(lista))
 
f(3)
print('A legalacsonyabb tárolt IP-cím:')
print(min(lista))
 
f(4)
kimenet = '''Dokumentációs cím: %d darab
Globális egyedi cím: %d darab
Helyi egyedi cím: %d darab'''
print(kimenet % tuple([len(re.findall(regex, egyben)) 
    for regex in ('(?m)^2001:0db8.*', '(?m)^2001:0e.*', '(?m)^f[cd].*')]))
 
# A következő két feladatban a sorszámot sajnos muglik módjára kell érteni,
# 1-től kezdve; ez csak a feladathoz mellékelt mintából derül ki.
# Sokat kockáztat az a vizsgázó, aki nullától sorszámoz.
# f(5)
with open('sok.txt', 'w') as out:
    for i in range(len(lista)):
        cim = lista[i]
        if len(re.sub('[^0]', '', cim)) >= 18:
            out.write('%d %s\n' % (i + 1, cim))
            # \n helyett \r\n-nel megkapnánk a mintamegoldást byte-ra pontosan.
 
f(6)
sorsz = int(input('Kérek egy sorszámot: '))
ip = lista[sorsz-1]
print(ip)
print(rovidit1(ip))
 
f(7)
print(rovidit2(ip))

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.

A Wikia-hálózat

Véletlen wiki