# Controleer of een Sudoku correct is

# 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_correct_lijst(lijst):
    frequentie = [0]*10
    for element in lijst:
        frequentie[element] += 1
    for aantal in frequentie:
        if aantal > 1:
            return False
    # kan ook met een while met dubbele conditie    
    return True

# kijk of in elke rij elk cijfer hoogstens 1 keer voorkomt
def is_correct_rijen (sudoku):
    for rij in sudoku:
        if not is_correct_lijst (rij):
            return False
    # kan ook met een while met dubbele conditie
    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 is_correct_kolommen(sudoku):
    for kolomnummer in range(9):
        frequentie = [0]*10
        for rijnummer in range(9):
            cijfer = sudoku[rijnummer][kolomnummer]
            frequentie[cijfer] += 1
        for aantal in frequentie:
            if aantal > 1:
                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):
    frequentie = [0]*10
    for r in range(3):         # rijnummer binnen blokje
        for k in range(3):     # kolomnummer binnen blokje       
            cijfer = sudoku[start_rij + r][start_kolom + k]
            frequentie[cijfer] += 1
    for aantal in frequentie:
        if aantal > 1:
            return False
    return True

# controleer alle blokjes
def is_correct_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 is_correct_rijen(sudoku):
        print ("De Sudoku bevat een fout in één van zijn rijen")
        fouten += 1
    if not is_correct_kolommen(sudoku):
        print ("De Sudoku bevat een fout in één van zijn kolommen")
        fouten += 1
    if not is_correct_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()
