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ő.

  1. Olvassuk végig 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.
  2. Adjuk meg, hogy hány női, és hány férfi sakkozónk szerepel a listában.
  3. 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.
  4. Á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.
  5. 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.
  6. 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(*).

 

Megoldás

# 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)+’.’)

News Reporter