# Controleer of de gegeven lijst elk cijfer van 1 tot 9 hoogstens één keer bevat
# Je hoeft niet te controleren of de lijst enkel getallen bevat in het interval [1,9]
def is_correcte_lijst(lijst):
    frequentie = [0] * 10
    for cijfer in lijst:
        frequentie[cijfer] += 1
    for aantal in frequentie:
        if aantal > 1:
            return False
    return True

# kijk of in elke rij elk cijfer hoogstens 1 keer voorkomt
def zijn_correcte_rijen(sudoku):
    for rij in sudoku:
        if not is_correcte_lijst(rij):
            return False
    return True
 
# kijk of in elke kolom elk cijfer hoogstens 1 keer voorkomt
# helaas zijn de kolommen geen lijsten en moeten we meer werk doen
def zijn_correcte_kolommen(sudoku):
    for kolomnummer in range(9):
        kolom = []
        for rijnummer in range(9):
            kolom.append(sudoku[rijnummer][kolomnummer])
        if not is_correcte_lijst(kolom):
            return False
    return True
 

# hulpfunctie: kijk of een 3 x 3 blokje elk cijfer hoogstens één keer bevat
# bijkomende parameters: rij en kolomnummer linksboven
def is_correct_blokje (sudoku, start_rij, start_kolom):
    blokje = []
    for rijnummer in range(start_rij,start_rij + 3):
        for kolomnummer in range(start_kolom, start_kolom + 3):
            blokje.append(sudoku[rijnummer][kolomnummer])
    return is_correcte_lijst(blokje)

# controleer alle blokjes
def zijn_correcte_blokjes (sudoku):
    for start_rij in range (0,9,3):
        for start_kolom in range (0,9,3):
            if not is_correct_blokje(sudoku, start_rij, start_kolom):
                return False
    return True
    

# Controleert of de gegeven 9 x 9 tabel van cijfers voldoet aan de Sudoku-regels
def controleer_sudoku (sudoku):
    fouten = 0
    if not zijn_correcte_rijen(sudoku):
        print("De Sudoku bevat een fout in één van zijn rijen")
        fouten += 1
    if not zijn_correcte_kolommen(sudoku):
        print("De Sudoku bevat een fout in één van zijn kolommen")
        fouten += 1
    if not zijn_correcte_blokjes(sudoku):
        print("De Sudoku bevat een fout in één van zijn blokjes")
        fouten += 1
    if fouten == 0:
        print("De Sudoku is correct")

sudoku_1 = [
    [5, 3, 4, 6, 7, 8, 9, 1, 2],
    [6, 7, 2, 1, 9, 5, 3, 4, 8],
    [1, 9, 8, 3, 4, 2, 5, 6, 7],
    [8, 5, 9, 7, 6, 1, 4, 2, 3],
    [4, 2, 6, 8, 5, 3, 7, 9, 1],
    [7, 1, 3, 9, 2, 4, 8, 5, 6],
    [9, 6, 1, 5, 3, 7, 2, 8, 4],
    [2, 8, 7, 4, 1, 9, 6, 3, 5],
    [3, 4, 5, 2, 8, 6, 1, 7, 9]
]

sudoku_2 = [
    [5, 3, 4, 6, 7, 8, 9, 1, 2],
    [6, 7, 1, 2, 9, 5, 3, 4, 8],
    [1, 9, 8, 3, 4, 2, 5, 6, 7],
    [8, 5, 9, 7, 6, 1, 4, 2, 3],
    [4, 2, 6, 8, 5, 3, 7, 9, 1],
    [7, 1, 3, 9, 2, 4, 8, 5, 6],
    [9, 6, 1, 5, 3, 7, 2, 8, 4],
    [2, 8, 7, 4, 1, 9, 6, 3, 5],
    [3, 4, 5, 2, 8, 6, 1, 7, 9]
]

sudoku_3 = [
    [5, 3, 4, 6, 7, 8, 9, 1, 2],
    [6, 7, 2, 1, 9, 5, 3, 4, 8],
    [1, 9, 8, 3, 4, 2, 5, 6, 7],
    [8, 5, 9, 7, 6, 1, 4, 2, 3],
    [4, 2, 6, 8, 5, 3, 7, 9, 1],
    [7, 1, 3, 9, 2, 4, 8, 5, 6],
    [9, 6, 1, 5, 3, 7, 2, 8, 4],
    [2, 8, 7, 4, 1, 9, 6, 3, 5],
    [3, 4, 5, 2, 8, 6, 1, 7, 8] 
]

sudoku_4 = [
    [5, 3, 4, 6, 7, 8, 9, 1, 2],
    [6, 7, 2, 1, 9, 5, 3, 8, 4],
    [1, 9, 8, 3, 4, 2, 5, 6, 7],
    [8, 5, 9, 7, 6, 1, 4, 2, 3],
    [4, 2, 6, 8, 5, 3, 7, 9, 1],
    [9, 6, 1, 5, 3, 7, 2, 4, 8],
    [7, 1, 3, 9, 2, 4, 8, 5, 6],
    [2, 8, 7, 4, 1, 9, 6, 3, 5],
    [3, 4, 5, 2, 8, 6, 1, 7, 9]
]

sudoku_5 = [
    [4, 3, 5, 2, 6, 9, 7, 8, 1],
    [6, 8, 2, 5, 7, 1, 4, 9, 3],
    [1, 9, 7, 8, 3, 4, 5, 6, 2],
    [8, 2, 6, 1, 9, 5, 3, 4, 7],
    [3, 7, 4, 6, 8, 2, 9, 1, 5],
    [9, 5, 1, 7, 4, 3, 6, 2, 8],
    [5, 1, 9, 3, 2, 6, 8, 7, 4],
    [2, 4, 8, 9, 5, 7, 1, 3, 6],
    [7, 6, 3, 4, 1, 8, 2, 5, 9]
]

controleer_sudoku(sudoku_1)   # correct
print()
controleer_sudoku(sudoku_2)   # kolommen en blokjes zijn fout
print()
controleer_sudoku(sudoku_3)   # drie soorten fouten
print()
controleer_sudoku(sudoku_4)   # blokjes zijn fout, rijen en kolommen zijn correct
print()
controleer_sudoku(sudoku_5)   # correct
print()
