speter wrote:Thanks very much, everyone.
I've updated my program's (single chain / simple colouring) rule 4 so it would remove r1c8, r3c1 & r9c8 and set r3c9=9.
Why would you do that? Only the first elimination is valid for the one and only Simple Coloring move you have available here. The others happen as a direct result of it (through a hidden single move). You can no longer call your move standard Simple Coloring if you mix other effects into it. The same is true if you view it as an X-Chain (a 2-String Kite in this case), which I think is preferable anyway. Only the first elimination (r1c8) is part of the move, and everything else happens after it's actually performed.
If you want to set r3c9=9 in one move, you could use a Discontinuous X-Cycle:
(9)r3c9 = r8c9 - r8c2 = r1c2 - r1c8 = (9)r3c9 => 9r3c9
...which *then* eliminates 9 from r1c8 and r8c9.
Or, if you want to eliminate 9s from both r1c8 and r3c1 in one move, you could use a Skyscraper (another named X-Chain pattern) which is not available in Andrew's solver:
(9)r1c1 = r8c2 - r8c9 = (9)r3c2 => -9 r1c8, r3c1
...either of which *then* sets r3c9=9 through a Hidden Single move.
In this case, the end result is the same through any of these moves (Simple Coloring, X-Chain::2-String Kite, X-Chain::Skyscraper, either kind of Discontinuous X-Cycle).
Personally I'd discard Simple Coloring and discontinuous X-Cycles altogether. X-Chains and their truly looping variants (== continuous X-Cycles) are all you really need to implement for your program, as far as these kinds of single-digit techniques go. Everything else is just unnecessary and confusing clutter.
PS. If you're really interested in a more powerful single-digit coloring technique, try X-Colors:
http://www.sudoku9981.com/sudoku-solving/x-colors.phpJust don't call those moves Simple Coloring