import itertools

class Escaquer:

    dlletres = {'a':0, 'b':1, 'c':2, 'd':3, 'e':4, 'f':5 , 'g':6, 'h':7}
          
    def __init__(self):
        self.graella = []
        for e in range(8):
            self.graella.append(['Buida']*8)

    def __getitem__(self, pos):
        if len(pos) == 2 and ('a' <= pos[0] <= 'h') and ('1' <= pos[1] <= '8'): 
            fila = self.dlletres[pos[0]]
            columna = int(pos[1]) - 1
            return self.graella[fila][columna]
        else:
            raise IndexError('Coordenades no vàlides')

    def __setitem__(self, pos, peça):
        if len(pos) == 2 and ('a' <= pos[0] <= 'h') and ('1' <= pos[1] <= '8'): 
            fila = self.dlletres[pos[0]]
            columna = int(pos[1])-1
            self.graella[fila][columna] = peça
        else:
            raise IndexError('Coordenades no vàlides')

    # __iter__ implementat com una funció generadora
    def __iter__1(self):
        for f in '87654321':
            for c in 'abcdefgh':
                yield self[c+f]

    # __iter__implementat amb itertools.product i map
    def __iter__2(self):
        # Iterador de tuples (dígit, lletra)
        it1 = itertools.product('87654321', 'abcdefgh')
        # Iterador de posicions de l'escaquer
        it2 = map(lambda x: x[1]+x[0], it1)
        # Iterador de peces
        it3 = map(lambda p: self[p], it2)
        return it3

    __iter__ = __iter__1
    #__iter__ = __iter__2

    def __str__(self):
        # Iterador de caràcters, per cada posició
        it1 = map(lambda v: str(v) if v != 'Buida' else ' ', self)
        # Enumerem els elements per tractar-los de 8 en 8
        it2 = enumerate(it1)
        # Afegim separadors
        it3 = map(lambda z: ('' if z[0] % 8 != 0 else '\n|') + z[1] + '|', it2)
        # Concatenem les caselles
        r = ''.join(it3)
        return r[1:]
