rejtveny_201105idny.py
1    #------ 2. feladat ---------------------------------------------------------------------
2    def tiltott_mezok(s,o,kapcsolo):
3        tiltottak=[]                        # (5. feladathoz)
4        for i in range(s-1,s+2):            # s-1 és s+1 és
5            for j in range(o-1,o+2):        # o-1 és o+1 között vizsgálódunk
6                if (11>i>0 and 11>j>0):     # de csak akkor ha még a táblán vagyunk
7                    if i==s and j==o:       # a hajó pozíciója tuti tiltott
8                        continue
9                    else:
10                       if kapcsolo:
11                           print(f'{i}, {j}')
12                       tiltottak.append((i-1,j-1))     # szabalytalan_elhelyezes
13                                                       # függvény használja majd
14                                                       # (5. feladat)
15       return tiltottak    # 5. feladat miatt visszaadjuk a tiltott mezők listáját...
16   #------ 3. feladat ---------------------------------------------------------------------
17   def e_heti(matrix):
18       global hajok                # (4. feladathoz)
19       ok=0                        # tornyok ugyanott vannak a megoldásban?
20       tornyok=0                   # de mennyi van? több is van?... a megoldásban
21       hajok=0                     # hány hajó van a megoldásban?
22       for i in range(10):
23           for j in range(10):
24               if matrix[i][j] in range(1,10):         # torony van a megoldásban
25                   tornyok+=1
26                   if feladvany[i][j]==matrix[i][j]:   # a tornyok passzolnak
27                       ok+=1
28               if matrix[i][j]==11:                    # hajó van...
29                   hajok+=1
30       return True if ok==tornyok else False           # tornyok helye, száma okés
31   #------ 5. feladat ---------------------------------------------------------------------
32   def szabalytalan_elhelyezes(matrix):
33       for i in range(1,11):
34           for j in range(1,11):
35               if matrix[i-1][j-1]==11:
36                   t=tiltott_mezok(i,j,False)      # itt használjuk a tiltott mezőket
37                   for koord in t:                 # tiltott mezők koordinátái
38                       sor=koord[0]                # azaz sor és oszlopa
39                       oszlop=koord[1]
40                       if matrix[sor][oszlop]!=0:  # ha a tiltott mezőn van valami, az gáz!
41                           return True
42                           break
43       return False    # nem volt gond
44   #------ 6. feladat ---------------------------------------------------------------------
45   def vizsgal(matrix):
46       for i in range(10):
47           for j in range(10):
48               if matrix[i][j] in range(1,10):     # itt torony van a megoldásban
49                   hajodb=0                        # hány hajó látszik a toronyból
50                   for oszlop in range(10):        # abban a sorban...
51                       if matrix[i][oszlop]==11:
52                           hajodb+=1
53                   for sor in range(10):           # ...és abban az oszlopban összesen?
54                       if matrix[sor][j]==11:
55                           hajodb+=1
56                   if hajodb!=matrix[i][j]:        # hajók száma eltér a torony értékétől,
57                       return False                # akkor bukta...
58                       break
59       return True     # minden okés volt  
60                            
61       
62   #********************************* F Ő M O D U L ***************************************    
63   feladvany=[]        # ebben lesz a feladvány - "sima" mátrix (10 elemű listák listája
64   megoldasok={}       # ebben lesznek a megoldások - szótár (kulcs a név, érték: mátrix)
65   print('1. feladat')
66   print('Világítótorony pozíciója 10x10-es területen')
67   s=int(input('sor: '))
68   o=int(input('oszlop: '))
69   h=int(input('toronyból látható hajók száma: '))
70   if h>3:
71       print('Nehéz torony.')
72   else:
73       print('------------------------------------------------------\n2. feladat')
74       print('Mezők, ahova nem kerülhet hajó:')
75       tiltott_mezok(s,o,True)         # True jelentése itt: kiírás is lesz!
76   
77   # feladvány beolvasása egy 10x10-es mátrixba
78   fbe=open('feladvany.txt','r')
79   for sor in fbe:
80       feladvany.append(list(map(int,sor.strip().split())))    # minden egész szám lesz
81   fbe.close()
82       
83   # megoldások beolvasása egy szótárba, ahol:
84   # a kulcs a név, a szótár-bejegyzés egy 10x10-es mátrix
85   fbe=open('megoldas.txt','r')
86   N=int(fbe.readline().strip())   # forrásfájl első sora
87   kulcs=fbe.readline().strip()    # következő sor egy név --> ez kulcs lesz
88   tabla=[]                        # ebben lesz a 10x10-es mátrix,
89                                   # ami a szótár-bejegyzés lesz majd
90   for sor in fbe:
91       if len(sor)<20:             # ha ilyen a sor, akkor az név, tehát kulcs!
92           megoldasok[kulcs]=tabla # "régi" kulcsra az elkészült táblát elhelyezzük a szótárban
93           tabla=[]                # tábla ismét üres legyen
94           kulcs=sor.strip()       # az "új" kulcs beolvasása
95       else:
96           tabla.append(list(map(int,sor.strip().split())))    # fájl soraival, mint listákkal
97                                                               # töltögetjük a táblát
98   megoldasok[kulcs]=tabla         # mivel a végén nem jön már kulcs, az utolsó tábláról
99   fbe.close()                     # is gondoskodni kell...
100  
101      
102  nem_oke=[]                      # nem erre a hétre vonatkozó megoldást küldtek be
103  oke=[]                          # ezek az e heti rejtvényt próbálták megoldani
104  elhelyezes_hiba=0               # rosszul helyezte el a hajókat
105  hibas=0                         # 12 hajót "rakott le"? 
106  for kulcs in megoldasok:
107      if not e_heti(megoldasok[kulcs]):
108          nem_oke.append(kulcs)
109      elif hajok!=12:                         # (4. feladat)
110          hibas+=1
111      else:
112          oke.append(kulcs)
113    
114  print('------------------------------------------------------\n3. feladat')
115  if len(nem_oke)>0:
116      print('Nem az e heti feladványra küldte be a megoldását:')
117      for kulcs in nem_oke:
118          print(kulcs)
119  else:
120      print('Mindegyik megoldás erre a heti feladványra érkezett.')
121  
122  print('------------------------------------------------------\n4. feladat')
123  print(f'A hajók száma {hibas} esetben hibás.')
124     
125  hatodik=[]      # 6. feladathoz
126  for kulcs in oke:
127      if szabalytalan_elhelyezes(megoldasok[kulcs]):
128          elhelyezes_hiba+=1
129      else:
130          hatodik.append(kulcs)   # ha minden rendben vele az előző szempontok szerint,
131                                  # akkor mehetnek a "vizsgálatra" (lásd 6. feladat)
132  
133  print('------------------------------------------------------\n5. feladat')
134  print(f'Szabálytalan hajóelhelyezés {elhelyezes_hiba} beküldőnél fordul elő.')
135  
136  print('------------------------------------------------------\n6. feladat')
137  print('Helyes megoldást beküldők:')
138  for kulcs in hatodik:
139      if vizsgal(megoldasok[kulcs]):      # jól rakta-e le a hajóit?
140          print(kulcs)
141      
142