FWIW, I think I've deciphered how the original version worked. My post above uses backtracing. It builds up a priority queue of possible completions prioritizing the lowest numbered fill for the most completed grid. I.e. it follows a single attempt at a solution until it fails and then tries the next option from the point of failure backing up one step if there are no options left. The original instead builds up the tree of all possible solutions and follows them all simultaneously. As a given branch reaches a dead end, that branch dies and in the end we're left only with the branch that has the solution. Here it is in kona:
x:.:'"200370009009200007001004002050000800008000900006000040900100500800007600400089001"
p,:,_sv[3]'+_(p:+!9 9)%3;
*{,/{@[x;y;:;]'&21=x[&|/p[;y]=p]?/:!10}[;y]'x}/[,x;m]
2 0 0 3 7 0 0 0 9 0 0 9 2 0 0 0 0 7 0 0 1 0 0 4 0 0 2 0 5 0 0 0 0 8 0 0 0 0 8 0 0 0 9 0 0 0 0 6 0 0 0 0 4 0 9 0 0 1 0 0 5 0 0 8 0 0 0 0 7 6 0 0 4 0 0 0 8 9 0 0 1Here we use
!9 9 instead of
_sv[9]'!81 not only because it's shorter, but because we always get two element lists. Anyhow, I wanted to close this loop. Hopefully people find it interesting.