cds201/av_sudoku.py
2025-11-27 09:24:57 +01:00

110 lines
3.3 KiB
Python

# ++++++++++++++++++++++++++++++++++++++++++++++
# +++++++++++++ Überprüfung Sudoku +++++++++++++
# ++++++++++++++++++++++++++++++++++++++++++++++
sudoku1 = [
[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]
]
sudoku2 = [
[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,5,1,4,2,3],
[4,2,6,8,6,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 = sudoku1 # einfacher Switch, damit zwischen sudoku1 und sudoku2 umgestellt werden kann ohne Codeanpassungen
# REMARK: wir arbeiten im ersten Teil mit assert(). Wenn assert True ist, wird einfach weiter gegangen, wenn es falsch
# ist, wird ein Error geworfen. Dash heisst, wenn unser Code mit dem assert() jeweils durch läuft ist alles i.O.!
# Wir werden zu Beginn einfache, unabhängige Überprüfungen schreiben. Haben wir alle zusammen, packen wir diese in
# eine Funktion, welche unsere Sudoku überprüfen wird.
# ASSERTIONS
# ++++++++++
# 1a. Überprüfung, ob alle Werte eingetragen sind -> keine None, keine Lücken etc -> 81 integer Werte
# Auftrag: Schreibt das Sudoku in eine 'flache' Liste (nicht verschachtelt) und checkt, ob diese 81 Elemente enthält
single_row_sudoku_list = []
for row in sudoku:
single_row_sudoku_list.extend(row)
assert(len(single_row_sudoku_list) == 81)
# 1b. Auftrag: Checkt, ob 9 Zeilen und 9 Spalten vorliegen.
try:
assert(len(sudoku) == 9)
except AssertionError:
print("Assert error")
for row in sudoku:
assert(len(row) == 9)
# 2. Auftrag: Checkt, ob alles integer_Werte sind -> EXKURS: list comprehension
try:
for val in single_row_sudoku_list:
assert(isinstance(val, int)), f"{val!r} is not int"
except AssertionError as error:
print(error)
# 3. Auftrag: Summe in jeder Zeile muss 1+2+3+...+9 = 45 geben. Checkt dies.
try:
for row in sudoku:
assert(sum(row) == 45), f"Sum of {row!r} is not 45"
except AssertionError as error:
print(error)
# 4. Auftrag: Summe in jeder Spalte muss ebenfalls 45 ergeben. Checkt dies auch. Nutzt für das ein Dictionary also
# Container, also z.B. {1: 45, 2: 45, 3: 45, ... 9: 45}
sum_columns = {}
for row in sudoku:
for idx, element in enumerate(row):
idx = str(idx)
if idx in sum_columns:
sum_columns[idx] += element
else:
sum_columns[idx] = element
print(sum_columns)
# Reichen diese ASSERTIONS für die sichere Bestimmung, ob das Sudoku richtig gelöst wurde?
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Wir überprüfen nun, ob in allen Zeilen, Spalten und Blocks alle valid_number=[1,2,3,4,5,6,7,8,9] vorkommen.
# 5. Auftrag: Zeilenüberprüfung:
valid_number = [1, 2, 3, 4, 5, 6, 7, 8, 9]
for row in sudoku:
# assert(sorted(row) == valid_number)
for element in valid_number:
assert(element in row)
# 6. Auftrag: Spaltenüberprüfung:
# 7. Auftrag: Blocküberprüfung:
# Wir bauen nun die Code-Stücke aus 5-7 in eine Funktion 'check_sudoku_1()', welche als Argument die sudoku-Liste bekommt
# und als Resultat True oder False zurückgeben sollte.
# 8. Baut diese Funktion und ruft sie auf