110 lines
3.3 KiB
Python
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 |