D (322 chars) - For each unsolved square it builds an array of available options and then loops over it. import std.algorithm,std.range,std.stdio;void main(char[][]args){T s(T)(T p){foreach(i,ref c;p)if(c<49){foreach(o;"123456789".setDifference(chain(p[i/9*9..i/9*9+9],p[i%9..$].stride(9),p[i/27*27+i%9/3*3..$][0..21].chunks(3).stride(3).joiner).array.sort)){c=o&63;if(s(p))return p;}c=48;return[];}return p;}s(args[1]).write;} with whitespace: import std.algorithm, std.range, std.stdio; void main(char[][] args) { T s(T)(T p) { foreach (i, ref c; p) if (c < 49) { foreach (o; "123456789".setDifference(chain( p[i/9*9..i/9*9+9], p[i%9..$].stride(9), p[i/27*27+i%9/3*3..$][0..21].chunks(3).stride(3).joiner ).array.sort)) { c = o&63; if (s(p)) return p; } c=48; return []; } return p; } s(args[1]).write; }