Fizika, matek, informatika érettségi

Home Fizika Excel Access A weboldalról

Korábbi érettségi programozás feladatsorok és megoldásaik

2022. október (Jeladó)  

Az állatok mozgását ma már rutinszerűen figyelik a rájuk rögzített jeladók segítségével. Ebben a feladatban egy ilyen jeladó által továbbított adatokat kell feldolgoznia.
Az itt használt jeladó úgy működik, hogy helyének x és y koordinátáját továbbítja. Jelet küld, ha a legutolsó küldés óta bármely koordináta változása elérte a 10 egységet. Ha nem történt ekkora elmozdulás, 5 perc elteltével akkor is mindenképpen jelenti helyét. A vevőegység egy fájlban rögzíti a jel érkezési idejét és a pozíciót. Előfordulhat, hogy a vétel meghiúsul, ezért lehetnek egymást követő adatsorok, amelyek között 5 percnél több idő telik el, vagy a koordináták változása 10 egységnél nagyobb.
Rendelkezésére áll a jel.txt nevű adatfájl, amely egy napról tartalmaz adatokat időrendben. Soraiban öt egész szám található, egymástól egy-egy szóközzel elválasztva. Az első három szám a jeladás időpontját (óra, perc, másodperc) adja meg, a negyedik szám az x, az ötödik az y koordináta. A sorok száma legfeljebb 1000, a koordináták -10 000 és 10 000 közötti értékek lehetnek.
Például:

3 21 19 126 639
3 26 19 131 641
3 27 55 124 651
3 31 50 134 649

4 19 11 126 42
4 29 11 128 36
4 32 21 130 7

A példa első csoportjában a második sor megmutatja, hogy a jeladó 5 egységnyit mozdult x, 2 egységnyit pedig y irányban 5 perc alatt. A harmadik bejegyzés azért született, mert y irányban 10 egységnyit mozdult el a jeladó, a negyedik bejegyzés pedig egy x irányú 10 egységnyi elmozdulást jelez. A példa második csoportjában a második sor adataiból látszik, hogy legalább egyszer nem jutott el a jel a vevőhöz, mert 5 percnél több idő telt el az előző vételtől, de az eltelt idő a 10 percet nem haladja meg. A második és harmadik vétel által jelzett pozíciók y koordinátája 29 egységnyivel eltér, ezért legalább két vétel nem került rögzítésre.

Készítsen programot, amely az állomány adatait felhasználva az alábbi kérdésekre válaszol! A program forráskódját mentse jelado néven! A program megírásakor a felhasználó által megadott adatok helyességét, érvényességét nem kell ellenőriznie, és feltételezheti, hogy a rendelkezésre álló adatok a leírtaknak megfelelnek.
A képernyőre írást igénylő részfeladatok esetén – a mintához tartalmában hasonlóan – írja ki a képernyőre a feladat sorszámát (például: 5. feladat), és utaljon a kiírt tartalomra is!
Ha a felhasználótól kér be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár! Mindkét esetben az ékezetmentes kiírás is elfogadott.

1. Olvassa be a jel.txt állomány tartalmát, tárolja el a rögzített jelek adatait, és azok felhasználásával oldja meg a következő feladatokat!
2. Kérje be a felhasználótól egy jel sorszámát (a sorszámozás 1-től indul), és írja a képernyőre az adott jeladáshoz tartozó x és y koordinátát!
3. Készítsen függvényt eltelt néven, amely megadja, hogy a paraméterként átadott két időpont között hány másodperc telik el! A két időpontot, mint paramétert tetszőleges módon átadhatja. Használhat három-három számértéket, két tömböt vagy listát, de más, a célnak megfelelő típusú változót is. Ezt a függvényt később használja fel legalább egy feladat megoldása során!
4. Adja meg, mennyi idő telt el az első és az utolsó észlelés között! Az időt óra:perc:mperc alakban írja a képernyőre!
5. Határozza meg azt a legkisebb, a koordináta-rendszer tengelyeivel párhuzamos oldalú téglalapot, amelyből nem lépett ki a jeladó! Adja meg a téglalap bal alsó és jobb felső sarkának koordinátáit!
6. Írja a képernyőre, hogy mennyi volt a jeladó elmozdulásainak összege! Úgy tekintjük, hogy a jeladó két pozíciója közötti elmozdulása a pozíciókat összekötő egyenes mentén történt. Az összeget három tizedes pontossággal jelenítse meg! A kiírásnál a tizedesvessző és tizedespont kiírása is elfogadott. Az i-edik és az i+1-edik pontok távolságát a $\sqrt{(x_i-x_{i-1})^2+(y_i-y_{i-1})^2}$ képlet segítségével határozhatja meg.
7. Írja a kimaradt.txt fájlba a kimaradt észlelésekkel kapcsolatos adatokat! A kimeneti fájlban azok a bemeneti állományban rögzített vételi időpontok jelenjenek meg, amelyek előtt közvetlenül egy vagy több észlelés kimaradt! Az időpont mellett – a mintának megfelelően – jelenjen meg, hogy legalább hány jel maradt ki és az is, hogy miből következtet a hiányra! Ha idő- és koordináta-eltérésből is adódik jelkimaradás, akkor a nagyobb értéket írja ki! Ha az időeltérés és a koordináták eltérése alapján is ugyanannyi jelkimaradásra következtetünk, akkor bármelyiket kiírhatja.

Minta
2. feladat
Adja meg a jel sorszámát! 3
x=126 y=639

4. feladat
Időtartam: 18:52:40

5. feladat
Bal alsó: 4 639, jobb felső: 147 727

6. feladat
Elmozdulás: 2007.677 egység

Minta a kimaradt.txt fájl tartalmára
4 25 33 időeltérés 1
4 55 33 koordináta-eltérés 1
5 5 33 időeltérés 1
6 22 42 időeltérés 2
6 32 42 koordináta-eltérés 2

Forrás: jel.txt

fajl = open("jel.txt")
forras = fajl.read().splitlines()
fajl.close()
adatok = [sor.split(" ") for sor in forras] #adatok[ó,p,mp,x,y]
for adat in adatok: #számokká konvertáljuk az adatokat stringből
for i in range(len(adat)):
adat[i] = int(adat[i])
#print(adatok) #ellenőrző kiírás

ssz = int(input("2. feladat\nAdja meg a jel sorszámát! "))-1
print(f"x={adatok[ssz][3]} y={adatok[ssz][4]}")

def eltelt(ido1,ido2): #ido1: [ó1,p1,mp1] és idő2[ó2,p2,mp2]
#mindent másodpercbe váltunk, és visszaadjuk a kettő különbségét
return 3600*ido2[0]+60*ido2[1]+ido2[2]-(3600*ido1[0]+60*ido1[1]+ido1[2])

it = eltelt(adatok[0][:3],adatok[-1][:3])
print(f"\n4. feladat\nIdőtartam: {it//3600}:{(it-3600*(it//3600))//60}:{it%60}")

xek = [adat[3] for adat in adatok]
yok = [adat[4] for adat in adatok]
print(f"\n5. feladat\nBal alsó: {min(xek)} {min(yok)}, jobb felső: {max(xek)} {max(yok)}")

tav = 0
for i in range(1,len(adatok)):
tav += ((adatok[i][3]-adatok[i-1][3])**2 + (adatok[i][4]-adatok[i-1][4])**2)**0.5
print(f"\n6. feladat\nElmozdulás: {round(tav,3)} egység")

fajl = open("kimaradt-vg.txt","w")
for i in range(1,len(adatok)):
regi = adatok[i]
uj = adatok[i-1]
kimaradtido = 0
xkimaradtkoord = 0
ykimaradtkoord = 0
kimaradtkoord = 0
idokulonbseg = eltelt(adatok[i-1][:3],adatok[i][:3])
xkulonbseg = abs(adatok[i][3] - adatok[i-1][3])
ykulonbseg = abs(adatok[i][4] - adatok[i-1][4])
if idokulonbseg > 300:
kimaradtido = (idokulonbseg // 300)
if idokulonbseg % 300 == 0:
kimaradtido -= 1
if xkulonbseg//10>0:
xkimaradtkoord = xkulonbseg//10
if xkulonbseg%10 == 0:
xkimaradtkoord -= 1
if ykulonbseg//10>0:
ykimaradtkoord = ykulonbseg//10
if ykulonbseg%10 == 0:
ykimaradtkoord -= 1
kimaradtkoord = max([xkimaradtkoord,ykimaradtkoord])
if kimaradtido+kimaradtkoord > 0: #ha nem volt eltérés, ez az összeg 0
if kimaradtido > kimaradtkoord:
print(f"{regi[0]} {regi[1]} {regi[2]} időeltérés {kimaradtido}",file=fajl)
else:
print(f"{regi[0]} {regi[1]} {regi[2]} koordináta-eltérés {kimaradtkoord}",file=fajl)
fajl.close()

2022. május (Építményadó)  

Egy Balaton-parti önkormányzat építményadót vezet be. Az adó mértéke a telken lévő építmény alapterületétől és a teleknek a Balatontól mért távolságától függ. A telkeket a Balatonparttól mért távolságtól függően három sávba sorolták be. Az A sávba azok a telkek kerültek, amelyek 300 méternél közelebb vannak a tóhoz a B sáv az előzőn túl 600 méter távolságig terjed, a többi telek a C sávba tartozik. Az építmény után négyzetméterenként fizetendő összeg sávonként eltérő, azonban, ha az így kiszámított összeg nem éri el a 10.000 Ft-ot, akkor az adott építmény után nem kell adót fizetni.
A testületi döntést az Adó Ügyosztály egy mintával készítette elő, amely csupán néhány utca adatait tartalmazza. Ezek az adatok az utca.txt fájlban vannak. A fájl első sorában a három adósávhoz tartozó négyzetméterenként fizetendő összeg található A, B, C sorrendben, egy-egy szóközzel elválasztva:
800 600 100

33366 Aradi 8A C 180
22510 Aradi 8B C 137
90561 Aradi 10 C 168
A többi sorban egy-egy építmény adatai szerepelnek egy-egy szóközzel elválasztva. Az első a telek tulajdonosának ötjegyű adószáma; egy tulajdonosnak több telke is lehet. A második adat az utca neve, amely nem tartalmazhat szóközt. A harmadik adat a házszám, majd az adósáv megnevezése, végül az építmény alapterülete következik. A minta harmadik sorában például azt látjuk, hogy a 33366 adószámú tulajdonos telke az Aradi utca 8A-ban található, és a C sávba eső telken álló építmény alapterülete 180 m2.

A fájl legfeljebb 1000 telek adatait tartalmazza. A feladat megoldása során kihasználhatja, hogy a fájlban az adatok utca, azon belül pedig házszám szerinti sorrendben következnek. Készítsen programot, amely az utca.txt állomány adatait felhasználva az alábbi kérdésekre válaszol! A program forráskódját mentse epitmenyado néven!

(A program megírásakor a felhasználó által megadott adatok helyességét, érvényességét nem kell ellenőriznie, és feltételezheti, hogy a rendelkezésre álló adatok a leírtaknak megfelelnek.) A képernyőre írást igénylő részfeladatok esetén – a mintához tartalmában hasonlóan – írja ki a képernyőre a feladat sorszámát (például: 3. feladat), és utaljon a kiírt tartalomra is! Ha a felhasználótól kér be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár! Mindkét esetben az ékezetmentes kiírás is elfogadott.

1. Olvassa be és tárolja el az utca.txt állományban talált adatokat, és annak felhasználásával oldja meg a következő feladatokat!
2. Hány telek adatai találhatók az állományban? Az eredményt írassa ki a mintának megfelelően a képernyőre!
3. Kérje be egy tulajdonos adószámát, és írassa ki a mintához hasonlóan, hogy melyik utcában, milyen házszám alatt van építménye! Ha a megadott azonosító nem szerepel az adatállományban, akkor írassa ki a „Nem szerepel az adatállományban.” hibaüzenetet!
4. Készítsen függvényt ado néven, amely meghatározza egy adott építmény után fizetendő adót! A függvény paraméterlistájában szerepeljen az adósáv és az alapterület, visszaadott értéke pedig legyen a fizetendő adó! A következő feladatokban ezt a függvényt is felhasználhatja.
5. Határozza meg, hogy hány építmény esik az egyes adósávokba, és mennyi az adó összege adósávonként! Az eredményt a mintának megfelelően írassa ki a képernyőre!
6. Bár az utcák többé-kevésbé párhuzamosak a tó partjával, az egyes porták távolsága a parttól az utcában nem feltétlenül ugyanannyi. Emiatt néhány utcában – az ottani tulajdonosok felháborodására – egyes telkek eltérő sávba esnek. Listázza ki a képernyőre, hogy melyek azok az utcák, ahol a telkek sávokba sorolását emiatt felül kell vizsgálni! Feltételezheti, hogy minden utcában van legalább két telek.
7. Határozza meg a fizetendő adót tulajdonosonként! A tulajdonos adószámát és a fizetendő összeget írassa ki a mintának megfelelően a fizetendo.txt állományba! A fájlban minden tulajdonos adatai új sorban szerepeljenek, a tulajdonos adószámát egy szóközzel elválasztva kövesse az általa fizetendő adó teljes összege.

Példa a szöveges kimenetek kialakításához:
2. feladat. A mintában 543 telek szerepel.
3. feladat. Egy tulajdonos adószáma: 68396
Harmat utca 22
Szepesi utca 17
5. feladat
A sávba 165 telek esik, az adó 20805600 Ft.
B sávba 144 telek esik, az adó 13107000 Ft.
C sávba 234 telek esik, az adó 3479600 Ft.
6. feladat. A több sávba sorolt utcák:
Besztercei
Gyurgyalag
Icce
Kurta
Rezeda
Szepesi

Példa a fizetendo.txt fájl kialakításához:
(A fájl a megadott forrásállomány esetén 519 adatsort fog tartalmazni.)
38522 18000
86379 0
79906 12300

73850 204000
74143 100000
59801 563200
73011 70400


Forrás: utca.txt

fajl = open('utca.txt')
forras = fajl.read().splitlines()
A = int(forras[0].split()[0])
B = int(forras[0].split()[1])
C = int(forras[0].split()[2])
adatok = [forras[i].split() for i in range(1,len(forras))]

print(f'2. feladat. A mintában {len(adatok)} telek szerepel.')

be = '68396'#input('3. feladat. Egy tulajdonos adószáma: ')
lista = [adat for adat in adatok if adat[0]==be]
if lista:
for i in range(len(lista)):
print(lista[i][1]+' utca '+lista[i][2])
else:
print('Nem szerepel az adatállományban.')

def ado(adosav,terulet):
if adosav == 'A':
egy = int(A)
elif adosav == 'B':
egy = int(B)
else:
egy = int(C)
ado1 = egy*int(terulet)
if ado1<10000:
return 0
else:
return ado1
print('5. feladat')
for betu in ['A','B','C']:
adoA = [ado(adat[3],adat[4]) for adat in adatok if adat[3]==betu]
print(betu+' sávba',len(adoA),'telek esik, az adó',sum(adoA),'Ft.')

print('6. feladat. A több sávba sorolt utcák:')
utcak = set([adat[1] for adat in adatok])
for utca in utcak:
lista = set([adat[3] for adat in adatok if adat[1]==utca])
if len(lista)>1:
print(utca)

fajl = open('fizetendo-vg.txt','w')
# Egy tulajdonosnak több telke is lehet!
tulajok = set([adat[0] for adat in adatok])
for tulaj in tulajok:
adoosszeg = sum([ado(adat[3],adat[4]) for adat in adatok if adat[0]==tulaj])
print(tulaj,adoosszeg,file=fajl)
fajl.close()

2022. május magyar, mint idegennyelv (Szakaszsebesség-ellenőrzés)  

A szakaszsebesség-ellenőrzést már több országban is alkalmazzák a közlekedés ellenőrzésére. Ennek lényege, hogy a járművek elhaladnak két egymástól több kilométerre lévő ellenőrzőkapunál. Mindkét ponton rögzítik a jármű rendszámát és az elhaladás időpontját. Majd a két időérték segítségével kiszámítják az átlagsebességet. Ha ez meghaladja az útszakaszon megengedett legnagyobb sebességet, akkor a jármű vezetője szabálysértést követ el. Rendelkezésünkre állnak egy 10 km-es kétszer egysávos főútvonal egyik sávjában rögzített szakaszsebesség mérésének adatai. Az adott szakasz zárt, azaz nincs felhajtási és lehajtási lehetőség.
A meresek1.txt szövegállomány egy adott nap reggel 8 órától végzett 1 órányi mérés adatait tartalmazza. Minden egyes jármű csak egyszer szerepel a mérési adatok között. Egy jármű mérési adatai egy sorban szerepelnek egymástól szóközzel elválasztva. Egy sorban 9 adat szerepel, a jármű rendszáma (6 karakteren), a szakasz kezdeti- és végpontján rögzített időpont óra, perc, másodperc, ezredmásodperc formában. (A fájl olyan járművek adatait nem tartalmazza, amelyeknek a szakasz kezdeti- vagy végpontján nem volt mérési értéke.)
A sorok száma legfeljebb 1000. Az adatok a belépési ponton mért idő szerint rendezettek.
Például:
OXZ648 8 4 44 861 8 11 53 432
QUT385 8 4 53 376 8 9 28 185
QTS988 8 5 0 854 8 12 19 879
OTP604 8 5 2 263 8 12 21 288
A példában látható, hogy az QTS988 rendszámú jármű 8:5:0,854-kor haladt el a szakasz kezdetén lévő mérőnél és 8:12:19,879-kor a szakasz végén lévő mérőnél. Az átlagsebessége 82 km/h, ami a megtett út (10 km) és a megtételhez szükséges idő (0,1219 óra) hányadosa.

Készítsen programot, amely a meresek1.txt állomány adatait felhasználva az alábbi kérdésekre válaszol! A program forráskódját mentse ellenorzes néven! (A program megírásakor a felhasználó által megadott adatok helyességét, érvényességét nem kell ellenőriznie, feltételezheti, hogy a rendelkezésre álló adatok a leírtaknak megfelelnek.) A képernyőre írást igénylő részfeladatok eredményének megjelenítése előtt írja a képernyőre a feladat sorszámát (például: 3. feladat)! Ha a felhasználótól kér be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár! Az ékezetmentes kiírás is elfogadott. A tizedesszámok megjelenítésekor a használt programozási nyelvben alapértelmezett megjelenítési módot használja!
Az eredmény megjelenítését és a felhasználóval való kommunikációt a feladatot követő minta alapján valósítsa meg!
1. Olvassa be és tárolja el a meresek1.txt állomány adatait!
2. Írja ki a képernyőre, hogy hány jármű adatait rögzítették a mérés során!
3. Határozza meg a rendelkezésre álló adatok segítségével, hogy 9 óra előtt hány jármű haladt át a szakasz végpontján! A kapott értéket írja ki a képernyőre!
4. Kérjen be a felhasználótól egy óra, perc értéket!
a. Határozza meg, hogy abban a percben hány jármű haladt el a kezdő méréspontnál! Ha az adott percben nem haladt el jármű a méréspontnál, akkor a 0 értéket jelenítse meg!
b. Számítsa ki a forgalomsűrűséget, amely a megadott időpontban kezdődő percben (pl.: ha a megadott óra perc 08:09 volt, akkor 08:09:00,000- 08:09:59,999 között) az útszakaszon lévő járművek száma és az útszakasz hosszának hányadosa. Az értéket tizedes tört alakban jelenítse meg.
5. Mekkora volt a legnagyobb átlagsebességgel haladó járműnek a sebessége, és hány járművet hagyott le a mért szakasz végére? Amennyiben több legnagyobb átlagsebesség érték van, akkor elég az egyiket kiírnia. Az autó rendszámát, az átlagsebességet egész számként és a lehagyott járművek számát jelenítse meg!
6. Határozza meg, hogy a járművek hány százalékának az átlagsebessége haladta meg az útszakaszon megengedett legnagyobb sebességet (90 km/h)! Az értéket tizedes tört alakban jelenítse meg a minta szerint!
7. Készítsen egy szöveges állományt buntetes.txt néven, amely a gyorshajtók adatait tartalmazza! Ebbe a szöveges állományba azon járművek adatai kerüljenek be, amelyek átlagsebessége 104 km/h-nál nagyobb! A fájlban a jármű rendszáma, az átlagsebesség egész számként megjelenítve és a büntetés összege szerepeljen mértékegységgel, pontosvesszővel vagy tabulátorokkal elválasztottan! A büntetési tételeket a következő táblázat tartalmazza:
ÁtlagsebességBüntetés
104 km/h felett 121 km/h-ig30 000 Ft
121 km/h felett 136 km/h-ig45 000 Ft
136 km/h felett 151 km/h-ig60 000 Ft
151 km/h felett200 000 Ft

Minta a szöveges kimenetek kialakításához:
2. feladat
A mérés során 687 jármű adatait rögzítették.

3. feladat
9 óra előtt 603 jármű haladt el a végponti mérőnél.

4. feladat
Adjon meg egy óra és perc értéket! 8 20
a. A kezdeti méréspontnál elhaladt járművek száma: 12
b. A forgalomsűrűség: 9,4

5. feladat
A legnagyobb sebességgel haladó jármű
rendszáma: OKL564
átlagsebessége: 137 km/h
által lehagyott járművek száma: 33

6. feladat
A járművek 11,94%-a volt gyorshajtó.

A fájl elkészült.

A buntetes.txt fájl tartalma:
QZV314 128 km/h 45000 Ft
OJW811 107 km/h 30000 Ft
QUT385 131 km/h 45000 Ft
QRC440 128 km/h 45000 Ft
QJQ854 109 km/h 30000 Ft

Forrás: meresek1.txt

fajl = open('meresek1.txt')
forras = fajl.read().splitlines()
fajl.close()
adatok = [sor.split() for sor in forras]

print(f'2. feladat, A mérés során {len(adatok)} jármű adatait rögzítették.')

print(' 3. feladat 9 óra előtt',sum([1 for adat in adatok if int(adat[5])<9]),'jármű haladt el a végponti mérőnél.')

def ido(o,p,mp,emp): # visszatér órában
return int(o) + int(p)/60 + int(mp)/3600 + float(emp)/1000/3600

be = input(' 4. feladat Adjon meg egy óra és perc értéket! (ó p) ').split(' ')
lista = [1 for adat in adatok if adat[1]==be[0] and adat[2]==be[1]]
print(' a. A kezdeti méréspontnál elhaladt járművek száma:',sum(lista))
kezd = ido(be[0],be[1],'0','0') # perc kezdete
vege = ido(be[0],be[1],'59','999') # perc vége
darab = 0
for adat in adatok:
if kezd>=ido(adat[1],adat[2],adat[3],adat[4]) and ido(adat[5],adat[6],adat[7],adat[8])>=vege:
#print(adat,ido(adat[1],adat[2],adat[3],adat[4]),ido(adat[5],adat[6],adat[7],adat[8]))
darab += 1
print(' b. A forgalomsűrűség:',darab/10)

atlagok = [round(10/(ido(adat[5],adat[6],adat[7],adat[8]) - ido(adat[1],adat[2],adat[3],adat[4]))) for adat in adatok]
adatjo = adatok[atlagok.index(max(atlagok))]
print(' 5. feladat A legnagyobb sebességgel haladó jármű rendszáma:',adatjo[0],' átlagsebessége:',max(atlagok),'km/h')
be = ido(adatjo[1],adatjo[2],adatjo[3],adatjo[4])
ki = ido(adatjo[5],adatjo[6],adatjo[7],adatjo[8])
lehagyott = [1 for adat in adatok if be>ido(adat[1],adat[2],adat[3],adat[4]) and ki print(' által lehagyott járművek száma:',sum(lehagyott))

tullepok = [atlag for atlag in atlagok if atlag>90]
print(' 6. feladat A járművek',str(round(len(tullepok)/len(adatok)*100,2))+'%-a volt gyorshajtó.')

fajl = open('buntetes-vg.txt','w')
for adat in adatok:
atlagseb = round(10/(ido(adat[5],adat[6],adat[7],adat[8]) - ido(adat[1],adat[2],adat[3],adat[4])))
bunti = 0
if 104<atlagseb<=121:
bunti = 30000
elif 121<atlagseb<=136:
bunti = 45000
elif 136<atlagseb<=151:
bunti = 60000
elif 150<atlagseb:
bunti = 200000
if bunti>0:
print(adat[0],' ',atlagseb,'km/h ',bunti,'Ft',file=fajl)
print(' A fájl elkészült.')
fajl.close()

2021. október (Sodoku)  

A sudoku egy logikai játék, melyben megadott szabályok szerint számjegyeket kell elhelyezni egy táblázatban. Ebben a feladatban 9×9-es táblázatot használunk.


A táblázat – az ábrának megfelelően – 9 darab 3×3-as résztáblázatra van felosztva. Minden résztáblázatot az 1, 2, 3, 4, 5, 6, 7, 8, 9 számokkal kell kitölteni úgy, hogy az egész 9×9-es táblázat minden sorában és minden oszlopában az 1...9 számok mindegyike pontosan egyszer forduljon elő. A rejtvény készítője előre ki szokta tölteni a táblázat bizonyos celláit. A rejtvényfejtő feladata kitölteni a maradék cellákat a leírt szabályoknak megfelelően.
A bemenetet tartalmazó szövegfájlok első 9 sorának mindegyike 9 egész számot tartalmaz, a játék kiindulási állapotának megfelelően. A kitöltetlen mezők helyén a 0 szám olvasható. A következő néhány sorban a játékos egy-egy lehetséges kitöltési lépését rögzítették. Egy lépést három egész szám ír le: a számot, amelyet a játékos be akar írni, majd a sor és az oszlop számát, ahova írni szeretné. A bemeneti fájl egy-egy sorában a számokat egy-egy szóköz választja el egymástól. A táblázat ellentmondásmentes, tehát megoldható feladatot ír le. A játékos által megtett lépések száma legalább 1, legfeljebb 10, közöttük lehet hibás.
Például:
0 0 0 0 0 0 0 0 6
0 0 7 0 0 0 2 0 0
3 8 9 5 0 0 0 0 0
6 0 0 0 0 0 7 0 0
1 2 8 4 9 0 0 3 0
0 0 0 0 0 0 0 0 9
0 5 1 0 0 0 0 4 0
0 0 0 0 0 3 0 9 1
0 0 0 0 8 0 0 0 0

9 2 4
1 2 1
5 9 9
7 2 2

A fenti példában a nehez.txt bemeneti fájl tartalma látható. A 10. sorban szereplő számok azt jelentik, hogy a 9-es értéket kell a 2. sor 4. helyére beírni. Az adott sorban és az adott oszlopban nem szerepel még a 9-es, sőt, az érintett négyzetben sem, így a lépéssel nem alakul ki hiba, megtehető. A 11. sorbeli lépés is megtehető. A 13. sor hibás lépést tartalmaz, mert a 2. sorban már szerepel a 7-es szám.
A jobb oldalon látható képen a körbe írt számok megadják, hogy az egyes 3×3 méretű résztáblákat milyen számmal azonosítjuk.

Készítsen programot, amely a bemeneti állományok egyikét felhasználva (konnyu.txt, kozepes.txt, nehez.txt) az alábbi kérdésekre válaszol! A program forráskódját mentse sudoku néven! (A program megírásakor a felhasználó által megadott adatok helyességét, érvényességét nem kell ellenőriznie, feltételezheti, hogy a rendelkezésre álló adatok a leírtaknak megfelelnek.)
A képernyőre írást igénylő részfeladatok eredményének megjelenítése előtt írja a képernyőre a feladat sorszámát (például: 4. feladat)! Ha a felhasználótól kér be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár! Az ékezetmentes kiírás is elfogadott.
1. Olvassa be egy fájl nevét, egy sor és egy oszlop sorszámát (1 és 9 közötti számot)! A későbbi feladatokat ezen értékek felhasználásával kell megoldania!
2. Az előző feladatban beolvasott névnek megfelelő fájl tartalmát olvassa be, és tárolja el a táblázat adatait! Ha ezt nem tudja megtenni, akkor használja forrásként a rendelkezésre álló állományok egyikét!
3. Írja ki a képernyőre, hogy a beolvasott sor és oszlop értékének megfelelő hely…
a. milyen értéket tartalmaz! Ha az adott helyen a 0 olvasható, akkor az „Az adott helyet még nem töltötték ki.” szöveget jelenítse meg!
b. melyik résztáblázathoz tartozik!
4. Határozza meg a táblázat hány százaléka nincs még kitöltve! Az eredményt egy tizedesjegy pontossággal jelenítse meg a képernyőn!
5. Vizsgálja meg, hogy a fájlban szereplő lépések lehetségesek-e a beolvasott táblázaton! Tekintse mindegyiket úgy, mintha az lenne az egyetlen lépés az eredeti táblázaton, de ne hajtsa azt végre! Állapítsa meg, hogy okoz-e valamilyen ellentmondást a lépés végrehajtása!
Írja ki a lépéshez tartozó három értéket, majd a következő sorba írja az alábbi megállapítások egyikét! Ha több megállapítás is igaz, elegendő csak egyet megjelenítenie.
Minta a szöveges kimenetek kialakításához:
1. feladat
Adja meg a bemeneti fájl nevét! konnyu.txt
Adja meg egy sor számát! 1
Adja meg egy oszlop számát! 1

3. feladat
Az adott helyen szereplő szám: 5
A hely a(z) 1 résztáblázathoz tartozik.

4. feladat
Az üres helyek aránya: 17.3%

5. feladat
A kiválasztott sor: 2 oszlop: 4 a szám: 9
A helyet már kitöltötték.
A kiválasztott sor: 3 oszlop: 6 a szám: 7
A lépés megtehető.
A kiválasztott sor: 6 oszlop: 6 a szám: 3
A résztáblázatban már szerepel a szám.
A kiválasztott sor: 7 oszlop: 9 a szám: 8
Az adott oszlopban már szerepel a szám.

Forrás: konnyu.txt, kozepes.txt, nehez.txt,

print('1. feladat')
fnev = 'konnyu.txt'#input('1. feladat Adja meg a bemeneti fájl nevét! ')
besor = 1#int(input('Adja meg egy sor számát! '))
beoszlop = 1#int(input('Adja meg egy oszlop számát! '))

fajl = open(fnev)
forras = fajl.read().splitlines()
fajl.close()

print(' 3. feladat')
print('Az adott helyen szereplő szám:',forras[besor-1][(beoszlop-1)*2])
print('A hely a(z)',(beoszlop-1)//3+1+3*((besor-1)//3),'résztáblázathoz tartozik.')

nullak=0
for i1 in range(9):
for betu in forras[i1]:
if betu=='0':
nullak += 1
print(' 4. feladat Az üres helyek aránya:',str(round(100*nullak/81,1))+'%')

print(' 5. feladat')
adatok=[]
for i1 in range(9):
sor = forras[i1].split(' ')
adatok.append([betu for betu in sor])

lepesek=[]
for i1 in range(9,len(forras)):
sor = forras[i1].split(' ')
lepesek.append([int(szam) for szam in sor])
for lepes in lepesek:
sor = lepes[1]-1
oszlop = lepes[2]-1
szam = lepes[0]
print('A kiválasztott sor:',1+sor,'oszlop:',1+oszlop,'a szám:',szam)
#előállítjuk a sorát, oszlopát, résztábláját és a benne levést vizsgáljuk
sora = [adatok[sor]]
oszlopa = [adatok[i2][oszlop] for i2 in range(9)]
resztablaja = []
for i1 in range(3):
for i2 in range(3):
resztablaja.append(adatok[i1+3*(sor//3)][i2+3*(oszlop//3)])
if adatok[sor][oszlop] != '0':
print('A helyet már kitöltötték ')
elif str(szam) in sora:
print('Az adott sorban már szerepel a szám ')
elif str(szam) in oszlopa:
print('Az adott oszlopban már szerepel a szám ')
elif str(szam) in resztablaja:
print('A résztáblában már szerepel a szám ')
else:
print('A lépés megtehető ')

2021. május (Gödrök)  

Egy teljesen sík terepen a talaj olyan anyagból van, ami nem ereszti át a vizet. Ezen a területen egy egyenes mentén munkagépekkel 10 méter széles csatornát építenek. A munka még nem készült el, ezért a csatorna mélysége nem állandó, helyenként a felszín is érintetlen. A már elkészült résszel, mint különálló gödrök sorozatával foglalkozik a feladat. Az egyszerűbb kezelés érdekében a gödröket úgy tekintjük, hogy oldalfaluk függőleges, teljes szélességben azonos mélységű, így a keresztmetszeti kép jól leírja a terepviszonyokat.
A melyseg1.txt fájlban méterenként rögzítették, hogy azon a szakaszon milyen mélyen van a gödör alja. Minden sor egy-egy egész számot tartalmaz, amely a mélység értékét mutatja – szintén méterben. A fájl legfeljebb 2000 számot tartalmaz, értékük legfeljebb 30 lehet. Tudjuk, hogy az első és az utolsó méteren sértetlen a felszín, tehát ott biztosan a 0 szám áll.

Például:

A fenti példában látható keresztmetszeti képen a melyseg1.txt bemeneti fájl tartalmának a kezdete látható. Az egyszerűbb szemléltetés miatt a forrásfájlban külön sorokban szereplő értékeket itt az ábrán egymás mellett szerepeltetjük. Leolvasható, hogy az első méteren 0 a mélység. Az első gödör a 7. méteren kezdődik. Az első gödör 16 méter hosszan tart, legnagyobb mélysége 4 méter, térfogata 440 m3. A második gödör a 26. méternél kezdődik, 3 méter hosszan tart, térfogata 60 m3.
Készítsen programot, amely a melyseg1.txt állományt felhasználva az alábbi kérdésekre válaszol! A program forráskódját mentse godor néven! (A program megírásakor a felhasználó által megadott adatok helyességét, érvényességét nem kell ellenőriznie, feltételezheti, hogy a rendelkezésre álló adatok a leírtaknak megfelelnek.)
A képernyőre írást igénylő részfeladatok eredményének megjelenítése előtt írja a képernyőre a feladat sorszámát (például: 2. feladat)! Ha a felhasználótól kér be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár! Az ékezetmentes kiírás is elfogadott.

1. Olvassa be és tárolja el a melyseg1.txt fájl tartalmát! Írja ki a képernyőre, hogy az adatforrás hány adatot tartalmaz!
2. Olvasson be egy távolságértéket, majd írja a képernyőre, hogy milyen mélyen van a gödör alja azon a helyen! Ezt a távolságértéket használja majd a 6. feladat megoldása során is!
3. Határozza meg, hogy a felszín hány százaléka maradt érintetlen és jelenítse meg 2 tizedes pontossággal!
4. Írja ki a godrok.txt fájlba a gödrök leírását, azaz azokat a számsorokat, amelyek egy-egy gödör méterenkénti mélységét adják meg! Minden gödör leírása külön sorba kerüljön! Az állomány pontosan a gödrök számával egyező számú sort tartalmazzon!
A godrok.txt fájl első két sorának tartalma:
2 2 2 2 4 4 3 2 2 3 3 4 4 3 2 2
2 2 2
5. Határozza meg a gödrök számát és írja a képernyőre!
6. Ha a 2. feladatban beolvasott helyen nincs gödör, akkor „Az adott helyen nincs gödör.” üzenetet jelenítse meg, ha ott gödör található, akkor határozza meg, hogy
a) mi a gödör kezdő és végpontja! A meghatározott értékeket írja a képernyőre! (Ha nem tudja meghatározni, használja a további részfeladatoknál a 7 és 22 értéket, mint a kezdő és a végpont helyét)
b) a legmélyebb pontja felé mindkét irányból folyamatosan mélyül-e! Azaz a gödör az egyik szélétől monoton mélyül egy pontig, és onnantól monoton emelkedik a másik széléig. Az eredménytől függően írja ki a képernyőre a „Nem mélyül folyamatosan.” vagy a „Folyamatosan mélyül.” mondatot!
c) mekkora a legnagyobb mélysége! A meghatározott értéket írja a képernyőre!
d) mekkora a térfogata, ha szélessége minden helyen 10 méternyi! A meghatározott értéket írja a képernyőre!
e) a félkész csatorna esőben jelentős mennyiségű vizet fogad be. Egy gödör annyi vizet képes befogadni anélkül, hogy egy nagyobb szélvihar hatására se öntsön ki, amennyi esetén a víz felszíne legalább 1 méter mélyen van a külső felszínhez képest. Írja a képernyőre ezt a vízmennyiséget!

Minta a szöveges kimenetek kialakításához:
1. feladat
A fájl adatainak száma: 694

2. feladat
Adjon meg egy távolságértéket! 9
Ezen a helyen a felszín 2 méter mélyen van.

3. feladat
Az érintetlen terület aránya 10.09%.

5. feladat
A gödrök száma: 22

6. feladat
a)
A gödör kezdete: 7 méter, a gödör vége: 22 méter.
b)
Nem mélyül folyamatosan.
c)
A legnagyobb mélysége 4 méter.
d)
A térfogata 440 m^3.
e)
A vízmennyiség 280 m^3.

Forrás: melyseg1.txt

print('1. feladat')
fajl = open('melyseg1.txt')
forras = fajl.read().splitlines()
fajl.close()
adatok = [int(sor) for sor in forras]
print('A fájl adatainak száma:',len(adatok))

print(' 2. feladat')
tav = int(input('Adjon meg egy távolságértéket: '))
print('Ezen a helyen a felszín',adatok[tav-1],'méter mélyen van')

print(' 3. feladat')
erintetlen = [1 for adat in adatok if adat==0]
print('Az érintetlen terület aránya',str(round(sum(erintetlen)/len(adatok)*100,2))+'%.')

# 4. feladat
godrok = [] # gödör kezdetének indexe, gödör végének indexe
i = 0
kezdete , vege = 0, 0
while i<len(adatok)-1:
if adatok[i-1] == 0 and adatok[i] != 0:
kezdete = i
if adatok[i] != 0 and adatok[i+1] == 0:
vege = i
if kezdete != 0 and vege != 0:
godrok.append([kezdete,vege])
kezdete , vege = 0, 0
i += 1
#print(godrok)
fajl = open('godrok-vg.txt','w')
for godor in godrok:
lista = [str(adatok[i1]) for i1 in range(godor[0],godor[1]+1)]
print(' '.join(lista),file=fajl)
fajl.close()

print(' 5. feladat')
print('A gödrök száma:',len(godrok))

print(' 6. feladat')
godor_index = -1 # ha ez negatív marad, akkor nem gödörben van
for godor in godrok:
if tav-1 in range(godor[0],godor[1]+1):
godor_index = godrok.index(godor)
if godor_index < 0:
print('Az adott helyen nincs gödör.')
else:
print('a) A gödör kezdete:',godrok[godor_index][0]+1,'méter, a gödör vége:',godrok[godor_index][1]+1,'méter.')
melysegek = [adatok[i1] for i1 in range(godrok[godor_index][0],godrok[godor_index][1]+1)] # a gödör mélységeinek listája
legmelyebb, legmelyebb_index = 0, 0
for i1 in range(len(melysegek)):
if melysegek[i1] > legmelyebb:
legmelyebb = melysegek[i1]
legmelyebb_index = i1
#print(melysegek,legmelyebb,legmelyebb_index)
monoton = True
for i1 in range(legmelyebb_index): # csökkenés vizsgálata az elejétől a legmélyebb pontig
if melysegek[i1+1]
monoton = False
#print(i1,monoton,melysegek[i1],melysegek[i1+1])
#print()
for i1 in range(legmelyebb_index,len(melysegek)-1): # növekedés vizsgálata a legmélyebb ponttól
if melysegek[i1+1]>melysegek[i1]: # ha valamelyik nagyobb, mint az előző, akkor nem monoton
monoton = False
#print(i1,monoton,melysegek[i1],melysegek[i1+1])
print('b)\nFolyamatosan mélyül.' if monoton else 'b) Nem mélyül folyamatosan.')
print('c)\nA legnagyobb mélysége',legmelyebb,'méter.')
print('d)\nA térfogata',10*sum(melysegek),'m^3.')
print('e)\nA vízmennyiség',10*(sum(melysegek)-len(melysegek)),'m^3.')
#minden értékből 1-et le kell vonni, összesen ahány méter

2021. május magyar, mint idegennyelv (Bányató)  

A bányató egy elhagyott külszíni bánya, amely egy idő után megtelik vízzel. Ebben a feladatban egy bányató mélységét kell elemeznie.
A tó felszínét sakktáblaszerűen 1 m oldalhosszúságú négyzetekre bontották, és minden ilyen négyzetben megmérték a tó mélységét. A mérést deciméter pontossággal végezték.
A szárazföldet a 0 érték jelzi. A mérési adatokat egy téglalap alakú táblázatban rögzítették, például:
Az ábrán az első oszlop, illetve az első sor a mérési adatok koordinátáját adja meg, például 12. sor 6. oszlopában lévő mérési eredmény 33 dm. (A tó medrét szürke háttér jelzi.)
Rendelkezésére áll a melyseg2.txt nevű adatfájl, amelynek első két sorában az adatokat tartalmazó táblázat sorainak majd oszlopainak száma található. A fájlban ezt a mérési adatok követik soronként, az adatokat szóköz választja el egymástól. A fájlban a sorok és oszlopok azonosítói nem szerepelnek. Például egy 42 sorból és 25 oszlopból álló táblázat esetén az első 4 sor adatai a fájlban:
42
25
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 3 0 0 0 0 0 8 10 10 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 19 10 0 11 16 18 10 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 9 17 35 5 11 11 22 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Készítsen programot, amely az állomány adatait felhasználva az alábbi kérdésekre válaszol! A program forráskódját mentse banyato néven! A megoldás során felhasználhatja, hogy a fájl legfeljebb 99 sort és legfeljebb 99 oszlopot tartalmaz. A program megírásakor a felhasználó által megadott adatok helyességét, érvényességét nem kell ellenőriznie, és feltételezheti, hogy a rendelkezésre álló adatok a leírtaknak megfelelnek.
A képernyőre írást igénylő részfeladatok esetén – a mintához tartalmában hasonlóan – írja ki a képernyőre a feladat sorszámát (például: 3. feladat), és utaljon a kiírt tartalomra is! Ha a felhasználótól kér be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár! Mindkét esetben az ékezetmentes kiírás is elfogadott.

1. Olvassa be és tárolja el a melyseg2.txt állomány adatait, és annak felhasználásával oldja meg a következő feladatokat!
2. Kérje be egy mérési eredmény sor- és oszlopazonosítóját, majd írassa ki az adott helyen mért adatot a képernyőre! (A sorok és oszlopok számozása kezdődjön 1-gyel!)
3. Határozza meg a tó (vagyis az ábrán szürkével jelölt rész) felszínének területét, valamint a tó átlagos mélységét! Írassa ki a két eredményt a mintának megfelelően a képernyőre! A tó átlagos mélysége méterben kifejezve, két tizedesjegy pontossággal jelenjen meg!
4. Mekkora a tó legnagyobb mélysége, és hol a legmélyebb a tó? Jelenítse meg a választ a képernyőn! A legmélyebb pont koordinátáit a mintának megfelelően (sor; oszlop) formában írassa ki! Ha több ilyen mérési eredmény is van, mindegyik koordinátapárja jelenjen meg!
5. Milyen hosszú a tó partvonala, vagyis az ábrán a szürkével jelölt részt határoló vastag fekete vonal hossza? A partvonalhoz vegye hozzá a tóban lévő szigetek kerületét is! Írassa ki az eredményt a mintának megfelelően a képernyőre! (A megoldás során felhasználhatja, hogy a táblázat első és utolsó sorában és oszlopában minden adat 0.)
6. Kérje be a felhasználótól egy oszlop azonosítóját, és szemléltesse a diagram.txt szöveges állományban „sávdiagramon” a tó mélységét az adott oszlopban a következő módon! A sor elején jelenjen meg a mérési adat sorának azonosítója pontosan két számjeggyel, majd tegyen egymás mellé annyi csillagot (*), ahány méter az adott helyen a tó mélysége! A mérési adatokat a matematika szabályainak megfelelően kerekítse!

Példa a szöveges kimenetek kialakításához (a tizedesjel az alkalmazott fejlesztői környezettől függően eltérhet):
2. feladat
A mérés sorának azonosítója=12
A mérés oszlopának azonosítója=6
A mért mélység az adott helyen 33 dm

3. feladat
A tó felszíne: 646 m2, átlagos mélysége: 4,28 m

4. feladat
A tó legnagyobb mélysége: 98 dm
A legmélyebb helyek sor-oszlop koordinátái:
(14; 20) (26; 11) (32; 16)

5. feladat
A tó partvonala 270 m hosszú

6. feladat
A vizsgált szelvény oszlopának azonosítója=6

Példa a diagram.txt szöveges állomány tartalmára:
01
02
03**
04****
05******
06******
07***
08*****

Forrás: melyseg2.txt

with open('melyseg2.txt') as fajl:
forras = fajl.read().splitlines()
sorok = int(forras[0])
oszlopok = int(forras[1])
adatok1 = [forras[i].split(' ') for i in range(2,len(forras))]
adatok = []
for adat in adatok1:
a = [int(i) for i in adat]
adatok.append(a)
#print(adatok)

sor = int(input('2. feladat A mérés sorának azonosítója= '))-1
oszlop = int(input('A mérés oszlopának azonosítója= '))-1
print('A mért mélység az adott helyen',adatok[sor][oszlop],'dm')

osszeg = 0
darab = 0
for adat in adatok:
a = [i for i in adat if i != 0]
darab += len(a)
osszeg += sum(a)
print('3. feladat A tó felszíne:',darab,'m2, átlagos mélysége:',round(osszeg/darab/10,2),'m')

maximumok = []
for adat in adatok:
maximumok.append(max([i for i in adat]))
max_mely = max(maximumok)
print('4. feladat A tó legnagyobb mélysége:',max_mely,'dm')
kiir = ''
for i in range(sorok):
for j in range(oszlopok):
if adatok[i][j]==max_mely:
kiir += '('+str(i+1)+'; '+str(j+1)+') '
print('A legmélyebb helyek sor-oszlop koordinátái: ',kiir)

part = 0
for i in range(1,sorok-1):
for j in range(1,oszlopok-1):
if adatok[i][j] != 0:
if adatok[i-1][j] == 0:
part += 1
if adatok[i+1][j] == 0:
part += 1
if adatok[i][j-1] == 0:
part += 1
if adatok[i][j+1] == 0:
part += 1
print('5. feladat A tó partvonala',part,'m hosszú')

szelveny = int(input('6. feladat A vizsgált szelvény oszlopának azonosítója= '))
melyseg = [round(adat[szelveny-1]/10) for adat in adatok]
fajl = open('diagram.txt','w')
for i in range(len(melyseg)):
if i+1<10:
kiir = '0'+str(i+1)
else:
kiir = str(i+1)
kiir += melyseg[i]*'*'
print(kiir,file=fajl)
fajl.close()

2020. október (Sorozatok)  

Sok olyan sorozatrajongó van, aki folyamatosan követi a kedvelt sorozatait. Egy, az angol nyelvű sorozatokért rajongó személy feljegyzést készített egy nyolc hónapos időszak kedvenc sorozatairól.
A lista.txt fájl a rajongó által kedvelt sorozatok adásba kerülésének dátumát, a sorozat angol címét, az évadot és az epizód számát, az epizód hosszát percben és egy jelzést tartalmaz, hogy a lista készítője megnézte-e már azt az epizódot. Ezek az adatok egymás után külön sorokban szerepelnek. A fájlban biztosan 400-nál kevesebb epizódról van adat, epizódonként 5 sorban.
Például:

2018.01.19
Puzzles
3x10
43
0
NI
Puzzles
3x11
43
0

A példában látható, hogy a Puzzles című sorozat 3. évadának 10. epizódja 2018. 01. 19-én került adásba. Az epizód 43 perces, és még nem nézte meg a lista készítője.
Készítsen programot a lista.txt állomány adatainak feldolgozására! A program forráskódját mentse sorozatok néven! (A program megírásakor a felhasználó által megadott adatok helyességét, érvényességét nem kell ellenőriznie, feltételezheti, hogy a rendelkezésre álló adatok a leírtaknak megfelelnek.)
A képernyőre írást igénylő részfeladatok eredményének megjelenítése előtt írja a képernyőre a feladat sorszámát (például 2. feladat:)! Ha a felhasználótól kér be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár! Az ékezetmentes kiírás is elfogadott.

1. Olvassa be és tárolja el a lista.txt fájl tartalmát!
2. Írassa ki a képernyőre, hogy hány olyan epizód adatait tartalmazza a fájl, amelynek ismert az adásba kerülési dátuma!
3. Határozza meg, hogy a fájlban lévő epizódok hány százalékát látta már a listát rögzítő személy! A százalékértéket a minta szerint, két tizedesjeggyel jelenítse meg a képernyőn!
4. Számítsa ki, hogy összesen mennyi időt töltött a személy az epizódok megnézésével! Az eredményt a minta szerint nap, óra, perc formában adja meg!
5. Kérjen be a felhasználótól egy dátumot „éééé.hh.nn” formában! Határozza meg, hogy az adott dátumig megjelent epizódokból melyeket nem látta még! Az aznapi epizódokat is számolja bele! A feltételnek megfelelő epizódok esetén írja a képernyőre tabulátorral elválasztva az évad- és az epizódszámot, valamint a sorozat címét a minta szerint!
6. Készítse el az alábbi algoritmus alapján a hét napját meghatározó függvényt! A függvény neve Hetnapja legyen! A függvény az év, hónap és nap megadása után szöveges eredményként visszaadja, hogy az adott nap a hét melyik napja volt. (Az a és b egész számok maradékos osztása esetén az a div b kifejezés adja meg a hányadost, az a mod b pedig a maradékot, például 17 div 7 = 2 és 17 mod 7 = 3.)
Függvény hetnapja(ev, ho, nap : Egész) : Szöveg
napok: Tömb(0..6: Szöveg)= (″v″, ″h″, ″k″, ″sze″,″cs″, ″p″, ″szo″)
honapok: Tömb(0..11: Egész)= (0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4)
Ha ho < 3 akkor ev := ev -1
hetnapja := napok[(ev + ev div 4 – ev div 100 + ev div 400 + honapok[ho-1] + nap) mod 7]
Függvény vége
7. Kérjen be a felhasználótól egy napot az előző feladatban látható rövidített alakban! A napokat egy (h, k, p, v), kettő (cs), vagy három (sze, szo) karakterrel adja meg! Határozza meg, hogy a fájlban lévő sorozatok közül melyike(ke)t vetítik az adott napon! A sorozatok nevét a minta szerint jelenítse meg a képernyőn! Ha az adott napon egy sorozatot sem adtak adásba, akkor „Az adott napon nem kerül adásba sorozat.” üzenetet jelenítse meg!
8. Határozza meg sorozatonként az epizódok összesített vetítési idejét és az epizódok számát! A számításnál vegye figyelembe a vetítési dátummal nem rendelkező epizódokat is!
A megoldás során felhasználhatja, hogy egy sorozat epizódjainak adatai egymást követik a forrásállományban. A listát írja ki a summa.txt fájlba! A fájl egy sorában a sorozat címe, az adott sorozatra vonatkozó összesített vetítési idő percben és az epizódok száma szerepeljen szóközzel elválasztva!

Minta a szöveges kimenetek kialakításához:
2. feladat
A listában 202 db vetítési dátummal rendelkező epizód van.

3. feladat
A listában lévő epizódok 45,66%-át látta.

4. feladat
Sorozatnézéssel 2 napot 15 órát és 32 percet töltött.

5. feladat
Adjon meg egy dátumot! Dátum= 2017.10.18
7x01 The Fable
7x02 The Fable
15x04 Military Police
5x03 Spy School
5x04 Spy School
4x04 The Elite Minds

7. feladat
Adja meg a hét egy napját (például cs)! Nap= cs
The Hospital
Spectacular Power
Upper Story
Chicago Flame
Shrinktime

Minta a summa.txt fájl kialakításához:
Games 420 7
The Fable 588 14
The IT Guy 450 10

Forrás: lista.txt

# 1. feladat
with open('lista.txt') as forrasfajl:
sorok = forrasfajl.read().splitlines()
adatok = [sorok[i:i+5] for i in range(0,len(sorok),5)]
# adatok[dátum, cím, évad x epizód, hossz, megnézte-e]

#2. feladat
print('2. feladat A listában',len([adat[0] for adat in adatok if adat[0]!='NI']),'db vetítési dátummal rendelkező epizód van.')

#3. feladat
latta = int(len([adat[0] for adat in adatok if adat[4]=='1'])/len(adatok)*10000)
print(' 3. feladat A listában lévő epizódok {},{}%-át látta.'.format(latta//100,latta%100))

#4. feladat
percek = sum([int(adat[3]) for adat in adatok if adat[4]=='1'])
print(' 4. feladat Sorozatnézéssel {} napot, {} órát és {} percet töltött.'.format(percek//1440,percek%1440//60,percek%1440%60))

#5. feladat
datum = input(' 5. feladat Adjon meg egy dátumot! Dátum= ').split('.')
datum = datum[0]*365+datum[1]*31+datum[2]
nemlatta = []
for adat in adatok:
if adat[0] != 'NI':
aktdatum = adat[0].split('.')
aktdatum = aktdatum[0]*365+aktdatum[1]*31+aktdatum[2]
if adat[4]=='0' and datum>=aktdatum:
print(adat[2],' ',adat[1])

# 6. feladat
def hetnapja(ev,ho,nap):
napok = ['v','h','k','sze','cs','p','szo']
honapok = [0,3,2,5,0,3,5,1,4,6,2,4]
if ho<3:
ev -= 1
return napok[(ev + ev // 4 - ev // 100 + ev // 400 + honapok[ho-1] + nap) % 7]

# 7. feladat
print(' 7. feladat')
nap = input('Adja meg a hét egy napját (például cs)! Nap= ')
filmek = {adat[1] for adat in adatok if adat[0]!= 'NI' and hetnapja(int(adat[0].split('.')[0]),int(adat[0].split('.')[1]),int(adat[0].split('.')[2])) == nap}
print(' '.join(filmek) if filmek else 'Az adott napon nem kerül adásba sorozat.')

# 8. feladat
fajl = open('summa.txt','w')
cimek = {adat[1] for adat in adatok}
for cim in cimek:
print(' '.join([cim,str(sum([int(adat[3]) for adat in adatok if adat[1]==cim])),str(len([adat[3] for adat in adatok if adat[1]==cim]))]),file=fajl)
fajl.close()

2020. május (Meteorológiai jelentés)  

Az ország területén néhány városból rendszeres időközönként időjárás táviratokat küldenek. A távirat egy rövid szöveges üzenet, amely a főbb időjárási információkat tartalmazza. Rendelkezésünkre áll az ország területéről egy adott nap összes távirata.
A tavirathu13.txt szövegállomány egy adott hónap 13. napjának időjárás adatait tartalmazza. Egy távirat adatai egy sorban találhatóak egymástól szóközzel elválasztva. Egy sorban 4 adat szerepel a következőképpen.
településszöveg (2 karakter)A település kétbetűs kódja
időszöveg (óópp formátumban)A mérés időpontja
szélirány és -erősségszöveg (5 karakter) szélirány 3 karakter, -erősség 2 karakterA szél iránya fokban vagy szöveggelés sebessége csomóban megadva
hőmérsékletegész szám (2 karakter)Mért hőmérséklet (nem negatív)
A sorok száma legfeljebb 500. Az adatok idő szerint rendezettek.
Például:
BP 0300 32007 21
PA 0315 35010 19
PR 0315 32009 19
SM 0315 01015 20
DC 0315 VRB01 21
SN 0315 00000 21
A példában látható, hogy 03:15-kor PR településen 320 fokos irányból 9 csomós szél fújt. A hőmérséklet 19 °C volt. Ugyanekkor DC településen változó (VRB) szélirány volt 1 csomós szélsebességgel, a hőmérséklet 21 °C volt.

Készítsen programot, amely a tavirathu13.txt állomány adatait felhasználva az alábbi kérdésekre válaszol! A program forráskódját mentse metjelentes néven! (A program megírásakor a felhasználó által megadott adatok helyességét, érvényességét nem kell ellenőriznie, feltételezheti, hogy a rendelkezésre álló adatok a leírtaknak megfelelnek.)
A képernyőre írást igénylő részfeladatok eredményének megjelenítése előtt írja a képernyőre a feladat sorszámát (például: 3. feladat)! Ha a felhasználótól kér be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár! Az ékezetmentes kiírás is elfogadott. Az eredmény megjelenítését és a felhasználóval való kommunikációt a feladatot követő minta alapján valósítsa meg!

1. Olvassa be és tárolja el a tavirathu13.txt állomány adatait!
2. Kérje be a felhasználótól egy város kódját! Adja meg, hogy az adott városból mikor érkezett az utolsó mérési adat! A kiírásban az időpontot óó:pp formátumban jelenítse meg!
3. Határozza meg, hogy a nap során mikor mérték a legalacsonyabb és a legmagasabb hőmérsékletet! Jelenítse meg a méréshez kapcsolódó település nevét, az időpontot és a hőmérsékletet! Amennyiben több legnagyobb vagy legkisebb érték van, akkor elég az egyiket kiírnia.
4. Határozza meg, azokat a településeket és időpontokat, ahol és amikor a mérések idején szélcsend volt! (A szélcsendet a táviratban 00000 kóddal jelölik.) Ha nem volt ilyen, akkor a „Nem volt szélcsend a mérések idején.” szöveget írja ki! A kiírásnál a település kódját és az időpontot jelenítse meg.
5. Határozza meg a települések napi középhőmérsékleti adatát és a hőmérséklet-ingadozását! A kiírásnál a település kódja szerepeljen a sor elején a minta szerint! A kiírásnál csak a megoldott feladatrészre vonatkozó szöveget és értékeket írja ki!
  1. A középhőmérséklet azon hőmérsékleti adatok átlaga, amikor a méréshez tartozó óra értéke 1., 7., 13., 19. Ha egy településen a felsorolt órák valamelyikén nem volt mérés, akkor a kiírásnál az „NA” szót jelenítse meg! Az adott órákhoz tartozó összes adat átlagaként határozza meg a középhőmérsékletet, azaz minden értéket azonos súllyal vegyen figyelembe! A középhőmérsékletet egészre kerekítve jelenítse meg!
  2. A hőmérséklet-ingadozás számításhoz az adott településen a napi legmagasabb és legalacsonyabb hőmérséklet különbségét kell kiszámítania! (Feltételezheti, hogy minden település esetén volt legalább két mérési adat.)
6. Hozzon létre településenként egy szöveges állományt, amely első sorában a település kódját tartalmazza! A további sorokban a mérési időpontok és a hozzá tartozó szélerősségek jelenjenek meg! A szélerősséget a minta szerint a számértéknek megfelelő számú kettőskereszttel (#) adja meg! A fájlban az időpontokat és a szélerősséget megjelenítő kettőskereszteket szóközzel válassza el egymástól! A fájl neve X.txt legyen, ahol az X helyére a település kódja kerüljön!

Minta a szöveges kimenetek kialakításához:
2. feladat
Adja meg egy település kódját! Település: SM
Az utolsó mérési adat a megadott településről 23:45-kor érkezett.

3. feladat
A legalacsonyabb hőmérséklet: SM 23:45 16 fok.
A legmagasabb hőmérséklet: DC 13:15 35 fok.

4. feladat
BP 01:00
DC 02:15
SN 03:15
BC 04:45
DC 04:45
SN 05:15
SN 05:45
KE 08:45
BC 11:45

5. feladat
BP Középhőmérséklet: 23; Hőmérséklet-ingadozás: 8
DC Középhőmérséklet: 29; Hőmérséklet-ingadozás: 15
SM Középhőmérséklet: 22; Hőmérséklet-ingadozás: 8
PA Középhőmérséklet: 21; Hőmérséklet-ingadozás: 7
SN Középhőmérséklet: 26; Hőmérséklet-ingadozás: 13
PR Középhőmérséklet: 21; Hőmérséklet-ingadozás: 8
BC NA; Hőmérséklet-ingadozás: 14
PP NA; Hőmérséklet-ingadozás: 6
KE NA; Hőmérséklet-ingadozás: 13

6. feladat
A fájlok elkészültek.

A BC.txt fájl tartalma:
BC
00:45 ###
01:45 ####
02:45 ######
03:45 ##
04:45
05:45 ####
11:45
17:45 ########

Forrás: tavirathu13.txt

fajl = open('tavirathu13.txt')
forras = fajl.read().splitlines()
fajl.close()
adatok = [sor.split() for sor in forras] #0: település; 1:óópp óra, perc; 2:iiiee - irány, erősség; 3:hőmérséklet

#2. feladat
print('2. feladat')
telepules = 'SM'#input('Adja meg egy település kódját! Település: ')
maxadat = max([60*int(adat[1][:2])+int(adat[1][2:4]) for adat in adatok if adat[0]==telepules]) #perccé konvertáljuk az időket
print(f'Az utolsó mérési adat a megadott településről {maxadat//60}:{maxadat%60}-kor érkezett.')

#3. feladat
print(' 3. feladat')
maxhom = max([int(adat[3]) for adat in adatok])
maxadat = [adat for adat in adatok if int(adat[3])==maxhom][0]
minhom = min([int(adat[3]) for adat in adatok])
minadat = [adat for adat in adatok if int(adat[3])==minhom][0]
print(f'A legalacsonyabb hőmérséklet: {minadat[0]} {minadat[1][:2]}:{minadat[1][2:4]} {minadat[3]} fok.')
print(f'A legmagasabb hőmérséklet: {maxadat[0]} {maxadat[1][:2]}:{maxadat[1][2:4]} {maxadat[3]} fok.')

#4. feladat
print(' 4. feladat')
szelcsend = [adat[0]+' '+adat[1][:2]+':'+adat[1][2:4] for adat in adatok if adat[2]=='00000']
print(' '.join(szelcsend) if szelcsend else 'Nem volt szélcsend a mérések idején.')

#5. feladat
print(' 5. feladat')
telepulesek = set([adat[0] for adat in adatok])
for t in telepulesek:
hom = [[adat[1][:2],int(adat[3])] for adat in adatok if (adat[1][:2] in ['01','07','13','19']) and adat[0]==t] #a település és a megfelelő hőmérséklet adatok
homersekletek = [int(h[1]) for h in hom] #csak a hőmérsékletek
if len(set([h[0] for h in hom]))<4:
kozep = 'NA'
else:
kozep = 'Középhőmérséklet: '+str(round(sum(homersekletek)/len(homersekletek)))
napi = [int(adat[3]) for adat in adatok if adat[0]==t] #az összes napi hőmérséklet
ing = max(napi)-min(napi)
print(t,kozep+';','Hőmérséklet-ingadozás:',ing)

#6. feladat
print(' 6. feladat A fájlok elkészültek.')
for t in telepulesek:
fajl = open(t+'.txt',mode='w')
meresek = [[adat[1][:2]+':'+adat[1][2:4],int(adat[2][3:])] for adat in adatok if adat[0]==t]
print(t,file=fajl)
for m in meresek:
print(m[0],m[1]*'#',file=fajl)
fajl.close()

2020. május magyar, mint idegennyelv (Menetrend)  

Az ország keleti felében évekkel ezelőtt bevezették az ütemes menetrendet. Ez azt jelenti, hogy a végállomásról minden órában ugyanakkor indulnak a vonatok és menetrend szerint minden állomásra ugyanakkor érkeznek. A jól tervezhető utazás miatt nőtt az utazók száma.
A vonat.txt fájlban rögzítették a Szeged-Budapest vonal néhány vonatának indulási és érkezési adatait. A fájl soraiban öt, tabulátorral elválasztott érték található, négy egész szám és egy karakter. Az első szám a vonatazonosító, a második az állomásazonosító, a harmadik és negyedik egy időpont órája és perce. A karakter pedig azt jelzi, hogy a vonat az adott állomásra érkezik (E) vagy éppen indul (I) a megadott időben.
A sorok száma legfeljebb 1000, a vonatok és az állomások azonosítója pedig egy 0 és 20 közötti egész szám. Az óra értéke 0 és 23, a perc 0 és 59 közötti érték. Az állomások 0-tól távolság, a vonatok 1-től indulási idő szerint növekvően sorszámozottak, minden értéket felvesznek.
A fájl a vonatok tényleges útját rögzíti. Az adatok időrendben szerepelnek, azon belül pedig – az induló állomás kivételével – az érkezés mindig megelőzi az indulást. Tudjuk, hogy minden vonat a 0. állomásról indul, és eléri a végállomást, közben minden állomáson megáll, és egyik vonat sem előzi meg a másikat.
Például:

2 0 6 45 I
1 4 6 49 E
1 4 6 50 I
2 1 6 58 E
1 5 7 0 E

Az első sorból leolvasható, hogy a 2. vonat a kiinduló állomásról 6 óra 45 perckor indul. A következő sorban pedig az szerepel, hogy az 1. vonat 6 óra 49 perckor érkezik a 4. állomásra.

Készítsen programot, amely a vonat.txt állomány adatait felhasználva az alábbi kérdésekre válaszol! A program forráskódját mentse menetrend néven! (A program megírásakor a felhasználó által megadott adatok helyességét, érvényességét nem kell ellenőriznie, feltételezheti, hogy a rendelkezésre álló adatok a leírtaknak megfelelnek.)
A képernyőre írást igénylő részfeladatok eredményének megjelenítése előtt írja a képernyőre a feladat sorszámát (például: 5. feladat)! Ha a felhasználótól kér be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár! Az ékezetmentes kiírás is elfogadott.

1. Olvassa be és tárolja el a vonat.txt fájl tartalmát!
2. Írja a képernyőre a fájlban tárolt vonatok és állomások darabszámát – a kezdő és végállomást is beleértve!
3. Határozza meg, hogy melyik állomáson állt legtöbbet vonat! Adja meg a vonat és az állomás azonosítóját, valamint az állás idejét! Ha több ilyen volt, elég csak az egyiket megadnia.
4. Olvassa be egy vonat azonosítóját, valamint egy időpont óra és perc értékét! A későbbi feladatokban használja ezeket!
5. Ezen a vonalon az előírt menetidő 2 óra 22 perc. Írja a képernyőre, hogy a beolvasott azonosítójú vonat hány perccel tért el ettől! Például: „A(z) 5. vonat útja 2 perccel rövidebb volt az előírtnál.”, „A(z) 5. vonat útja pontosan az előírt ideig tartott.” vagy „A(z) 5. vonat útja 3 perccel hosszabb volt az előírtnál.”
6. Írja a haladX.txt fájlba, hogy a beolvasott azonosítójú vonat melyik állomásra mikor érkezett! A fájlnévben az X helyére a beolvasott vonatazonosító kerüljön!
7. Adja meg, hogy a beolvasott időpontban úton lévő, azaz a már elindult, de a végállomást még el nem érő vonatok közül melyik hol tartott! A tesztelés során a következő időpontokra érdemes figyelni: 6:50, 8:45, 9:05, 10:04, 10:20.

Minta a szöveges kimenetek kialakításához:
2. feladat
Az állomások száma: 11
A vonatok száma: 12

3. feladat
A(z) 5. vonat a(z) 6. állomáson 10 percet állt.

4. feladat
Adja meg egy vonat azonosítóját! 2
Adjon meg egy időpontot (óra perc)! 7 16

5. feladat
A(z) 2. vonat útja 2 perccel hosszabb volt az előírtnál.

7. feladat
A(z) 1. vonat a 6. állomáson állt.
A(z) 2. vonat a 2. és a 3. állomás között járt.

A halad2.txt fájl tartalma:
1. állomás: 6:58
2. állomás: 7:11
3. állomás: 7:31
4. állomás: 7:48
5. állomás: 7:59
6. állomás: 8:11
7. állomás: 8:45
8. állomás: 8:51
9. állomás: 9:0
10. állomás: 9:9

Forrás: vonat.txt

# 1. feladat
with open('vonat.txt') as fajl:
sorok = fajl.read().splitlines()
adatok = [sorok[i].split(' ') for i in range(len(sorok))]
# adatok[vonatazonosító, állomásazonosító, óra, perc, 'E' vagy 'I']

# 2. feladat
vonatok = {adat[0] for adat in adatok}
allomasok = {adat[1] for adat in adatok}
print('2. feladat Az állomások száma:',len(allomasok),' A vonatok száma:',len(vonatok))

# 3. feladat
# idopontok[vonat,állomás,indulás/érkezés ideje]
max_ido = 0
for vonat in vonatok:
idopontok = [[adat[1],int(adat[2])*60+int(adat[3])] for adat in adatok if adat[0]==vonat]
for index1 in range(2,len(idopontok)-1,2):
varakozas = idopontok[index1][1]-idopontok[index1-1][1]
if varakozas > max_ido:
max_ido = varakozas
max_allomas = idopontok[index1][0]
max_vonat = vonat
print(' 3. feladat A(z) '+max_vonat+'. vonat a(z) '+max_allomas+'. állomáson '+str(max_ido)+' percet állt.')

# 4. feladat
vonat = input(' 4. feladat Adja meg egy vonat azonosítóját! ')
ido_beker = input('Adjon meg egy időpontot (óra perc)! ').split(' ') # idopont['óra','perc']

# 5. feladat
kiir = ' 5. feladat A(z) '+vonat+'. vonat útja '
idopontok = [int(adat[2])*60+int(adat[3]) for adat in adatok if adat[0]==vonat]
hossz = idopontok[-1]-idopontok[0] - (2*60+22)
if hossz == 0:
kiir += 'pontosan az előírt ideig tartott.'
else:
kiir += str(-1*hossz)+' perccel rövidebb volt az előírtnál.' if hossz<0 else str(hossz)+' perccel hosszabb volt az előírtnál.'
print(kiir)

# 6. feladat
fajl = open('halad'+vonat+'.txt','w')
print(' '.join([adat[1]+'. állomás: '+adat[2]+':'+adat[3] for adat in adatok if adat[0]==vonat and adat[4]=='E']),file=fajl)
fajl.close()

# 7. feladat
print(' 7. feladat')
akt_ido = int(ido_beker[0])*60+int(ido_beker[1])
for vonat in vonatok:
idopontok = [[adat[1],int(adat[2])*60+int(adat[3])] for adat in adatok if adat[0]==vonat]
if idopontok[0][1] <= akt_ido < idopontok[-1][1]: # ez a vonat úton van
index1 = 0
while idopontok[index1][1] <= akt_ido: # lépkedünk az időkkel, amíg az aktuális időhöz nem érünk
index1 += 1
if idopontok[index1-1][0]=='0':
print('A(z) '+vonat+'. vonat épp akkor indult útjára.')
elif idopontok[index1-1][0] == idopontok[index1][0]:
print('A(z) '+vonat+'. vonat a(z) '+idopontok[index1-1][0]+ '. állomáson állt.')
else:
print('A(z) '+vonat+'. vonat a(z) '+idopontok[index1-1][0]+'. és a(z) '+idopontok[index1][0]+'. állomások között haladt.')

2019. október (eUtazás)  

Egyre több országban fordul elő, hogy a közlekedési eszközökön használatos bérleteket és jegyeket valamilyen elektronikus eszközön (például: chipes kártya) tárolják. Egy nagyváros ilyen rendszert szeretne bevezetni a helyi közlekedésben, amelyet néhány buszjáraton tesztelnek. Ezekre a buszokra csak az első ajtónál lehet felszállni, ahol egy ellenőrző eszközhöz kell érinteni a kártyát, amelynek chipje tartalmazza a jegy vagy bérlet információkat.
A busz ellenőrző eszköze statisztikai és fejlesztési célból rögzíti a felszállók kártyájának adatait. Az utasadat.txt szóközökkel tagolt állomány egy, a tesztelésben részt vevő busz végállomástól-végállomásig tartó útjának adatait tartalmazza.
Az utasadat.txt állomány legfeljebb 2000 sort tartalmaz és minden sorában 5 adat szerepel. Ezek:
Például:
0 20190326-0700 6572582 RVS 20210101
0 20190326-0700 8808290 JGY 7
0 20190326-0700 1680423 TAB 20190420
12 20190326-0716 3134404 FEB 20190301
12 20190326-0716 9529716 JGY 0
A fenti példában szereplő adatoknál látható, hogy az induló állomáson (0. állomás) 2019. 03. 26-án 7:00-kor a 1680423 kártyaazonosítójú utas tanulóbérlettel szállt fel, amely 2019. 04. 20-ig érvényes. A 12. állomáson 2019. 03. 26-án 7:16-kor a 9529716 kártyaazonosítójú utas jeggyel szállt volna fel, de már elhasználta az összes jegyét (0).

Készítsen programot, amely az utasadat.txt állomány felhasználásával a következő kérdésekre válaszol! A program forráskódját eutazas néven mentse! (A program megírásakor a felhasználó által megadott adatok helyességét, érvényességét nem kell ellenőriznie, feltételezheti, hogy a rendelkezésre álló adatok a leírtaknak megfelelnek.)
A képernyőre írást igénylő részfeladatok eredményének megjelenítése előtt írja a képernyőre a feladat sorszámát (például 2. feladat)! A részfeladatok eredményeit a mintán látható formában jelenítse meg! Az ékezetmentes kiírás is elfogadott.

1. Olvassa be és tárolja el az utasadat.txt fájl tartalmát!
2. Adja meg, hogy hány utas szeretett volna felszállni a buszra!
3. A közlekedési társaság szeretné, ha a járművőn csak az érvényes jeggyel vagy bérlettel rendelkezők utaznának. Ezért a jegyeket és bérleteket a buszvezető a felszálláskor ellenőrzi.
(A bérlet még érvényes a lejárat napján.) Adja meg, hogy hány esetben kellett a buszvezetőnek elutasítania az utas felszállását, mert lejárt a bérlete vagy már nem volt jegye!
4. Adja meg, hogy melyik megállóban próbált meg felszállni a legtöbb utas! (Több azonos érték esetén a legkisebb sorszámút adja meg!)
5. A közlekedési társaságnak kimutatást kell készítenie, hogy hányszor utaztak valamilyen kedvezménnyel a járművön. Határozza meg, hogy hány kedvezményes és hány ingyenes utazó szállt fel a buszra! (Csak az érvényes bérlettel rendelkező szállhatott fel a buszra!)
6. Készítsen függvényt napokszama néven az alábbi algoritmus alapján. Az algoritmus a paraméterként megadott két dátumhoz (év, hónap, nap) megadja a közöttük eltelt napok számát! (A MOD a maradékos osztást, a DIV az egészrészes osztást jelöli.) Az algoritmust a fuggveny.txt fájlban is megtalálja. A függvényt a következő feladat megoldásához felhasználhatja.
Függvény napokszama(e1:egész, h1:egész, n1: egész, e2:egész, h2: egész, n2: egész): egész
h1 = (h1 + 9) MOD 12
e1 = e1 - h1 DIV 10
d1 = 365*e1 + e1 DIV 4 - e1 DIV 100 + e1 DIV 400 + (h1*306 + 5) DIV 10 + n1 - 1
h2 = (h2 + 9) MOD 12
e2 = e2 - h2 DIV 10
d2 = 365*e2 + e2 DIV 4 - e2 DIV 100 + e2 DIV 400 + (h2*306 + 5) DIV 10 + n2 - 1
napokszama:= d2-d1
Függvény vége
7. A közlekedési társaság azoknak az utasoknak, akiknek még érvényes, de 3 napon belül lejár a bérlete, figyelmeztetést szeretne küldeni e-mailben. (Például, ha a felszállás időpontja 2019. február 5., és a bérlet érvényessége 2019. február 8., akkor már kap az utas levelet, ha 2019. február 9. az érvényessége, akkor még nem kap levelet.) Válogassa ki és írja a figyelmeztetes.txt állományba ezen utasok kártyaazonosítóját és a bérlet érvényességi idejét (éééé-hh-nn formátumban) szóközzel elválasztva!

Minta a szöveges kimenetek kialakításához:
2. feladat
A buszra 699 utas akart felszállni.

3. feladat
A buszra 21 utas nem szállhatott fel.

4. feladat
A legtöbb utas (39 fő) a 8. megállóban próbált felszállni.

5. feladat
Ingyenesen utazók száma: 133 fő
A kedvezményesen utazók száma: 200 fő

Minta a figyelmeztetes.txt állomány kialakításához:
3023275 2019-03-29
2960983 2019-03-26
1581897 2019-03-27
2761792 2019-03-28
...


Források: utasadat.txt, fuggveny.txt

# 1. feladat fajl = open('utasadat.txt')
forras = fajl.read().splitlines()
fajl.close()
adatok = [sor.split(' ') for sor in forras]

print('\n2. feladat')
print('A buszra',len(adatok),'utas akart felszállni.')

print('\n3. feladat')
nemjo = 0
ervenyesek = [] # az érvényes indexek, kell majd az 5. feladathoz
for adat in adatok:
erv = True
if adat[4]=='0':
erv = False
if adat[3] != 'JGY': # bérletes
felszall = int(adat[1][:4])*365+int(adat[1][4:6])*31+int(adat[1][6:8]) # 1 év 365 nap, 1 hónap 31 napos
ervenyes = int(adat[4][:4])*365+int(adat[4][4:6])*31+int(adat[4][6:8]) # 1 év 365 nap, 1 hónap 31 napos
if felszall>ervenyes:
erv = False
if erv:
ervenyesek.append(adatok.index(adat))
print('A buszra',len(adatok)-len(ervenyesek),'utas nem szálhatott fel.')

print('\n4. feladat')
felszallok = []
for i1 in range(30):
felszallok.append(sum([1 for adat in adatok if int(adat[0])==i1]))
print('A legtöbb utas ('+str(max(felszallok))+') fő a '+str(felszallok.index(max(felszallok)))+'. megállóban próbált felszállni.')

print('\n5. feladat') # a tömbökbe elég pl. 1-eseket írni csak, utána úgyis a méretük kell
kedv = [1 for adat in adatok if adatok.index(adat) in ervenyesek and adat[3] in ['TAB','NYB']]
ingy = [1 for adat in adatok if adatok.index(adat) in ervenyesek and adat[3] in ['RVS','NYP','GYK']]
print('Ingyenesen utazók száma:',len(ingy),'fő.')
print('Kedvezményesen utazók száma:',len(kedv),'fő.')

# 6. feladat
def napokszama(e1,h1,n1,e2,h2,n2):
h1 = (h1 + 9) % 12
e1 = e1 - h1 // 10
d1= 365*e1 + e1 // 4 - e1 // 100 + e1 // 400 + (h1*306 + 5) // 10 + n1 - 1
h2 = (h2 + 9) % 12
e2 = e2 - h2 // 10
d2= 365*e2 + e2 // 4 - e2 // 100 + e2 // 400 + (h2*306 + 5) // 10 + n2 - 1
return(d2-d1)

# 7. feladat
fajl = open('figyelmeztetes-vg.txt','w')
for adat in adatok:
if adat[3] != 'JGY' and adatok.index(adat) in ervenyesek:
e_1 = int(adat[1][:4])
h_1 = int(adat[1][4:6])
n_1 = int(adat[1][6:8])
e_2 = int(adat[4][:4])
h_2 = int(adat[4][4:6])
n_2 = int(adat[4][6:8])
if napokszama(e_1,h_1,n_1,e_2,h_2,n_2)<4:
print(adat[2],adat[4][:4]+'-'+adat[4][4:6]+'-'+adat[4][6:8],file=fajl)
fajl.close()

2019. május (Céges autók)  

Egy cég 10 olyan autóval rendelkezik, amelyet a dolgozók igénybe vehetnek az üzleti ügyeik intézésére. Az autókat akár többnapos útra is elvihetik, illetve egy autót egy nap több dolgozó is elvihet. A rendszer az autók parkolóból való ki- és behajtását rögzíti. A parkoló a hónap minden napján 7-23 óra között van nyitva, csak ebben az időszakban lehet elvinni és visszahozni az autókat. Az autót mindig annak a dolgozónak kell visszahoznia, amelyik elvitte. Egyszerre csak egy autó lehet minden dolgozónál.
Az autok.txt fájl egy hónap (30 nap) adatait rögzíti. Egy sorban szóközökkel elválasztva 6 adat található az alábbi sorrendben.
napegész szám (1-30)a hónap adott napja
óra:percszöveg (óó:pp formátumban)a ki- vagy a behajtás időpontja
rendszám6 karakteres szöveg (CEG300-CEG309) az autó rendszáma
személy azonosítójaegész szám (500-600)az autót igénybe vevő dolgozó azonosítója
km számlálóegész száma km számláló állása
ki/be hajtásegész szám (0 vagy 1)a parkolóból kihajtáskor 0, a behajtáskor 1
A sorok száma legfeljebb 500. Az adatok a napok szerint, azon belül óra és perc szerint rendezettek. Továbbá tudjuk, hogy a hónap első napján a cég mind a tíz autója a parkolóban volt.
Például:
… 5 07:30 CEG300 590 30580 0
5 14:16 CEG300 590 30656 1
5 17:00 CEG300 534 30656 0
5 19:03 CEG300 534 30784 1

15 09:53 CEG308 543 35048 0
17 11:16 CEG308 543 35746 1
A példában látható, hogy a CEG300 rendszámú autót az 5. napon kétszer is elvitték. Először 7:30-kor vitték el és 14:16-kor hozta vissza az 590-es dolgozó. A kivitelkor a kilométerszámláló állása 30 580 km volt, amikor visszahozta 30 656 km volt. Másodszor 17:00-kor vitte el az 534-es dolgozó az autót és 19:03-kor hozta vissza. A CEG308 rendszámú autót pedig a 15. napon vitte el az 543-as dolgozó és a 17. napon hozta vissza.

Készítsen programot, amely az autok.txt állomány adatait felhasználva az alábbi kérdésekre válaszol! A program forráskódját mentse cegesauto néven! (A program megírásakor a felhasználó által megadott adatok helyességét, érvényességét nem kell ellenőriznie, feltételezheti, hogy a rendelkezésre álló adatok a leírtaknak megfelelnek.)
A képernyőre írást igénylő részfeladatok eredményének megjelenítése előtt írja a képernyőre a feladat sorszámát (például: 3. feladat)! Ha a felhasználótól kér be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár! Az ékezetmentes kiírás is elfogadott.
Az eredmény megjelenítését és a felhasználóval való kommunikációt a feladatot követő minta alapján valósítsa meg!

1. Olvassa be és tárolja el az autok.txt fájl tartalmát!
2. Adja meg, hogy melyik autót vitték el utoljára a parkolóból! Az eredményt a mintának megfelelően írja a képernyőre!
3. Kérjen be egy napot és írja ki a képernyőre a minta szerint, hogy mely autókat vitték ki és hozták vissza az adott napon!
4. Adja meg, hogy hány autó nem volt bent a hónap végén a parkolóban!
5. Készítsen statisztikát, és írja ki a képernyőre mind a 10 autó esetén az ebben a hónapban megtett távolságot kilométerben! A hónap végén még kint lévő autók esetén az utolsó rögzített kilométerállással számoljon! A kiírásban az autók sorrendje tetszőleges lehet.
6. Határozza meg, melyik személy volt az, aki az autó egy elvitele alatt a leghosszabb távolságot tette meg! A személy azonosítóját és a megtett kilométert a minta szerint írja a képernyőre! (Több legnagyobb érték esetén bármelyiket kiírhatja.)
7. Az autók esetén egy havi menetlevelet kell készíteni! Kérjen be a felhasználótól egy rendszámot! Készítsen egy X_menetlevel.txt állományt, amelybe elkészíti az adott rendszámú autó menetlevelét! (Az X helyére az autó rendszáma kerüljön!) A fájlba soronként tabulátorral elválasztva a személy azonosítóját, a kivitel időpontját (nap. óra:perc), a kilométerszámláló állását, a visszahozatal időpontját (nap. óra:perc), és a kilométerszámláló állását írja a minta szerint! (A tabulátor karakter ASCII-kódja: 9.)

Minta a szöveges kimenetek kialakításához:
2. feladat
30. nap rendszám: CEG300
3. feladat
Nap: 4
Forgalom a(z) 4. napon:
12:50 CEG303 561 ki
19:17 CEG308 552 be
4. feladat
A hónap végén 4 autót nem hoztak vissza.
5. feladat
CEG300 6751 km
CEG301 5441 km
CEG302 5101 km
CEG303 7465 km
CEG304 6564 km
CEG305 5232 km
CEG306 7165 km
CEG307 6489 km
CEG308 6745 km
CEG309 1252 km
6. feladat
Leghosszabb út: 1551 km, személy: 506
7. feladat
Rendszám: CEG304
Menetlevél kész.

A CEG304_menetlevel.txt fájl tartalma:
...
588$\qquad$21. 16:58$\qquad$13452 km$\qquad$23. 20:28$\qquad$14335 km
512$\qquad$24. 16:58$\qquad$14335 km$\qquad$26. 22:21$\qquad$15041 km
504$\qquad$27. 13:47$\qquad$15041 km

Forrás: autok.txt

# 1. feladat
with open('autok.txt') as fajl:
forras = fajl.read().splitlines()
adatok = [sor.split(' ') for sor in forras]
# adatok[nap, idő: óó:pp, rendszám, személy, km, ki:0 vagy be:1]

# 2. feladat; nem biztos, hogy az utolsó bejegyzés a legutolsó idejű
# nap*24*60+óra*60+perc alapján lehet összevetni az időket
# elvitték autókról lista: nap, rendszám, elvitel ideje percekbe konvertálva
lista = [[adat[0],adat[2],24*60*int(adat[0])+60*int(adat[1][0:2])+int(adat[1][3:5])] for adat in adatok if adat[5]=='0']
#print(lista)
utolso = [[a[0],a[1]] for a in lista if a[2]==max([b[2] for b in lista])]
print('2. feladat '+utolso[0][0]+'. nap rendszám:'+utolso[0][1])

# 3. feladat
print(' 3. feladat')
nap = '4'#input('Nap: ')
print('Nap tesztadat:',nap)
print('Forgalom a(z) '+nap+'. napon:')
forgalom = [[adat[1],adat[2],adat[3],adat[5]] for adat in adatok if int(adat[0])==int(nap)] # azért kell az int, mert lehet '4' vagy '04' is a nap
for forg in forgalom:
if forg[3]=='0':
forg[3]='ki'
else:
forg[3]='be'
for forg in forgalom:
print(' '.join([i for i in forg]))

# 4. feladat
kint = [] # a kint lévő autók listája; ha kiviszik, akkor kivesszük a listából, ha behozzuk, akkor berakjuk a listába
for adat in adatok:
if adat[5] == '0':
kint.append(adat[2])
else:
kint.remove(adat[2])
print(' 4. feladat A hónap végén',len(kint),'autót nem hoztak vissza.')

# 5. feladat
print(' 5. feladat')
rendszamok = {adat[2] for adat in adatok}
rendszamok1 = [[rendszam,0,0] for rendszam in rendszamok] # rendszám, első km, utolsó km
#print(rendszamok1)
for rendszam in rendszamok1:
for adat in adatok:
if rendszam[0] == adat[2]: # kigyűjtjük a rendszámhoz tartozó legkisebb és legnagyobb km értékét az adatokból
if int(adat[4]) < rendszam[1] or rendszam[1] == 0:
rendszam[1] = int(adat[4])
elif int(adat[4]) > rendszam[2]:
rendszam[2] = int(adat[4])
print(' '.join([rendszam[0]+' '+str(rendszam[2]-rendszam[1])+' km' for rendszam in rendszamok1]))

# 6. feladat
# utak[rendszám,ember,kivitel km,megtett út km-ben, kivitel indexe az adatok tömbben, kivitel dátuma, behozatal dátuma, behozatal km]
# az index azért kell, hogy a következő behozatal keresése ettől az indextől induljon; az index utáni adatok a 7. feladat megoldását segítik

# először a kiviteleket gyűjtjük be a tömbbe
utak = [[adat[2],adat[3],int(adat[4]),0,adatok.index(adat),adat[0]+'. '+adat[1],'',''] for adat in adatok if adat[5]=='0']
#print(utak)
# most megvizsgáljuk a kivitelhez legközelebbi visszahozást; ha nem talál, akkor annál az adatnál 0 marad a behozatal és a megtett út
for ut in utak:
index1 = ut[4]+1
if index1 < len(adatok):
#print('ehhez keres:',ut)
#print('innen indul:',index1,adatok[index1])
while index1
#print(' keresés:',index1,adatok[index1],len(adatok))
index1 += 1
#print('megtalálta:',index1,adatok[index1],len(adatok))
if index1 != len(adatok): # kint van-e a kocsi
ut[3] = int(adatok[index1][4])-ut[2]
ut[6] = adatok[index1][0]+'. '+adatok[index1][1]
ut[7] = adatok[index1][4]
utak.sort(key = lambda e:e[3], reverse = True)
#for ut1 in utak:
# print(ut1)
print(' 6. feladat Leghosszabb út:',utak[0][3],'km, személy:',utak[0][1])

#7. feladat
print(' 7. feladat')
rendszam = 'CEG304'#input('Rendszám: ')
print('tesztrendszám:',rendszam) # tesztelés után törledő
fajl = open(rendszam+'_menetlevel.txt',mode='w')
menetlevel = [ut for ut in utak if ut[0]==rendszam]
menetlevel.sort(key = lambda e:e[2]) # kivitel km alapján rendezzük
for menet in menetlevel:
#print(menet)
print(menet[1],menet[5],str(menet[2])+' km ',sep=' ',end='', file=fajl) # ha nincs ott a km utám a spce, hülyén néz ki a kiírás
print(' '+menet[6]+' '+menet[7]+' km' if menet[7]!='' else ' ', file=fajl)
fajl.close()
print('Menetlevél kész.')
'''
A fájlba
soronként tabulátorral elválasztva a személy azonosítóját, a kivitel időpontját (nap.
óra:perc), a kilométerszámláló állását, a visszahozatal időpontját (nap. óra:perc), és
a kilométerszámláló állását írja a minta szerint!

while index1 < len(menetlevel):
if menetlevel[index1][0] == rendszam:
sor = menetlevel[index1][1]+' '+menetlevel[index1][2]+'. '+menetlevel[index1][3]+' '+str(menetlevel[index1][4])+' km'
index1 += 1
if menetlevel[index1][0] == rendszam:
sor += ' '+menetlevel[index1][2]+'. '+menetlevel[index1][3]+' '+str(menetlevel[index1][4])+' km'
index1 += 1
fajl.write(sor+' ')
else:
index1 += 1
print('Menetlevél kész.')
'''

2019. május magyar, mint idegennyelv (Tantárgyfelosztás)  

A tantárgyfelosztás a tanév tervezésének alapvető dokumentuma. A tantárgyfelosztás azt tartalmazza, hogy a tanárok a tantárgyaikat mely osztályokban, hány órában tanítják. Ebben a feladatban egy négy évfolyamos gimnázium tantárgyfelosztásának adatait kell elemeznie.
A tantárgyfelosztást ezúttal egy adatbázis-kezelő programmal előállított, egyszerű szerkezetű szöveges állományban kapja az alábbi minta szerint (Minden bejegyzést négy sor tárol.):
Albatrosz Aladin
biologia
9.a
2
Albatrosz Aladin
osztalyfonoki
9.a
1

Csincsilla Csilla
matematika
9.x
2

Az első bejegyzés megadja, hogy Albatrosz Aladin tanár úr biológiát (biologia) fog tanítani a 9.a osztályban heti 2 órában. Ha az osztály betűjele x, akkor évfolyam szintű csoportról van szó. Példánkban Csincsilla Csilla tanárnő a 9. évfolyam részére heti 2 órás matematika órát tart. Az osztályfőnököket arról ismerhetjük fel, hogy ők tartják az osztályfőnöki (osztalyfonoki) órát.
A megoldás során felhasználhatja, hogy a fájl maximum 1000 bejegyzést (azaz legfeljebb 4000 sort) tartalmaz. Az iskolában legfeljebb 100 tanár és legfeljebb 50 osztály van, továbbá minden osztálynak pontosan egy osztályfőnöke van.

Készítsen programot, amely a beosztas1.txt állomány adatait felhasználva az alábbi kérdésekre válaszol! A program forráskódját mentse tanfel néven! (A program megírásakor a felhasználó által megadott adatok helyességét, érvényességét nem kell ellenőriznie, és feltételezheti, hogy a rendelkezésre álló adatok a leírtaknak megfelelnek.)
A képernyőre írást igénylő részfeladatok esetén – a mintához tartalmában hasonlóan – írja ki a képernyőre a feladat sorszámát (például: 3. feladat:), és utaljon a kiírt tartalomra is! Ha a felhasználótól kér be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár! Mindkét esetben az ékezetmentes kiírás is elfogadott.

1. Olvassa be és tárolja el a beosztas1.txt állományban talált adatokat, és annak felhasználásával oldja meg a következő feladatokat!
2. Hány bejegyzés található az állományban? Az eredményt írassa ki a képernyőre!
3. A fenntartó számára fontos információ, hogy az iskolában hetente összesen hány tanítási óra van. Határozza meg ezt az adatot és írassa ki a képernyőre!
4. Kérje be a felhasználótól egy tanár nevét, és írassa ki a képernyőre, hogy hetente hány órában tanít!
5. Készítse el az of.txt fájlt, amely az osztályfőnökök nevét tartalmazza osztályonként az alábbi formában (az osztályok megjelenítésének sorrendje a mintától eltérhet):
9.a - Albatrosz Aladin
9.b - Hangya Hanna
9.c - Zerge Zenina

6. Egyes osztályokban bizonyos tantárgyakat a tanulók csoportbontásban tanulnak: ekkor az adott tantárgyra és osztályra két bejegyzést is tartalmaz a tantárgyfelosztás. Kérje be egy osztály azonosítóját, valamint egy tantárgy nevét, és írassa ki a képernyőre, hogy az adott osztály a megadott tantárgyat csoportbontásban vagy osztályszinten tanulja-e!
(Feltételezheti, hogy a megadott osztály tanulja a megadott tantárgyat.)
7. A fenntartó számára az is fontos információ, hogy hány tanár dolgozik az iskolában. Írassa ki ezt az adatot a képernyőre!

Példa a szöveges kimenetek kialakításához:
2. feladat
A fájlban 329 bejegyzés van.

3. feladat
Az iskolában a heti összóraszám: 1016

4. feladat
Egy tanár neve= Albatrosz Aladin
A tanár heti óraszáma: 24

6. feladat
Osztály= 10.b
Tantárgy= kemia
Csoportbontásban tanulják.

7. feladat
Az iskolában 49 tanár tanít.

Forrás: beosztas1.txt

# 1. feladat
with open('beosztas.txt') as fajl:
forras = fajl.read().splitlines()
adatok = [forras[i:i+4] for i in range(0,len(forras),4)]

print(adatok) # adatok[név,tantárgy,osztály,óraszám]

# 2. feladat
print('2. feladat A fájlban',len(adatok),'bejegyzés van.')

# 3. feladat
print(' 3. feladat Az iskolában a heti összóraszám:',sum([int(adat[3]) for adat in adatok]))

# 4. feladat
tanar = 'Albatrosz Aladin'#input('Egy tanár neve= ')
print(' 4. feladat A tanár heti óraszáma:',sum([int(adat[3]) for adat in adatok if adat[0]==tanar]))

# 5. feladat
fajl = open('of.txt',mode='w')
print(' '.join([adat[2]+' - '+adat[0] for adat in adatok if adat[1]=='osztalyfonoki']),fajl)
fajl.close()

# 6. feladat
print('')
osztaly = '9.a'#input('Osztály= ')
tantargy = 'fizika'#input('Tantárgy= ') print('tesztadatok:',osztaly,tantargy) # tesztelés után törlendő
print(' 6. feladat Osztályszinten tanulják' if len([adat[0] for adat in adatok if (adat[2]==osztaly and adat[1]==tantargy)])==1 else 'Csoportbontásban tanulják')

# 7. feladat
print(' 7. feladat Az iskolában',len({adat[0] for adat in adatok}),'tanár tanít.')