A Nemzetközi Sakkszövetség (Fédération Internationale des Échecs, FIDE) honlapján elérhető a világ jelenleg és korábban versenyszerűen sakkozó játékosainak eredményességét mutató Élő-pontszám és a versenyzők néhány más adata. A sakk.txt fájl tartalmazza a 2021. februári ranglistát, 363272 sakkozó adatait tárolja azonos formátumban.
A fájl táblázatos kinézetét szóközök segítségével alakították ki. Minden sor pontosan 135 karaktert tartalmaz (csak az angol ABC karakterei, valamint számok és írásjelek fordulnak benne elő). A 16–76. karakterhelyen található balra igazítva a versenyző neve, a 77–79. karakterhelyen a versenyző országának hárombetűs rövidítése (a magyaroknál a szokásos HUN), a 81. karakterhelyen a versenyző nemét jelző betű (angol rövidítéssel M: férfi vagy F: nő), a 114–117. karakterhelyen a versenyző aktuális Élő-pontszáma, és a 127–130. karakterhelyen a versenyző születési éve. A többi adatra nem lesz szükségünk a feladatok megoldása során.
Készítsünk programot, amely megoldja a következő feladatokat. A feladatok megoldása során mindig írjuk ki a feladat sorszámát. Törekedjünk a mintának megfelelő kommunikációra a felhasználóval. Az ékezetek nélküli kiírás is megfelelő.
Feladatok:
Olvassuk be a szöveges állományt és tároljuk el a fájl azon sorainak adatait, amelyek magyar versenyzőkről szólnak, tehát a magyar versenyzők nevét, nemét, Élő-pontszámát és születési évét. A név ne tartalmazza a fájlban a név után írt szóközöket, az Élő-pontszám és a születési év legyen egész érték.
Adjuk meg, hogy hány női, és hány férfi sakkozónk szerepel a listában.
Adjuk meg a legmagasabb Élő-pontszámmal rendelkező férfi és női sakkozónk nevét, pontszámát és születési évét.
Állapítsuk meg és írjuk ki, hogy hány olyan női versenyzőink van, aki 1990-ben vagy az után született, és Élő-pontszáma legalább 2000.
A Polgár családból többen is szerepelnek a listán. Adjuk meg a családtagok keresztnevét, születési dátumát és Élő-pontszámát táblázatos elrendezésben. A lista legyen a családtagok Élő-pontszáma szerint növekvő sorrendben.
Polgár Judit minden idők legkiválóbb női sakkozója, 1989-től 2005-ig vezette a női ranglistát, legmagasabb Élő-pontszáma 2735 volt. Adjuk meg, hogy kik azok a sakkozóink, akik legalább akkora pontszámmal rendelkeznek, mint Polgár Judit 2021. februárjában. A listában a nevek a magyar írásmód szerint szerepeljenek. Tegyünk zárójelek között egy csillagot (*) azoknak a versenyzőknek a neve után, akiknek pontszáma eléri Polgár Judit egykor legmagasabb, 2735-ös pontszámát. A lista elemeit vesszővel és szóközzel válasszuk el egymástól, és zárjuk őket ponttal.
Minta:
2. feladat
A listában 5855 és 603 női sakkozónk szerepel
3. feladat
A legmagasabb pontszámú férfi versenyzőnk Rapport, Richard
Pontszáma: 2763
Születési éve: 1996
A legmagasabb pontszámú női versenyzőnk Polgar, Judit
Pontszáma: 2675
Születési éve: 1976
4. feladat
33 olyan női sakkozónk van, aki 1990-ben vagy az után született, és Élő-pontszáma legalább 2000
5. feladat
A Polgár család tagjai
Szilvia
2010
1052
Janos
1954
1952
Istvan
1944
2425
Sofia
1974
2450
Susan
1969
2577
Judit
1976
2675
6. feladat
Akik elérték Polgár Judit 2021. februári pontszámát:
Almasi Zoltan, Rapport Richard(*).
# 1. feladat
fajl = open('sakk.txt')
forras = fajl.read().splitlines()
fajl.close()
# string.strip(): lepucolja a szóközöket a végéről, elejéről
# adatok[név,állampolgárság,nem,pontszám,születési év]
adatok = [[s[15:76].strip(),s[76:79],s[80],int(s[113:117]),int(s[126:131])] for s in forras if s[76:79]=='HUN']
print('2. feladat:')
# érdemes szétválogatni férfi és nő szerint, mert a köv. feladatok is igénylik
ferfiak = [adat for adat in adatok if adat[2]=='M']
nok = [adat for adat in adatok if adat[2]=='F']
print('A listában',len(ferfiak),'és',len(nok),'női sakkozónk szerepel')
print('\n3. feladat:')
max_ferfi_pont = max([adat[3] for adat in ferfiak])
max_ferfi = [adat for adat in adatok if adat[3]==max_ferfi_pont][0]
max_noi_pont = max([adat[3] for adat in nok])
max_no = [adat for adat in adatok if adat[3]==max_noi_pont][0]
print('A legmagasabb pontszámú férfi versenyzőnk', max_ferfi[0],'\nPontszáma:',max_ferfi[3],'\nSzületési éve:',max_ferfi[4])
print('A legmagasabb pontszámú női versenyzőnk', max_no[0],'\nPontszáma:',max_no[3],'\nSzületési éve:',max_no[4])
print('\n4. feladat:')
lista = [1 for adat in nok if adat[4]>=1990 and adat[3]>=2000]
print(len(lista),'olyan női sakkozónk van, aki 1990-ben vagy az után született, és Élő-pontszáma legalább 2000')
print('\n5. feladat:\nA Polgár család tagjai')
polgarok = [adat for adat in adatok if 'Polgar' in adat[0]]
for ember in polgarok: ember[0] = ember[0].split(',')[1].strip()
polgarok.sort(key=lambda e:e[3])
for adat in polgarok: print(adat[0],' '*(10-len(adat[0])),adat[4],'\t',adat[3]) # a táblázati rész miatt kell a szóközökkel való feltöltés
print('\n6. feladat: Akik elérték Polgár Judit 2021. februári pontszámát:')
pjudit = [adat[3] for adat in polgarok if adat[0]=='Judit'][0] # Judit februári pontszáma
#print(pjudit)
jok = [[adat[0].split(' '),adat[3]] for adat in adatok if adat[3]>pjudit and adat[0]!='Judit, Polgar'] # kell a név és a pontszám, de a név egy kételemű lista
#print(jok)
# a jok egy eleme így néz ki: [[veznetéknév vesszővel a végén],[keresztnév],pont]
kiir = []
for nev in jok: ember = nev[0][0][:-1] + ' ' + nev[0][1] if nev[1]>=2735: ember += '(*)' kiir.append(ember)
print(', '.join(kiir)+'.')