use integer;@A=split//,<>;sub R{for$i(0..80){next if$A[$i];my%t=map{$_/9==$i/9||$_%9==$i%9||$_/27==$i/27&&$_%9/3==$i%9/3?$A[$_]:0=>1}0..80;R($A[$i]=$_)for grep{!$t{$_}}1..9;return$A[$i]=0}die@A}R #### * Original Eccles & Toad solution (slightly modified) * Mark Byers reduced it to 187 bytes * Gordon McCreight reduced it to 186 bytes * Pablo Carbonell reduced it to 181 bytes * Simon Stroh changed @A=split//,<> to $/=\1;@A=<> to reduce the program to 179 bytes * Mitsuru Kariya changed @A[map{ ... }] to map@A[ ... ] to reduce the program to 178 bytes * Ton Hospel shortened the program to 121 bytes #### $_=$`.$_.$'.<>;split//;${/[@_[map{$i-($i="@-")%9+$_,9*$_+$i%9,9*$_%26+$i-$i%27+$i%9-$i%3}0..8]]/o||do$0}for/0/||print..9 #### $_=$`.$_.$'.<>;split//;map{/[@_[map{$i-($i="@-")%9+$_,9*$_+$i%9,9*$_%26+$i-$i%27+$i%9-$i%3}0..8]]/o||do$0}/0/||print..9