anchor.diff:                          suffixes)))))
     (mapcar #'cdr (possibilities-padded (1+ size) constraint))) ; remove initial padding
   
  +(defun get-complete-runs (line end)
  +  (let (runs (run-size 0))
  +    (dolist (cell (subseq line 0 end))
  +      (ecase cell
  +        (:black
  +         (incf run-size))
  +        (:white
  +         (when (plusp run-size)
  +           (push run-size runs)
  +           (setf run-size 0)))
  +        (:unknown
  +         (error "Can only call get-complete-runs on known lines"))))
  +    (if (< end (length line))
  +        (when (eql :white (nth end line))
  +          (push run-size runs))
  +        (push run-size runs))
  +    (nreverse runs)))
  +
  +(defun constraint-match-prefix-p (line constraint end)
  +  (let ((runs (get-complete-runs line end)))
  +    (and (>= (length constraint) (length runs))
  +         (equal (subseq constraint 0 (length runs))
  +                runs))))
  +
   (defun constraint-match-p (line constraint)
     (equal
      constraint
  
positive.code:   (and (puzzle-ok-p puzzle) puzzle))
  
  (defmethod print-object ((puzzle puzzle) stream)
    (loop repeat (1- (* 2 (width puzzle)))
       do (princ #\- stream))
    (terpri stream)
  
negative.code:                    for j below (width puzzle)
                     for cell in candidate
                     do (setf (aref (cells puzzle) row j) cell))
               if (and (puzzle-prefix-ok-p puzzle (1+ row))
                       (solve-aux (1+ row)))
               do (return-from solve-aux puzzle))
            (loop for j below (width puzzle)
               for cell in original-row
  