# ++++++++++++++++++++++++++++++++++++++++++++++ # +++++++++++++ Ü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