sudoku202110.py
1    def kiir(ssz,szoveg):
2        print('------------------------------------------')
3        print(str(ssz)+'. feladat - '+szoveg)
4        print('------------------------------------------')
5    
6    def kitoltott(sor,oszlop):
7        if sudoku[sor-1][oszlop-1]=='0':
8            s='Az adott helyet még nem töltötték ki.'
9        else:
10           s=sudoku[sor-1][oszlop-1]
11       return s
12   
13   def hely(sor,oszlop):
14       resztablak=[[1,2,3],[4,5,6],[7,8,9]]
15       rt_sor=(sor-1)//3
16       rt_oszl=(oszlop-1)//3
17       return resztablak[rt_sor][rt_oszl]
18   
19   def resztabla_informaciok(hol,ertek):
20       r_ksor=(hol-1)//3*3
21       r_koszlop=(hol-1)%3*3
22       resztabla=[]
23       for s_sor in range(r_ksor,r_ksor+3):
24           for s_oszlop in range(r_koszlop,r_koszlop+3):
25               resztabla.append(sudoku[s_sor][s_oszlop])
26       return resztabla.count(ertek)
27       
28   ##############################################################################
29   # 1. Olvassa be egy fájl nevét, egy sor és egy oszlop sorszámát (1 és 9
30   #    közötti számot)! A későbbi feladatokat ezen értékek felhasználásával kell
31   #    megoldania!
32   ##############################################################################
33   
34   kiir(1,'Adatok beolvasása')
35   file=input('Kérem a fájl nevét: ')
36   sor=int(input('Kérek egy sorszámot (1-9): '))
37   oszlop=int(input('Kérek egy oszlopszámot (1-9): '))
38   
39   ##############################################################################
40   # 2. Az előző feladatban beolvasott névnek megfelelő fájl tartalmát olvassa
41   #    be, és tárolja el a táblázat adatait! Ha ezt nem tudja megtenni, akkor
42   #    használja forrásként a rendelkezésre álló állományok egyikét!
43   ##############################################################################
44   
45   kiir(2,'Adott fájl beolvasása')
46   
47   sudoku=[]
48   lepesek=[]
49   with open(file,'r') as f:
50       sorok=0
51       while sorok<9:
52           sudoku.append(f.readline().strip().split())
53           sorok+=1
54       for fsor in f:
55           lepesek.append(fsor.strip().split())
56   
57   print('SUDOKU: \n',sudoku)
58   print('LÉPÉSEK: \n',lepesek)
59   
60   ##############################################################################
61   # 3. Írja ki a képernyőre, hogy a beolvasott sor és oszlop értékének megfelelő
62   #    hely…
63   #       a.  milyen értéket tartalmaz! Ha az adott helyen a 0 olvasható, akkor
64   #           az „Az adott helyet még nem töltötték ki.” szöveget jelenítse meg!
65   #       b.  melyik résztáblázathoz tartozik!
66   ##############################################################################
67   
68   kiir(3,'Adott sor, oszlop helyen szereplő érték, és résztábla')
69   
70   print(kitoltott(sor,oszlop))
71   print('A hely a(z) %d. résztáblázathoz tartozik.' %hely(sor,oszlop))
72   
73   ##############################################################################
74   # 4. Határozza meg a táblázat hány százaléka nincs még kitöltve! Az eredményt
75   #    egy tizedesjegy pontossággal jelenítse meg a képernyőn!
76   ##############################################################################
77   
78   kiir(4,'Hány százaléka nincs kitötlve a táblázatnak?')
79   nullak=0
80   for egy_sor in sudoku:
81       nullak+=egy_sor.count('0')
82   print('Az üres helyek aránya: %.1f%s' %(nullak/(9*9)*100,'%'))
83   
84   ##############################################################################
85   # 5. Vizsgálja meg, hogy a fájlban szereplő lépések lehetségesek-e a
86   #    beolvasott táblázaton! Tekintse mindegyiket úgy, mintha az lenne az
87   #    egyetlen lépés az eredeti táblázaton, de ne hajtsa azt végre! Állapítsa
88   #    meg, hogy okoz-e valamilyen ellentmondást a lépés végrehajtása!
89   #    Írja ki a lépéshez tartozó három értéket, majd a következő sorba írja az
90   #    alábbi megállapítások egyikét! Ha több megállapítás is igaz, elegendő
91   #    csak egyet megjelenítenie.
92   #       • „A helyet már kitöltötték”
93   #       • „Az adott sorban már szerepel a szám”
94   #       • „Az adott oszlopban már szerepel a szám”
95   #       • „Az adott résztáblázatban már szerepel a szám”
96   #       • „A lépés megtehető”    
97   ###############################################################################        
98   
99   kiir(5,'Lépések vizsgálata')
100  
101  for lepes in lepesek:
102      ertek,sor,oszlop=lepes[0],int(lepes[1]),int(lepes[2])
103      
104      print('A kiválasztott sor: %d oszlop: %d a szám: %s' %(sor,oszlop,ertek))
105      
106      if len(kitoltott(sor,oszlop))==1:
107          print('A helyet már kitöltötték.')
108      elif sudoku[sor-1].count(ertek)>0:
109          print('Az adott sorban már szerepel a szám.')
110      elif [sudoku[s][oszlop-1] for s in range(9)].count(ertek)>0:
111          print('Az adott oszlopban már szerepel a szám.')
112      elif resztabla_informaciok(hely(sor,oszlop),ertek)>0:
113          print('Az adott résztáblázatban már szerepel a szám.')
114      else:
115          print('A lépés megtehető.')
116      
117