#sudoku 9*9
# the sudoku list will contain sub-lists which contain rows in the form [[row 1], [row 2],..,[row 9]]
sud= [ ]
# creating the array
for i in range ( 9 ) :
sud.append ( [ ] )
for k in range ( 9 ) :
sud[ i] .append ( '#' )
h= 0
while True :
a= raw_input ( 'Give me the known in exactly this form say for row 1: 1##2#7### , type done when you finish. \n >>>' )
if a.lower ( ) == 'done' :
break
try :
for i, j in enumerate ( a) :
if j != '#' :
sud[ h] [ i] = int ( a[ i] )
except :
print ' wrong format , type like 1,2=5'
h+= 1
#printing the sudoku table
row= range ( 9 )
colmn= range ( 9 )
def prt_sud( ) :
for i in range ( 9 ) :
print ''
if i in [ 0 , 3 , 6 ] :
print '|-------|-------|-------|'
for k in range ( 9 ) :
if k in [ 0 , 3 , 6 ] :
print '|' ,
print sud[ i] [ k] ,
if k== 8 :
print '|' ,
if i == 8 :
print '\n |-------|-------|-------|' ,
#the given sudoku
print '_____(The Given sudoku)_____'
prt_sud( )
print '\n ' , '_____________________________'
def row_pos( ) :
#calculating numbers exist in each row
for i in range ( 9 ) :
row[ i] = [ ]
for j in range ( 9 ) :
if sud[ i] [ j] == '#' or type ( sud[ i] [ j] ) == list :
pass
else :
row[ i] .append ( sud[ i] [ j] )
return row
def col_pos( ) :
# calculating the numbers exist in each column
for i in range ( 9 ) :
colmn[ i] = [ ]
for j in range ( 9 ) :
if sud[ j] [ i] == '#' or type ( sud[ j] [ i] ) == list :
pass
else :
colmn[ i] .append ( sud[ j] [ i] )
return colmn
def rc_poss( ) :
# calculating possisbilities for each cell by looking in the corresponding row and colomn
for i in range ( 9 ) :
for j in range ( 9 ) :
a= 0
if type ( sud[ i] [ j] ) == list :
sud[ i] [ j] = '#'
if sud[ i] [ j] != '#' :
continue
else :
sud[ i] [ j] = [ ]
a= col_pos( ) [ j] +row_pos( ) [ i]
for l in range ( 1 , 10 ) :
if l in a:
continue
else :
sud[ i] [ j] .append ( l)
return chk_list( )
def chk_list( ) :
count= 0
cntint= 0
#chek for elements in sud that are lists of 1 possisbility convert them into int.
for i in range ( 9 ) :
for j in range ( 9 ) :
if type ( sud[ i] [ j] ) == list :
if len ( sud[ i] [ j] ) == 1 :
sud[ i] [ j] = sud[ i] [ j] [ 0 ]
count+= 1
if count> 0 :
return True
else : return False
def end( ) :
cntint= 0
for i in sud:
for j in i:
if type ( j) == int :
cntint+= 1
if cntint == 81 :
return -1
def sud_square( ) :
sud_s= range ( 9 )
for i in range ( 9 ) :
sud_s[ i] = [ ]
for j in range ( 3 ) :
for k in range ( 3 ) :
sud_s[ i] .append ( sud[ j+( i/3 ) *3 ] [ k+( i%3 ) *3 ] )
return sud_s
def sudsubsqr_search( ) :
for i in range ( 9 ) :
for j in range ( 9 ) :
if type ( sud[ i] [ j] ) == int :
continue
for l in sud[ i] [ j] :
for k in range ( 1 , 9 ) :
if ( i%3 ) *3 +( j%3 ) +k > 8 :
if l== sud_square( ) [ ( i/3 ) *3 +j/3 ] [ ( i%3 ) *3 +( j%3 ) +k-8 ] :
sud[ i] [ j] .remove ( l)
return chk_list( )
else :
if l== sud_square( ) [ ( i/3 ) *3 +j/3 ] [ ( i%3 ) *3 +( j%3 ) +k] :
sud[ i] [ j] .remove ( l)
return chk_list( )
def solve_sud( ) :
while True :
while rc_poss( ) :
if end( ) == -1 :
print 'Vola!'
return prt_sud( )
else :
while not sudsubsqr_search( ) :
if end( ) == -1 :
print 'Vola!'
return prt_sud( )
else :
if end( ) == -1 :
print 'Vola!'
return prt_sud( )
solve_sud( )
I3N1ZG9rdSA5KjkKIyB0aGUgc3Vkb2t1IGxpc3Qgd2lsbCBjb250YWluIHN1Yi1saXN0cyB3aGljaCBjb250YWluIHJvd3MgaW4gdGhlIGZvcm0gW1tyb3cgMV0sIFtyb3cgMl0sLi4sW3JvdyA5XV0Kc3VkPVtdCiMgY3JlYXRpbmcgdGhlIGFycmF5CmZvciBpIGluIHJhbmdlKDkpOgoJc3VkLmFwcGVuZChbXSkKCWZvciBrIGluIHJhbmdlKDkpOgoJCXN1ZFtpXS5hcHBlbmQoJyMnKQpoPTAKd2hpbGUgVHJ1ZToKCWE9cmF3X2lucHV0KCdHaXZlIG1lIHRoZSBrbm93biBpbiBleGFjdGx5IHRoaXMgZm9ybSAgc2F5IGZvciByb3cgMTogMSMjMiM3IyMjICwgdHlwZSBkb25lIHdoZW4geW91IGZpbmlzaC4gXG4gPj4+JykKCWlmIGEubG93ZXIoKT09J2RvbmUnOgoJCWJyZWFrCgl0cnk6CgkJZm9yIGksaiBpbiBlbnVtZXJhdGUoYSk6CgkJCWlmIGogIT0nIyc6CgkJCQlzdWRbaF1baV09aW50KGFbaV0pCgoJZXhjZXB0OgoJCXByaW50JyB3cm9uZyBmb3JtYXQgLCB0eXBlIGxpa2UgMSwyPTUnCgloKz0xCiNwcmludGluZyB0aGUgc3Vkb2t1IHRhYmxlCnJvdz1yYW5nZSg5KQpjb2xtbj1yYW5nZSg5KQpkZWYgcHJ0X3N1ZCgpOgoJZm9yIGkgaW4gcmFuZ2UoOSk6CgkJcHJpbnQgJycKCQlpZiBpIGluIFswLDMsNl06CgkJCXByaW50J3wtLS0tLS0tfC0tLS0tLS18LS0tLS0tLXwnCgkJZm9yIGsgaW4gcmFuZ2UoOSk6CgkJCWlmIGsgaW4gWzAsMyw2XToKCQkJCXByaW50ICd8JywKCQkJcHJpbnQgc3VkW2ldW2tdLAoJCQlpZiBrPT04OgoJCQkJcHJpbnQgJ3wnLAoJCWlmIGkgPT04OgoJCQlwcmludCAnXG58LS0tLS0tLXwtLS0tLS0tfC0tLS0tLS18JywKI3RoZSBnaXZlbiBzdWRva3UKcHJpbnQgJ19fX19fKFRoZSBHaXZlbiBzdWRva3UpX19fX18nCnBydF9zdWQoKQpwcmludCAnXG4nLCdfX19fX19fX19fX19fX19fX19fX19fX19fX19fXycKZGVmIHJvd19wb3MoKToKCSNjYWxjdWxhdGluZyBudW1iZXJzIGV4aXN0IGluIGVhY2ggcm93Cglmb3IgaSBpbiByYW5nZSAoOSk6CgkJcm93W2ldPVtdCgkJZm9yIGogaW4gcmFuZ2UoOSk6CgkJCWlmIHN1ZFtpXVtqXT09JyMnIG9yIHR5cGUoc3VkW2ldW2pdKT09IGxpc3Q6CgoJCQkJcGFzcwoJCQllbHNlOgoJCQkJcm93W2ldLmFwcGVuZChzdWRbaV1bal0pCgoJcmV0dXJuIHJvdwpkZWYgY29sX3BvcygpOgoJIyBjYWxjdWxhdGluZyB0aGUgbnVtYmVycyBleGlzdCBpbiBlYWNoIGNvbHVtbgoJZm9yIGkgaW4gcmFuZ2UoOSk6CgkJY29sbW5baV09W10KCQlmb3IgaiBpbiByYW5nZSg5KToKCQkJaWYgc3VkW2pdW2ldPT0nIydvciB0eXBlKHN1ZFtqXVtpXSk9PSBsaXN0OgoKCQkJCXBhc3MKCQkJZWxzZToKCQkJCWNvbG1uW2ldLmFwcGVuZChzdWRbal1baV0pCgoJcmV0dXJuIGNvbG1uCmRlZiByY19wb3NzKCk6CgkjIGNhbGN1bGF0aW5nIHBvc3Npc2JpbGl0aWVzIGZvciBlYWNoIGNlbGwgYnkgbG9va2luZyBpbiB0aGUgY29ycmVzcG9uZGluZyByb3cgYW5kIGNvbG9tbgoJZm9yIGkgaW4gcmFuZ2UoOSk6CgkJZm9yIGogaW4gcmFuZ2UoOSk6CgkJCWE9MAoJCQlpZiB0eXBlKHN1ZFtpXVtqXSk9PWxpc3Q6CgkJCQlzdWRbaV1bal09JyMnCgkJCWlmIHN1ZFtpXVtqXSE9JyMnICA6CgkJCQljb250aW51ZQoJCQllbHNlOgoJCQkJc3VkW2ldW2pdPVtdCgkJCQlhPWNvbF9wb3MoKVtqXStyb3dfcG9zKClbaV0KCQkJCWZvciBsIGluIHJhbmdlICgxLDEwKToKCQkJCQlpZiBsIGluIGE6CgkJCQkJCWNvbnRpbnVlCgkJCQkJZWxzZToKCQkJCQkJc3VkW2ldW2pdLmFwcGVuZChsKQoKCXJldHVybiBjaGtfbGlzdCgpCmRlZiBjaGtfbGlzdCgpOgoJY291bnQ9MAoJY250aW50PTAKCSNjaGVrIGZvciBlbGVtZW50cyBpbiBzdWQgdGhhdCBhcmUgbGlzdHMgb2YgMSBwb3NzaXNiaWxpdHkgY29udmVydCB0aGVtIGludG8gaW50LgoJZm9yIGkgaW4gcmFuZ2UoOSk6CgkJZm9yIGogaW4gcmFuZ2UoOSk6CgkJCWlmIHR5cGUoc3VkW2ldW2pdKT09bGlzdDoKCQkJCWlmIGxlbihzdWRbaV1bal0pPT0xOgoJCQkJCXN1ZFtpXVtqXT1zdWRbaV1bal1bMF0KCQkJCQljb3VudCs9MQoJaWYgY291bnQ+MDoKCQlyZXR1cm4gVHJ1ZQoJZWxzZTogcmV0dXJuIEZhbHNlCmRlZiBlbmQoKToKCWNudGludD0wCglmb3IgaSBpbiBzdWQ6CgkJZm9yIGogaW4gaToKCQkJaWYgdHlwZShqKT09IGludDoKCQkJCWNudGludCs9MQoJaWYgY250aW50ID09IDgxOgoJCXJldHVybiAtMQpkZWYgc3VkX3NxdWFyZSgpOgoJc3VkX3M9cmFuZ2UoOSkKCWZvciBpIGluIHJhbmdlKDkpOgoJCXN1ZF9zW2ldPVtdCgkJZm9yIGogaW4gcmFuZ2UoMyk6CgkJCWZvciBrIGluIHJhbmdlKDMpOgoJCQkJc3VkX3NbaV0uYXBwZW5kKHN1ZFtqKyhpLzMpKjNdW2srKGklMykqM10pCglyZXR1cm4gc3VkX3MKZGVmIHN1ZHN1YnNxcl9zZWFyY2goKToKCWZvciBpIGluIHJhbmdlKDkpOgoJCWZvciBqIGluIHJhbmdlKDkpOgoJCQlpZiB0eXBlKHN1ZFtpXVtqXSk9PWludDoKCQkJCWNvbnRpbnVlCgkJCWZvciBsIGluIHN1ZFtpXVtqXToKCQkJCWZvciBrIGluIHJhbmdlKDEsOSk6CgkJCQkJaWYgKGklMykqMysoaiUzKStrID44OgoJCQkJCQlpZiBsPT1zdWRfc3F1YXJlKClbKGkvMykqMytqLzNdWyhpJTMpKjMrKGolMykray04XToKCQkJCQkJCXN1ZFtpXVtqXS5yZW1vdmUobCkKCQkJCQkJCXJldHVybiBjaGtfbGlzdCgpCgoJCQkJCWVsc2U6CgkJCQkJCWlmIGw9PXN1ZF9zcXVhcmUoKVsoaS8zKSozK2ovM11bKGklMykqMysoaiUzKStrXToKCQkJCQkJCXN1ZFtpXVtqXS5yZW1vdmUobCkKCQkJCQkJCXJldHVybiBjaGtfbGlzdCgpCmRlZiBzb2x2ZV9zdWQoKToKCXdoaWxlIFRydWU6CgkJd2hpbGUgcmNfcG9zcygpOgoJCQlpZiBlbmQoKT09LTE6CgkJCQlwcmludCAnVm9sYSEnCgkJCQlyZXR1cm4gcHJ0X3N1ZCgpCgkJZWxzZToKCQkJd2hpbGUgbm90IHN1ZHN1YnNxcl9zZWFyY2goKToKCQkJCWlmIGVuZCgpPT0tMToKCQkJCQlwcmludCAnVm9sYSEnCgkJCQkJcmV0dXJuIHBydF9zdWQoKQoJCQllbHNlOgoJCQkJaWYgZW5kKCk9PS0xOgoJCQkJCXByaW50ICdWb2xhIScKCQkJCQlyZXR1cm4gcHJ0X3N1ZCgpCnNvbHZlX3N1ZCgpCg==
stdout
Give me the known in exactly this form say for row 1: 1##2#7### , type done when you finish.
>>>Give me the known in exactly this form say for row 1: 1##2#7### , type done when you finish.
>>>Give me the known in exactly this form say for row 1: 1##2#7### , type done when you finish.
>>>Give me the known in exactly this form say for row 1: 1##2#7### , type done when you finish.
>>>Give me the known in exactly this form say for row 1: 1##2#7### , type done when you finish.
>>>Give me the known in exactly this form say for row 1: 1##2#7### , type done when you finish.
>>>Give me the known in exactly this form say for row 1: 1##2#7### , type done when you finish.
>>>Give me the known in exactly this form say for row 1: 1##2#7### , type done when you finish.
>>>Give me the known in exactly this form say for row 1: 1##2#7### , type done when you finish.
>>>Give me the known in exactly this form say for row 1: 1##2#7### , type done when you finish.
>>>_____(The Given sudoku)_____
|-------|-------|-------|
| 9 # 2 | # 7 # | 1 # 6 |
| # 3 7 | 5 # 1 | # 4 # |
| # # 6 | 2 # # | # # 3 |
|-------|-------|-------|
| # # 4 | 8 # # | 3 # # |
| 3 # 5 | # # # | 4 # 1 |
| # # 1 | # # 3 | 7 # # |
|-------|-------|-------|
| 2 # # | # # 5 | 6 # # |
| # 1 # | 6 # 4 | 9 2 # |
| 4 # 3 | # 9 # | 5 # 8 |
|-------|-------|-------|
_____________________________
Vola!
|-------|-------|-------|
| 9 4 2 | 3 7 8 | 1 5 6 |
| 8 3 7 | 5 6 1 | 2 4 9 |
| 1 5 6 | 2 4 9 | 8 7 3 |
|-------|-------|-------|
| 7 2 4 | 8 1 6 | 3 9 5 |
| 3 8 5 | 9 2 7 | 4 6 1 |
| 6 9 1 | 4 5 3 | 7 8 2 |
|-------|-------|-------|
| 2 7 9 | 1 8 5 | 6 3 4 |
| 5 1 8 | 6 3 4 | 9 2 7 |
| 4 6 3 | 7 9 2 | 5 1 8 |
|-------|-------|-------|