Python. Валидность поля SUDOKU

Все знают SUDOKU.

На входе дают 9 строк. Например

195743862

431865927

876192543

387459216

612387495

549216738

763524189

928671354

254938671

Это построчные наборы цифр.

Необходимо проверить чтобы каждая строка содержала от 1 до 9

Каждый столбец содержал от 1 до 9

И каждый маленький квадратик 3*3 (9 шт) содержал от 1 до 9

Чтобы было все и не повторялось.

Считать циферки можно так:

A=[list(input()) for i in range(9)]

И это уже даже будет списком двухмерным.

Затем можно проверить строки быстро

for i in range(9):

if len(set(A[i]))!=9: print('все плохо :)') #здесь проверка когда еще был одномерный список, но идея должна быть понятна.

но надо еще столбцы проверить, что в принципе легко и самое интересное квадратики. Кто подскажет нерутинные интересные решения?


Еще для теста

295743861

431865927

876192543

387459216

612387495

549216738

763524189

928671354

154938672


На выходе Yes/No (валидное игровое поле или где-то накосячено).


Можно и рутинные, но чтоб не очень сильно :). Предлагайте.


Не знающим - проходите мимо.


flash77779: Привет! Я написал код для задания. Код работает правильно и я везде сделал коменты. Можешь в друзья добавить, чтоб я знал о твоих новых вопросах по программированию?
Аноним: Здравствуйте, помогите пожалуйста с алгеброй, мой юз телеграмма @wertaxxxx

Ответы

Ответ дал: hagadf
2

Для проверки столбцов вы можете использовать простой цикл с вложенным циклом. Внешний цикл будет проходить по всем столбцам, а внутренний цикл будет проходить по всем строкам, и проверять каждый элемент столбца с помощью set.

for j in range(9):

   column = [A[i][j] for i in range(9)]

   if len(set(column)) != 9:

       print("Invalid column")

Для проверки квадратов 3x3 вы можете использовать три цикла, один для каждой строки квадрата, один для каждого столбца квадрата, и один для каждого квадрата.

for i in range(0, 9, 3):

   for j in range(0, 9, 3):

       square = [A[x][y] for x in range(i, i+3) for y in range(j, j+3)]

       if len(set(square)) != 9:

           print("Invalid square")

И если в ходе этих операций не было выведено Invalid column и Invalid square то это валидное поле.


p15: Идея здравая
flash77779: Хороший код, молодец
Ответ дал: flash77779
1

import random

def print_sudoku(sudoku): # вывод судоку на экран

   for i in range(9): # 9 строк судоку

       for j in range(9): # 9 столбцов судоку

           print(sudoku[i][j], end=' ') # вывод значения судоку

       print() # переход на новую строку

def check_sudoku(sudoku, row, col, num): # проверка судоку на правильность

   for i in range(9): # 9 строк судоку

       if sudoku[i][col] == num: # проверка строки

           return False

   for j in range(9): # 9 столбцов судоку

       if sudoku[row][j] == num: # проверка столбца

           return False

   for i in range(3): # 3 строки в квадрате 3x3

       for j in range(3): # 3 столбца в квадрате 3x3

           if sudoku[(row // 3) * 3 + i][(col // 3) * 3 + j] == num: # проверка квадрата 3x3

               return False

   return True

def generate_sudoku(sudoku, row, col): # генерация судоку

   if row == 9: # если все строки судоку заполнены

       return True

   if col == 9: # если все столбцы судоку заполнены

       return generate_sudoku(sudoku, row + 1, 0)

   if sudoku[row][col] != 0: # если ячейка судоку не пустая

       return generate_sudoku(sudoku, row, col + 1)

   for num in range(1, 10): # перебор чисел от 1 до 9

       if check_sudoku(sudoku, row, col, num): # проверка судоку на правильность

           sudoku[row][col] = num # заполнение ячейки судоку

           if generate_sudoku(sudoku, row, col + 1): # генерация судоку

               return True

           sudoku[row][col] = 0 # очистка ячейки судоку

   return False

def main(): # главная функция программы

   sudoku = [[0 for j in range(9)] for i in range(9)] # создание судоку

   generate_sudoku(sudoku, 0, 0) # генерация судоку

   print_sudoku(sudoku) # вывод судоку на экран

if __name__ == '__main__': # проверка на запуск файла

   main() # запуск главной функции программы

Приложения:

p15: import random - зачем? Задача было не о генерации, а о проверке.
Вас заинтересует