Tags: misc programming sudoku 

Rating:

#!/usr/bin/env python3

ifield = 0

sudoku = []

f = open('input.txt', 'r')
while ifield < 36:
    # skip "Field"
    f.readline().strip()

    field = []
    for i in range(6):
        line = f.readline().strip().split(' ')
        field.append(line)
    sudoku.append(field)

    # skip empty line
    f.readline().strip()

    ifield += 1

f.close()


def print_characters():
    for ifield in range(36):
        for y in range(6):
            for x in range(6):
                print(sudoku[ifield][y][x])

# print_characters()
# ./solution.py | sort  | uniq
abc = set([c for c in '_{}0123456abcdefghijklmnopqrstuvwxyz'])


def print_sudoku():
    for ifield in range(36):
        print('Field', ifield)
        for y in range(6):
            for x in range(6):
                print(sudoku[ifield][y][x], end='')
            print()
        print()


stars_are_there = True
while stars_are_there:
    stars_are_there = False
    for ifield in range(36):
        for y in range(6):
            for x in range(6):
                if sudoku[ifield][y][x] == '*':
                    stars_are_there = True

                    # look for possible variants within the same field
                    written = set()
                    for yy in range(6):
                        for xx in range(6):
                            v = sudoku[ifield][yy][xx]
                            if v != '*':
                                written.add(v)
                    available_in_field = abc - written

                    # look for possible variants within the same column
                    written = set()
                    for iifield in range(36):
                        v = sudoku[iifield][y][x]
                        if v != '*':
                            written.add(v)
                    available_in_column = abc - written

                    # print(ifield, y, x, available_in_field, available_in_column)
                    available = available_in_column.intersection(available_in_field)
                    # print(ifield, y, x, available)
                    if len(available) == 1:
                        sudoku[ifield][y][x] = available.pop()

print_sudoku()