#----------------------------------------------------
#   Les fonctions (à compléter ou non)
#   -> vos tests doivent se faire dans le fichier dédié pour plus de lisibilité
#----------------------------------------------------


#-----------------------------------------------------
#          Affichage dans le shell
#-----------------------------------------------------


def affiche_grille(grille):
    """Affiche la grille reçue en paramètre de manière lisible"""

    string = " ---------------------- \n"

    for i in range(len(grille)):
        ligne = "|"
        for j in range(len(grille[i])):
            if grille[i][j] == 0:
                ligne = ligne + "  "
            else:
                ligne = ligne + str(grille[i][j]) + " "
            if j == 2 or j == 5:
                ligne += "| "
        string += ligne + "|\n"
        if i == 2 or i == 5:
            string += " ---------------------- \n"
    string += " ---------------------- \n"

    print(string)

    
#-----------------------------------------------------
#            Tests de validité de la grille
#-----------------------------------------------------

def ligne_complete(L : list, i : int) -> float :
    """Renvoie True si la ligne i du Sudoku L
       est complète et correcte, False sinon"""
    
    # chiffres_trouves[x] vaut True si on a trouvé x
    chiffres_trouves = {}  # dictionnaire
     
    for j in range(9):
        x = L[i][j]
        if x == 0 or x in chiffres_trouves:
            return False
        chiffres_trouves[x] = True
    # Si on termine la boucle for, il n'y a pas de doublon dans les 9 chiffres de la ligne,
    # donc il y a bien une seule fois chaque chiffre de 1 à 9
    return True    

def colonne_complete(L, j):
    """Renvoie True si la colonne j du Sudoku L
       est complète et correcte, False sinon"""
       
    # chiffres_trouves[x] vaut True si on a trouvé x
    chiffres_trouves = {}  # dictionnaire
    
    #-------------- A vous d'écrire la suite  -------------------
    
    return True
    
   

def carre_complet(L, k):
    """Renvoie True si le carré k du Sudoku L est complète et correcte, False sinon"""
    
    # chiffres_trouves[i] contient True si on a trouvé i
    chiffres_trouves = {}
    
    # Coordonnées du coin supérieur gauche du carré numéro k
    icoin = 3*(k//3)
    jcoin = 3*(k%3)
    
    #-------------- A vous d'écrire la suite  -------------------
    



def grille_complete(L):
    """Renvoie True si la grille est complète et correcte, False sinon"""
    #-------------- A vous d'écrire la suite  -------------------


    return True



#-----------------------------------------------------
#            Résolution de la grille
#-----------------------------------------------------

def ligne(L,i):
    """Renvoie la liste des nombres compris entre 1 et 9 sur la ligne d'indice i"""
    chiffres = []
    for j in range(len(L[i])) :
        if L[i][j] != 0 :
            chiffres.append(L[i][j])
    return chiffres

def colonne(L,i):
    """Renvoie la liste des nombres compris entre 1 et 9 sur la colonne d'indice i"""
    chiffres = []
    #-------------- A vous d'écrire la suite  -------------------

    return chiffres


def carre(L, i, j):
    """Renvoie la liste des nombres compris entre 1 et 9 dans le carré auquel appartient la case (i,j)"""
    icoin = 3*(i//3) 
    jcoin = 3*(j//3) 
    chiffres = []
    #-------------- A vous d'écrire la suite  -------------------


    return chiffres



def conflit(L, i, j):
    return ligne(L, i) + colonne(L, j) + carre(L, i, j)


def bons_chiffres(L, i, j):
    """Renvoie la liste des chiffres qu'on peut écrire dans la case (i, j)"""
    ok = []
    pas_ok = conflit(L, i, j)
    for k in range(1, 10):
        #--------- A vous d'écrire la suite -------------
        pass # ne sert à rien mais évite que le code plante tant que vous n'avez pas complété
        
    return ok



def untour(L):
    changement = False
    for i in range(0, 9): 
        for j in range(0, 9): 
            if L[i][j] == 0:
            #--------- A vous d'écrire la suite -------------
                pass # ne sert à rien mais évite que le code plante tant que vous n'avez pas complété
                
                
    return changement 


def resolution(L):
    ''' Resolution du Sudoku par l'algorithme naïf '''
    changement = True
    while changement:
        changement = untour(L)
    return grille_complete(L)
