shithub: puzzles

Download patch

ref: c5076be383d7630d70666a543306c8f6ee65edb9
parent: c224416c76e41f284b318adc51f08c3ed11de8e2
author: Simon Tatham <anakin@pobox.com>
date: Sun Jun 25 11:20:50 EDT 2023

Keen: fix another misuse of dsf_canonify.

Chris Boyle points out that outline_block_structure has a comment
saying that we're supposed to have picked a square with a boundary to
its left. dsf_canonify no longer guarantees that, but dsf_minimal
does. Switch to using that throughout the function.

'keen --generate 10#12345 --print 5x2' failed an assertion before this
fix, and now doesn't.

--- a/keen.c
+++ b/keen.c
@@ -2257,7 +2257,7 @@
      * Iterate over all the blocks.
      */
     for (i = 0; i < a; i++) {
-	if (dsf_canonify(dsf, i) != i)
+	if (dsf_minimal(dsf, i) != i)
 	    continue;
 
 	/*
@@ -2296,11 +2296,11 @@
 	    tx = x - dy + dx;
 	    ty = y + dx + dy;
 	    nin += (tx >= 0 && tx < w && ty >= 0 && ty < w &&
-		    dsf_canonify(dsf, ty*w+tx) == i);
+		    dsf_minimal(dsf, ty*w+tx) == i);
 	    tx = x - dy;
 	    ty = y + dx;
 	    nin += (tx >= 0 && tx < w && ty >= 0 && ty < w &&
-		    dsf_canonify(dsf, ty*w+tx) == i);
+		    dsf_minimal(dsf, ty*w+tx) == i);
 	    if (nin == 0) {
 		/*
 		 * Turn right.
@@ -2337,9 +2337,9 @@
 	     * somewhere sensible.
 	     */
 	    assert(x >= 0 && x < w && y >= 0 && y < w &&
-		   dsf_canonify(dsf, y*w+x) == i);
+		   dsf_minimal(dsf, y*w+x) == i);
 	    assert(x+dx < 0 || x+dx >= w || y+dy < 0 || y+dy >= w ||
-		   dsf_canonify(dsf, (y+dy)*w+(x+dx)) != i);
+		   dsf_minimal(dsf, (y+dy)*w+(x+dx)) != i);
 
 	    /*
 	     * Record the point we just went past at one end of the