def kiir(ssz,szoveg):
    print('------------------------------------------')
    print(str(ssz)+'. feladat - '+szoveg)
    print('------------------------------------------')

def kitoltott(sor,oszlop):
    if sudoku[sor-1][oszlop-1]=='0':
        s='Az adott helyet még nem töltötték ki.'
    else:
        s=sudoku[sor-1][oszlop-1]
    return s

def hely(sor,oszlop):
    resztablak=[[1,2,3],[4,5,6],[7,8,9]]
    rt_sor=(sor-1)//3
    rt_oszl=(oszlop-1)//3
    return resztablak[rt_sor][rt_oszl]

def resztabla_informaciok(hol,ertek):
    r_ksor=(hol-1)//3*3
    r_koszlop=(hol-1)%3*3
    resztabla=[]
    for s_sor in range(r_ksor,r_ksor+3):
        for s_oszlop in range(r_koszlop,r_koszlop+3):
            resztabla.append(sudoku[s_sor][s_oszlop])
    return resztabla.count(ertek)
    
##############################################################################
# 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!
##############################################################################

kiir(1,'Adatok beolvasása')
file=input('Kérem a fájl nevét: ')
sor=int(input('Kérek egy sorszámot (1-9): '))
oszlop=int(input('Kérek egy oszlopszámot (1-9): '))

##############################################################################
# 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!
##############################################################################

kiir(2,'Adott fájl beolvasása')

sudoku=[]
lepesek=[]
with open(file,'r') as f:
    sorok=0
    while sorok<9:
        sudoku.append(f.readline().strip().split())
        sorok+=1
    for fsor in f:
        lepesek.append(fsor.strip().split())

print('SUDOKU: \n',sudoku)
print('LÉPÉSEK: \n',lepesek)

##############################################################################
# 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!
##############################################################################

kiir(3,'Adott sor, oszlop helyen szereplő érték, és résztábla')

print(kitoltott(sor,oszlop))
print('A hely a(z) %d. résztáblázathoz tartozik.' %hely(sor,oszlop))

##############################################################################
# 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!
##############################################################################

kiir(4,'Hány százaléka nincs kitötlve a táblázatnak?')
nullak=0
for egy_sor in sudoku:
    nullak+=egy_sor.count('0')
print('Az üres helyek aránya: %.1f%s' %(nullak/(9*9)*100,'%'))

##############################################################################
# 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.
#       • „A helyet már kitöltötték”
#       • „Az adott sorban már szerepel a szám”
#       • „Az adott oszlopban már szerepel a szám”
#       • „Az adott résztáblázatban már szerepel a szám”
#       • „A lépés megtehető”    
###############################################################################        

kiir(5,'Lépések vizsgálata')

for lepes in lepesek:
    ertek,sor,oszlop=lepes[0],int(lepes[1]),int(lepes[2])
    
    print('A kiválasztott sor: %d oszlop: %d a szám: %s' %(sor,oszlop,ertek))
    
    if len(kitoltott(sor,oszlop))==1:
        print('A helyet már kitöltötték.')
    elif sudoku[sor-1].count(ertek)>0:
        print('Az adott sorban már szerepel a szám.')
    elif [sudoku[s][oszlop-1] for s in range(9)].count(ertek)>0:
        print('Az adott oszlopban már szerepel a szám.')
    elif resztabla_informaciok(hely(sor,oszlop),ertek)>0:
        print('Az adott résztáblázatban már szerepel a szám.')
    else:
        print('A lépés megtehető.')
    
