#!/usr/bin/tclsh set allpuz { { {/,11/,21/,/,10/,10/,/,/} {/11,0,0,/9,0,0,21/,8/} {/3,0,0,7/18,0,0,0,0} {/11,0,0,0,0,6/9,0,0} {/,5/8,0,0,8/7,0,0,10/} {/5,0,0,9/10,0,0,0,0} {/13,0,0,0,0,/10,0,0} {/,/,/9,0,0,/3,0,0} } { {/,13/,11/,8/,/,/,8/,6/} {/9,0,0,0,/,7/9,0,0} {/14,0,0,0,10/6,0,0,0} {/8,0,0,15/10,0,0,13/,/} {/,/17,0,0,0,0,0,15/} {/,6/,8/5,0,0,5/7,0,0} {/14,0,0,0,/9,0,0,0} {/6,0,0,/,/11,0,0,0} } { {/,9/,21/,/,13/,5/,/,/} {/8,0,0,15/10,0,0,21/,/} {/21,0,0,0,0,0,0,8/} {/,3/7,0,0,0,10/8,0,0} {/11,0,0,0,9/10,0,0,0} {/7,0,0,9/7,0,0,0,3/} {/,/21,0,0,0,0,0,0} {/,/,/9,0,0,/7,0,0} } { {/,4/,8/,/,11/,6/,17/,/} {/3,0,0,7/11,0,0,0,/} {/21,0,0,0,0,0,0,3/} {/,11/,14/5,0,0,12/6,0,0} {/10,0,0,0,13/9,0,0,0} {/10,0,0,9/9,0,0,7/,4/} {/,/21,0,0,0,0,0,0} {/,/14,0,0,0,/7,0,0} } { {/,7/,11/,/,/,/,10/,13/} {/11,0,0,18/,/,15/8,0,0} {/9,0,0,0,9/7,0,0,0} {/,/,10/15,0,0,0,0,0} {/,14/20,0,0,0,0,0,/} {/18,0,0,0,0,0,7/,9/} {/9,0,0,0,/10,0,0,0} {/9,0,0,/,/,/7,0,0} } { {/,13/,9/,/,/,/,10/,8/} {/6,0,0,/,18/,10/4,0,0} {/11,0,0,18/15,0,0,0,0} {/21,0,0,0,0,0,0,/} {/,/,8/11,0,0,0,9/,11/} {/,10/21,0,0,0,0,0,0} {/15,0,0,0,0,/8,0,0} {/7,0,0,/,/,/5,0,0} } } set dirs { { 1 0 } { 0 1 } } proc rcget { puz r c } { if { $r >= 8 || $c >= 8 } { return -1 } set row [lindex $puz $r] return [lindex [split $row ,] $c] } proc search { puz } { global dirs #puts "search $puz" foreach val { 0 1 2 3 4 5 6 } { set counts($val) 0 } set zeros 0 for { set rno 0 } { $rno < 8 } { incr rno } { for { set cno 0 } { $cno < 8 } { incr cno } { set val [rcget $puz $rno $cno] if { ![regexp / $val] } { if { $val } { if { [incr counts($val)] > 6 } { #puts "global number count exceeded" return 0 } } else { incr zeros } } else { set totals [split $val /] for { set i 0 } { $i < 2 } { incr i } { if { ![string length [lindex $totals $i]] } { continue } foreach val { 0 1 2 3 4 5 6 } { set counts2($val) 0 } set rno2 $rno set cno2 $cno set total2 0 set zeros2 0 while { 1 } { set rno2 [expr "$rno2 + [lindex [lindex $dirs $i] 0]"] set cno2 [expr "$cno2 + [lindex [lindex $dirs $i] 1]"] set val2 [rcget $puz $rno2 $cno2] if { [regexp {[/-]} $val2] } { break } if { $val2 } { if { [incr counts2($val2)] > 1} { #puts "duplicate values in row" return 0 } } else { incr zeros2 } if { [incr total2 $val2] > [lindex $totals $i] } { #puts "partial row total exceeds total" return 0 } } if { $zeros2 == 0 && $total2 != [lindex $totals $i] } { #puts "complete row total incorrect" return 0 } } } } } if { $zeros == 0 } { printpuz $puz return 1 } for { set rno 0 } { $rno < 8 } { incr rno } { set row [lindex $puz $rno] for { set cno 0 } { $cno < 8 } { incr cno } { set val [rcget $puz $rno $cno] if { [string equal $val 0] } { set vals [split $row ,] foreach val { 1 2 3 4 5 6 } { set vals [lreplace $vals $cno $cno $val] if { [search [lreplace $puz $rno $rno [join $vals ,]]] } { return 1 } } return 0 } } } } proc printpuz { p } { for { set r 0 } { $r < 8 } { incr r } { set row [split [lindex $p $r] ,] for { set c 0 } { $c < 8 } { incr c } { puts -nonewline [format "%-6s" [regsub {/} [lindex $row $c] {\\}]] } puts "" } puts "" } foreach puz $allpuz { # printpuz $puz search $puz }