http://qs321.pair.com?node_id=485633

The game of sudoku is basically a 9x9 grid made out of 9 3x3 grids. The rule is quite simple: given the known numbers in the grid, fill in the rest of the numbers between 1 and 9, so that each number only appear once horizontally, virtically and within each of the 3x3 block...

To run the sudoku solver below, start the program, cut and paste the puzzles, the answer will be printed automatically.

$_=q`I=0;while(<>){chomp;next()if((/^\s*#/)or(!$_));_z()unless@o;my@p= +/(\S)/g;for(J=0;$j<9;$j++){_y($i,$j,$p[$j])if($p[$ j]=~/\d/)}if(++$i>8){$i=0;$p=0;while(!_w()){if($p==$c){$p=0;_q()}$p=$c +}_x();undef(@o)}}Zfor(I=0;$i<9;$i++){for(J=0;$j<9; $j + + ) { $ + o [ $ i] [$ j ]= ' 1 2345 6 7 + 8 9'}}$c = 0 }Ymy($ i, $j , $e)= @ _ ;$ o[ $ i + ] [$ j ] =$ e; $c + +; fo r ( F= 0 ; + $ f< 9 ; $f ++ ){ n ex t( ) i f( $ f + = =$ j ) or ($o[ $i ][ $ f]<10);$o[ $ i ][ $ f + ] =~ s / $e// ;i f( $o [ $i ] [ $f ] < + 1 0) { _ y( $i ,$ f, $ o[ $ i ][$f])}}fo r ( + F =0;$f<9; $ f ++){ne xt () i f ( $ f + = = $ i) or($o[$f][$j]<10);$o[$f][$j]=~s/$e//;if($o[$f][$j]<10){_y($f,$j,$o[$f] +[$j])}}A=int($i/3)*3;B=int($j/3)*3;for(F=$a;$f<$a+ 3; $ f + + ) + { f o r( D= $ b ; $ d +<$b+3; $ d++){next( ) i f( ($ f = = $ i )a + nd ( $d = = $j )) o r ( $ o [$ + f] [ $d ] < 10 ); $ o [ $ f +][$d]= ~ s/ $ e // ;i f ( $ o [ $f + ][ $ d] < 1 0) {_ y ( $ f , $d + ,$ o [$ f ] [$ d] ) } } } } +Wretur n (1 ) i f( $c = = 8 1 ) + ; f o r( I=0;$i<9;$i++){for(J=0;$j<9;$j++){next()if($o[$i][$j]<10);forE(split(/ +/,$o[$i][$j])){if((_v($i,$j,$e))or(_u($i,$j,$e))or (_ t ( $ i , + $ j , $e )) ) { _ y($i,$ j , $e +);re t u r n( 1) i f ( $c = = + 81 ) ; l as t} } } } fo r ( + A= 0 ; $ a< 3; $ a + +) { f +or(B = 0 ; $b <3 ; $ b ++ ) { + fo r ( E =1 ;$ e < 1 0; $ e + ++ ) { m y@ p= _ s ( $a*3,$b* 3 , $e +);my @ n = _r ($ a * 3 , $ + b * 3 ,$ e);if((@p==1)and(@n>1)){for(I=0;$i<9;$i++){next()if(($i>=$a*3)and($i<$ +a*3+3))or($o[$i][$p[0]]<10);$o[$i][$p[0]]=~s/$e//; if ( $ o [ $ + i ] [ $p [0 ]]<10) { _y($ i , $ p [0 +],$o[$i] [ $ p [0 ]] ); r et ur n ( 1 ) + if ( $ c == 81 )} } }i f ( ( @ + n= = 1 ) an d( @p > 1) ) { f o + r( J = 0 ;$ j< 9; $ j+ + ) { n +ex t ( ) if (( $j > =$ b * 3 ) +an d ( $ j< $b *3+3))or($ o [$n[0]][$j ] < 1 0 ); + $ o [ $n [0 ] ] [ $ j + ] = ~ s/ $e//;if($o[$n[0]][$j]<10){_y($n[0],$j,$o[$n[0]][$j]);return(1)if($c==8 +1)}}}}}}for(A=0;$a<3;$a++){for(B=0;$b<3;$b++){for( E= 1 ; $ e < + 1 0 ; $e ++ ) { my @ p = + _ s($a*3 , $ b* 3, $ e );my @ n = + _ r( $ a *3 ,$ b * 3, $e ) ; i + f (( @ p == 1) a n d( @n = = 2 + ) ){ for( G = 0; $g < 3 ;$g++){nex t ( ) + i f($b == $ g ); my @ m =_ s ( $ + a *3 ,$ g * 3, $e ) ; my @ l = + _ r($a*3 , $ g* 3, $ e ) ; i + f ( ( @m ==1)and(join('',@n)==join('',@l))){forI(@n){H=3-$b-$g;for(J=$h*3;$j<$h +*3+3;$j++){next()if($o[$i][$j]<10);$o[$i][$j]=~s/$ e/ / ; i f ( + $ o [ $i ][ $ j ] <1 0 ) + { _ y($i,$j,$o [ $i][$j ]) ;r e t u rn(1 ) i + f ( $c = =8 1) }} }} } } e ls if ( ( + @ n == 1 )a nd (@ p= = 2 ) ){ fo r ( + G = 0; $ g<3;$g++ ){ ne x t ( )if($a==$g ) ; + m y @m = _s ($ g* 3 , $ b* 3 , + $ e ); m y@ l= _r ( $ g *3 , $ + b * 3, $ e);if( (@ l= = 1 ) a n + d ( j oi n('',@p)==join('',@m))){forJ(@p){H=3-$a-$g;for(I=$h*3;$i<$h*3+3;$i++){ +next()if($o[$i][$j]<10);$o[$i][$j]=~s/$e//;if($o[$ i] [ $ j ] < + 1 0 ) {_ y( $ i , $j,$o[ $ i ][ +$j]) ; r e tu rn ( 1 ) if ( $ + c= = 8 1 )} }} } } } }} } r + et u r n ($ c= = 8 1 )} V m +y($i , $ j ,$ e) = @ _ ;f o r + (F = 0 ; $f <9 ; $ f ++ ) { + ne x t ( )i f( $ f = =$j);ret u r n( +0)if ( $ o [$ i] [ $ f ] = + ~ / $ e/ )}return(1)}Umy($i,$j,$e)=@_;for(F=0;$f<9;$f++){next()if($f==$i);retur +n(0)if($o[$f][$j]=~/$e/)}return(1)}Tmy($i,$j,$e)=@ _; A = i n t + ( $ i /3 )* 3 ; B=int($j / 3)*3;f o r + ( F = $a ;$ f < $a + 3; $f + + + ) { f or (D = $ b; $ d< $b + 3 + ; $ d ++ ){ n e xt()if ( $f==$i)a n d + ( $ d == $j ) ; re t ur n ( + 0 ) i f( $o [ $ f] [ $d ] = + ~ / $ e/ )} } r eturn( 1 )}Smy( $ i + , $ j ,$ e) = @ _ ; A + = i n t( $i/3)*3;B=int($j/3)*3;my%k;for(F=$a;$f<$a+3;$f++){for(D=$b;$d<$b+3;$d+ ++){$k{$d}++if($o[$f][$d]=~/$e/)}}return(sort(keys( %k ) ) ) } R + m y ( $i ,$ j,$e ) = @_;A=i n t ( + $i/3)* 3 ; B=int($j / 3) *3 ;m y% k ; fo r( F = $ +a; $ f <$ a +3 ;$ f+ + ) {f or ( D = $b + ; $ d< $ b+ 3; $d + + ){$k{$f} + + i f( + $o[$ f ] [$d]=~ / $e /) ;} ; } re t u r n( +so rt ( k ey s (% k) )) } Q sr a n d (t + im e ) ;w h il e( ){F=int(ra n d (9));D = i n +t(rand ( 9 ));nex t () if ( $ o [ $ + f ] [ $d ]<10);E=$o[$f][$d];$e=substr($e,int(rand(length($e))),1);_y($f,$d,$e); +last};}Xfor(my $i=0;$i<9;$i++){print(join(chr(32), @{$o[$i]}),"\n");;}print("\n");};`;s/\s//gx;s/(?<!\\)([Q-Z])/sub _\l$1 +\{/gx;s/([A-J])/my \$\l$1/gx;s/formy/for my/g;eval
Puzzles in the form of:
# Puzzle #1 * 8 * * * * * 4 * * 3 * * * 8 * * * * * 1 * * 2 * 6 3 * * 2 8 4 7 * * 6 * * * * * * * * * 7 * * 2 9 3 5 * * 1 2 * 5 * * 7 * * * * * 3 * * * 1 * * 9 * * * * * 5 * # Puzzle #2 * * * * 1 8 5 * 9 * * 5 4 * * * * * * * 4 * 6 9 * 2 7 7 4 * * * * * * * * 1 * * * * * 5 * * * * * * * * 8 6 5 7 * 6 8 * 4 * * * * * * * 7 6 * * 8 * 3 1 9 * * * * # Puzzle #3 * * * 9 * * * * * * 9 * 2 * * 8 * * 3 8 * * * * 7 * 9 * * * * 4 1 2 * * 9 * * * * * * * 7 * * 4 6 3 * * * * 7 * 2 * * * * 4 5 * * 5 * * 7 * 3 * * * * * * 4 * 7 *