In en uitvoer

Hieronder even een samenvatting van de vorige stap, met de functies die we nodig heben voor het oplossen van de puzzel


In [1]:
KOLOMMEN = 4
TEKENS = ['1','2','3','4']

def print_sudoku(sudoku):
    for i, s in enumerate(sudoku):
        s = str(s).center(24)
        if ( (i+1) % KOLOMMEN) == 0:
            print(s)
        else:
            print(s,end='')
            

def lees_sudoku(invoer):
    toegestane_invoer = TEKENS + ['.'] 
    
    # filteren
    gefilterd = [teken for teken in invoer if teken in toegestane_invoer]
    
    # vervangen . voor alle tekens, en omzetten naar set
    sudoku = [set(TEKENS) if teken == '.' else set(teken) for teken in gefilterd]

    return(sudoku)

In [2]:
invoer = """
3 . | 4 . 
. 1 | . 3
----+----
2 3 | . .
1 . | . 2
"""
sudoku = lees_sudoku(invoer)
print_sudoku(sudoku)


         {'3'}            {'2', '4', '3', '1'}           {'4'}            {'2', '4', '3', '1'}  
  {'2', '4', '3', '1'}           {'1'}            {'2', '4', '3', '1'}           {'3'}          
         {'2'}                   {'3'}            {'2', '4', '3', '1'}    {'2', '4', '3', '1'}  
         {'1'}            {'2', '4', '3', '1'}    {'2', '4', '3', '1'}           {'2'}          

De regels van een sudoku


In [3]:
rijen = """
AAAA
BBBB
CCCC
DDDD
"""
rijen = list(rijen.replace("\n", ""))

In [4]:
rij = """
1111
2222
3333
4444
"""
rij = list(rij.replace("\n", ""))

kolom = """
ABCD
ABCD
ABCD
ABCD
"""
kolom = list(kolom.replace("\n", ""))

blok = """
wwxx
wwxx
yyzz
yyzz
"""
blok = list(blok.replace("\n", ""))


for r,c,b,s in zip(rij,kolom,blok,sudoku):
    print(r,c,b,s)


1 A w {'3'}
1 B w {'2', '4', '3', '1'}
1 C x {'4'}
1 D x {'2', '4', '3', '1'}
2 A w {'2', '4', '3', '1'}
2 B w {'1'}
2 C x {'2', '4', '3', '1'}
2 D x {'3'}
3 A y {'2'}
3 B y {'3'}
3 C z {'2', '4', '3', '1'}
3 D z {'2', '4', '3', '1'}
4 A y {'1'}
4 B y {'2', '4', '3', '1'}
4 C z {'2', '4', '3', '1'}
4 D z {'2'}

Toepassen van de regels

Bij ieder element in de sudoku waar meer dan 1 optie staat, willen we wegstrepen wat niet mag


In [5]:
print(sudoku[1])
rij[1]


{'2', '4', '3', '1'}
Out[5]:
'1'

In [6]:
[s for s, r in zip(sudoku, rij) if r == rij[1]]


Out[6]:
[{'3'}, {'1', '2', '3', '4'}, {'4'}, {'1', '2', '3', '4'}]

In [7]:
for s, r in zip(sudoku, rij):
    if r == rij[1] and len(s) == 1:
        sudoku[1] -= s
sudoku[1]


Out[7]:
{'1', '2'}

In [8]:
for s1, r1, c1 ,b1 in zip(sudoku,rij,kolom,blok):
    if len(s1) == 1:
        continue

    for s2, r2, c2 ,b2 in zip(sudoku,rij,kolom,blok):
        if s1 is s2:
            continue

        if len(s2) == 1:
            if r1 == r2 or c1 == c2 or b1 == b2:
                s1 -= s2

print_sudoku(sudoku)


         {'3'}                   {'2'}                   {'4'}                   {'1'}          
         {'4'}                   {'1'}                   {'2'}                   {'3'}          
         {'2'}                   {'3'}                   {'1'}                   {'4'}          
         {'1'}                   {'4'}                   {'3'}                   {'2'}          

En dan zelf proberen:


In [ ]: