adatok = []                 # mátrix: listák listája a forrásfájl alapján

# -----------------------------------------------------------------------------------------------
# 1. Olvassa be a bedat.txt állomány tartalmát, tárolja el az abban szereplő adatokat, és annak
#    felhasználásával oldja meg a következő feladatokat! Feltételezheti, hogy az állomány
#    legfeljebb 2000 adatsort tartalmaz.
# -----------------------------------------------------------------------------------------------
fbe = open('bedat.txt','r')
for sor in fbe:
    sor = sor.strip().split()
    adatok.append(sor)
fbe.close()
# -----------------------------------------------------------------------------------------------
# 2. Határozza meg, hogy mikor lépett be az épületbe az első tanuló, és mikor távozott az utolsó!
#    Az időpontokat a mintához hasonlóan jelenítse meg a képernyőn!
#    IDÉZET A FELADATLEÍRÁSBÓL: 
#           "A fájlban az első esemény egy belépés, az utolsó egy kilépés a főkapun."
# -----------------------------------------------------------------------------------------------
print('2. feladat')
print(f'Az első tanuló {adatok[0][1]}-kor lépett be a főkapun.')
print(f'Az utolsó tanuló {adatok[-1][1]}-kor lépett ki a főkapun.')
# -----------------------------------------------------------------------------------------------
# 3. Készítsen listát a kesok.txt nevű állományba, amely megadja, hogy mely tanulók léptek
#    be a nagykapun 07:50 után, de legkésőbb 08:15-kor! A fájlban a belépések a mintának
#    megfelelően külön sorban szerepeljenek, az időpontot egy szóköz válassza el a tanuló
#    azonosítójától! Ha egy tanuló ezalatt többször is belépett, minden belépése jelenjen meg a
#    fájlban!
# -----------------------------------------------------------------------------------------------
start = '07:50'         # az óó:pp formátum miatt szövegesen is relációba hozhatók az adatok
vege  = '08:15'         # pl. '07:51' < '07:53'
fki = open('kesok.txt','w')
for adat in adatok:
    if adat[2] == '1' (adat[1] > start and adat[1] <= vege):
        print(f'{adat[1]} {adat[0]}', file = fki)
fki.close()
# -----------------------------------------------------------------------------------------------
# 4. Határozza meg, hány tanuló ebédelt aznap a menzán! Írassa ki az eredményt a képernyőre
#    a mintának megfelelően!
#    IDÉZET A FELADATLEÍRÁSBÓL:
#           "...a menzán legfeljebb egyszer ebédelhetnek..."
# -----------------------------------------------------------------------------------------------
print('4. feladat')
# ebéd esemény kódja: '3'
ebedelok=0
for adat in adatok:
    if adat[2] == '3':
        ebedelok += 1
print(f'A menzán aznap {ebedelok} tanuló ebédelt.')
# -----------------------------------------------------------------------------------------------
# 5. Szeretnénk tudni, hogy a könyvtári kölcsönzés vagy a menza a népszerűbb-e ezen a napon.
#       1. Határozza meg, hány tanuló kölcsönzött aznap a könyvtárban! Ha egy tanuló
#          többször is kölcsönzött, akkor azt csak egyszer vegye figyelembe! Írassa ki az
#          eredményt a képernyőre a mintának megfelelően!
#       2. A könyvtárosok szerint több tanuló kölcsönöz egy nap a könyvtárban, mint
#          ahányan a menzán ebédelnek. Így volt-e ez ezen a napon is? A választ („Többen
#          voltak, mint a menzán.” vagy „Nem voltak többen, mint a menzán.”) a mintának
#          megfelelő formában írassa ki a képernyőre!
# -----------------------------------------------------------------------------------------------
print('5. feladat')
konyvtar = set()     # halmaz, mert lehet valaki többször is kölcsönzött...
for adat in adatok:
    if adat[2] == '4':                  # '4': kölcsönzés...
        konyvtar.add(adat[0])        # a diák kódját tesszük a halmazba, ismétlés így kizárva
print(f'Aznap {len(konyvtar)} tanuló kölcsönzött a könyvtárban.')
menza = []          # itt lehet lista is, de lehet halmaz is, lsd. 4. feladat idézetét
for adat in adatok:
    if adat[2] == '3':                  # '3': menza...
        menza.append(adat[0])        # a diák kódját tesszük a listába
if len(konyvtar) > len(menza):
    print('Többen voltak, mint a menzán.')
else:
    print('Nem voltak többen, mint a menzán.')
# -----------------------------------------------------------------------------------------------
# 6. A portás reggel elfelejtette a hátsó kaput bezárni, ezért a 10:45-kor kezdődő szünetben
#    néhány tanuló kiment a hátsó kijáraton át a szemközti pékségbe tízórait venni. A portás csak
#    10:50-kor zárta be a hátsó kaput, így 10:50 után a korábban a hátsó kapun át távozott
#    tanulóknak a főbejáraton át kellett visszajönniük. Írassa ki a képernyőre egy-egy szóközzel
#    elválasztva ezeknek a tanulóknak az azonosítóját! (A szünet 11:00-ig tartott, és
#    feltételezheti, hogy azt megelőzően valamennyi érintett tanuló visszaért.) Vegye
#    figyelembe, hogy a tanulók egy része aznap csak 11:00-ra jött iskolába, illetve szabályosan
#    lépett ki!
# -----------------------------------------------------------------------------------------------
# Fordítsuk le a feladatot: Olyan diákokat keresünk, akiknek a "normál"
#                   ... BE - KI - BE ... sorozatuk helyett
#                   ... BE - BE sorozatuk van,
# és a "második" vagy "többlet" BE a kérdéses időintervallumra esik...
# -----------------------------------------------------------------------------------------------
print('6. feladat')
print('Az érintett tanulók:')
diakok = set()
for adat in adatok:
    diakok.add(adat[0])

for diak in diakok:
    tmp=[]
    for adat in sorted(adatok):
        # egy adott diák be- vagy kilépés esetén a tmp listába kerül
        if adat[0] == diak and (adat[2] == '1' or adat[2] == '2'):   
            tmp.append(adat[2])
    be = tmp.count('1')
    ki = tmp.count('2')
    if be > ki:
        print(diak,end=' ')
print()
# Úgy tűnik, hogy nincs szükség az időpontok vizsgálatára! (Minta alapján, jó a fenti megoldás!)
# A többi diák "szabályosan" közlekedik a főkapun keresztül, lehetőség a szabályok "kijátszására"
# csak a megadott időpontig (10:50) lehetett. De ha feltételezzük, hogy volt olyan diák, aki
# 10:45 előtt (tehát nem a szünetben) már a hátsó kapun ment ki, és még a szünet előtt bejött a
# főkapun, akkor a fenti megoldás őt is beleveszi a "szabálytalankodó" diákok közé!
# Egészítsük ki a megoldást az időpontok vizsgálatával: 10:50 < BE < 11:00 legyen!
# (A probléma az, hogy a szabálytalan kilépést nem rögzítik, így csak a bejövetel vizsgálható!)
print('Az érintett tanulók:')
start = '10:50'             # hátsó kapu zárása
vege  = '11:00'             # szünet vége
# szünet vége: "feltételezheti, hogy azt megelőzően valamennyi érintett tanuló visszaért."                      

# diakok = set()
# for adat in adatok:
#    diakok.add(adat[0])

for diak in diakok:
    tmp=[]
    szabalytalan = False
    for adat in sorted(adatok):
        # egy adott diák be- vagy kilépés esetén a tmp listába kerül
        if adat[0] == diak and (adat[2] == '1' or adat[2] == '2'):  
            tmp.append(adat[2])
            if adat[2] == '1' and (adat[1] > start and adat[1] < vege):    # Itt az idővizsgálat!
                # van egy belépése a kérdéses időben...
                szabalytalan = True     # tehát feltételezhetően a szünetben ment ki
                                        # bár persze akármikor kimehetett...
    be = tmp.count('1')
    ki = tmp.count('2')
    if be > ki and szabalytalan:    # több be volt, és a kérdéses időben volt egy belépése
        print(diak,end=' ')
print()
# -----------------------------------------------------------------------------------------------
# 7. Kérje be egy tanuló azonosítóját, és írassa ki a minta szerinti formátumban, hogy mennyi
#    idő telt el az iskolába való első belépése és utolsó távozása között! Feltételezheti, hogy
#    19:00-ig minden tanuló elhagyta az iskolát. Ha aznap az adott azonosítójú tanuló nem járt
#    az iskolában, akkor írassa ki az Ilyen azonosítójú tanuló aznap nem volt az
#    iskolában. üzenetet!
# -----------------------------------------------------------------------------------------------
def ido(k, v):                  # érdemes egy külön függvényben megoldani az időszámítást...
    k_ora = int(k[0:2])
    v_ora = int(v[0:2])
    k_perc = int(k[3:5])
    v_perc = int(v[3:5])
    ora = ((v_ora * 60 + v_perc) - (k_ora * 60 + k_perc)) // 60
    perc = ((v_ora * 60 + v_perc) - (k_ora * 60 + k_perc)) % 60
    return (ora, perc)      # egy tuple-t ad vissza

print('7. feladat')
diak=input('Egy tanuló azonosítója = ')
van = False         # feltesszük, hogy nem találjuk meg
# diák keresése a mátrix elejétől kezdve ---> első előfordulása a belépés lesz
i=0
while i < len(adatok) and adatok[i][0]!=diak:
    i += 1
if i < len(adatok):
    # van találat
    van = True
    be = adatok[i][1]
    
# diák keresése a mátrix végétől visszafelé ---> első találat csak a kilépése lehet
i=len(adatok)-1
while i >=0 and adatok[i][0]!=diak:
    i -= 1
if van:             # jó lenne az if i >= 0: is
    ki = adatok[i][1]
    oraperc = ido(be, ki)
    print(f'A tanuló érkezése és távozása között {oraperc[0]} óra {oraperc[1]} perc telt el.')
else:
    print('Ilyen azonosítójú tanuló aznap nem volt az iskolában.')

