class Rejtveny:
    be = open('feladvany.txt')
    fel = [x.split() for x in be.readlines()]
    be.close()
    rejtveny = fel

    def __str__(self):
        s = ''
        for sz in self.rejtveny:
            s += ' '.join(sz) + '\n'
        return s


class Megoldas(Rejtveny):
    """Rejtveny osztály leszármazottja"""

    def __init__(self, megoldasa):
        self.nev = megoldasa[0]
        self.megoldas = megoldasa[1:]

    def __str__(self):
        s = ''
        for sz in self.megoldas:
            s += ' '.join(sz) + '\n'
        return s

    def visszaalakit(self):
        """a megoldásból törli a hajókat"""

        vissza = []
        for k in range(10):
            sorok = []
            for j in range(10):
                if self.megoldas[k][j] == '11':
                    sorok.append('0')
                else:
                    ertek = self.megoldas[k][j]
                    sorok.append(ertek)
            vissza.append(sorok)
        return vissza

    def eheti(self):
        """a rejtvénynek megfelelő megoldás - tornyok helyes elrendezése"""
        if self.visszaalakit() == self.rejtveny:
            return True
        else:
            return False

    def hajokszama(self):
        """a megoldásban szereplő hajók száma"""
        return sum([sor.count('11') for sor in self.megoldas])

    def hajokhiba(self):
        """hajók száma 12-nél kevesebb vagy több, akkor hiba"""
        if self.hajokszama() != 12:
            return True
        else:
            return False

    def hibaskitoltes(self):
        """a szomszédsági feltételeknek nem felel meg"""
        hibas = False
        for i in range(10):
            for j in range(10):
                if self.megoldas[i][j] == '11':
                    hajo = Torony(11, i + 1, j + 1)
                    if hajo.nem_uresszomszed_db(self.megoldas) != 0:
                        hibas = True
                        break
        return hibas

    def hajoszam_rendben(self):
        """a torony számának megfelelő hajószám van a torony sorában és oszlopában"""
        rendben = True
        for i in range(10):
            for j in range(10):
                tor = Torony(self.megoldas[i][j], i + 1, j + 1)
                if int('0') < int(self.megoldas[i][j]) < int('11') and int(self.megoldas[i][j]) != tor.db_hajot_lat(self.megoldas, i,
                                                                                                     j):
                    rendben = False
                    break
        return rendben


class Torony:
    """Torony osztály
    ha h=11, akkor hajó, ha h=0, akkor víz"""

    def __init__(self, h=0, s=0, o=0):
        self.hajok = h
        self.sor = s
        self.oszlop = o
        self.tiloshelyek = self.tiloshelyek()

    def nehez(self):
        """a torony nehézsége"""
        if self.hajok > 3:
            return True
        else:
            return False

    def tiloshelyek(self):
        """azok a helyek ahová nem kerülhet hajó"""
        helyek = []
        for s in range(self.sor - 1, self.sor + 2):
            for o in range(self.oszlop - 1, self.oszlop + 2):
                if 1 <= s <= 10 and 1 <= o <= 10:
                    helyek.append((s, o))
        if (self.sor, self.oszlop) != ():
            helyek.remove((self.sor, self.oszlop))
        return helyek

    def tiloshelyek_kiir(self):
        """a tilos helyek koordinátákkal"""
        ki = ''
        for hely in self.tiloshelyek:
            ki += str(hely) + '\n'
        return ki

    def db_hajot_lat(self, tabla, sorindex, oszlopindex):
        """a toronyból látható hajók száma"""
        dbhajo = 0
        dbhajo += tabla[sorindex].count('11')
        for i in range(10):
            if tabla[i][oszlopindex] == '11':
                dbhajo += 1
        return dbhajo

    def nem_uresszomszed_db(self, tabla):
        """a torony melletti nem víz (0) helyek száma"""
        db = 0
        for hely in self.tiloshelyek:
            if tabla[hely[0] - 1][hely[1] - 1] != '0':
                db += 1
        return db


be = open('megoldas.txt')
megoldasok = []
i = 0
db = be.readline()


def strtolist(szoveg):
    # a beolvasásnál nem fog figyelmeztetést jelezni
    return szoveg.split()


for sor in be.readlines():
    if i % 11 == 0:
        megoldasok.append([sor.strip()])
    else:
        megoldasok[-1].append(strtolist(sor))
    i += 1
be.close()

# 1. feladat
print("1. feladat\nAdd meg a torony adatait:")
sor = int(input("sor: "))
oszlop = int(input("oszlop: "))
hajok = int(input("hajók száma: "))
torony = Torony(hajok, sor, oszlop)
if torony.nehez():
    print("Nehéz torony")

# 2. feladat
print("2. feladat\nAhová nem kerülhet hajó:")
print(torony.tiloshelyek_kiir())

# 3. feladat
nevek = []
for meg in megoldasok:
    mego = Megoldas(meg)
    if not mego.eheti():
        nevek.append(mego.nev)
print(['Mindenki erre a hétre küldött megoldást', 'Nem erre a hétre küldte: ' + ' '.join(nevek)][len(nevek) > 1])

# 4. feladat
hiba = 0
for meg in megoldasok:
    if Megoldas(meg).eheti() and Megoldas(meg).hajokhiba():
        hiba += 1
print("4. feladat\nA hajók száma miatti hibás megoldások száma:", hiba)

# 5. feladat
hiba = 0
for meg in megoldasok:
    if Megoldas(meg).eheti() and not Megoldas(meg).hajokhiba() and \
            Megoldas(meg).hibaskitoltes():
        # print(Megoldas(meg).nev)
        hiba += 1
print("5. feladat\nHibás kitöltések száma:", hiba)

# 6. feladat
print("6. feladat\nHelyes megoldást adtak:")
for meg in megoldasok:
    if Megoldas(meg).eheti() and not Megoldas(meg).hajokhiba() and Megoldas(meg).hajoszam_rendben():
        print(Megoldas(meg).nev)
