; matrix fill-in
(define (matrix-rows x) (vector-length x))
(define (matrix-cols x) (vector-length (vector-ref x 0)))
(define (matrix-ref m i j) (vector-ref (vector-ref m i) j))
(define (matrix-set! m i j x) (vector-set! (vector-ref m i) j x))
(define-syntax for
(syntax-rules ()
((for (var first past step) body ...)
(let ((ge? (if (< first past) >= <=)))
(do ((var first (+ var step)))
((ge? var past))
body ...)))
((for (var first past) body ...)
(let* ((f first) (p past) (s (if (< first past) 1 -1)))
(for (var f p s) body ...)))
((for (var past) body ...)
(let* ((p past)) (for (var 0 p) body ...)))))
(define (fill-in m)
(let ((nrows (matrix-rows m))
(ncols (matrix-cols m))
(xs (list)))
(for (r 0 nrows)
(for (c 0 ncols)
(when (= (matrix-ref m r c) 1)
(set! xs (cons (cons r c) xs)))))
(let loop ((xs xs))
(cond ((null? xs) m)
(else (for (r 0 nrows)
(matrix-set! m r (cdar xs) 1))
(for (c 0 ncols)
(matrix-set! m (caar xs) c 1))
(loop (cdr xs)))))))
(display
(fill-in '#(
#(0 0 0 0 0)
#(0 0 0 0 0)
#(0 0 0 1 0)
#(1 0 0 0 0)
#(0 0 0 0 0))))
OyBtYXRyaXggZmlsbC1pbgoKKGRlZmluZSAobWF0cml4LXJvd3MgeCkgKHZlY3Rvci1sZW5ndGggeCkpCgooZGVmaW5lIChtYXRyaXgtY29scyB4KSAodmVjdG9yLWxlbmd0aCAodmVjdG9yLXJlZiB4IDApKSkKCihkZWZpbmUgKG1hdHJpeC1yZWYgbSBpIGopICh2ZWN0b3ItcmVmICh2ZWN0b3ItcmVmIG0gaSkgaikpCgooZGVmaW5lIChtYXRyaXgtc2V0ISBtIGkgaiB4KSAodmVjdG9yLXNldCEgKHZlY3Rvci1yZWYgbSBpKSBqIHgpKQoKKGRlZmluZS1zeW50YXggZm9yCiAgKHN5bnRheC1ydWxlcyAoKQogICAgKChmb3IgKHZhciBmaXJzdCBwYXN0IHN0ZXApIGJvZHkgLi4uKQogICAgICAobGV0ICgoZ2U/IChpZiAoPCBmaXJzdCBwYXN0KSA+PSA8PSkpKQogICAgICAgIChkbyAoKHZhciBmaXJzdCAoKyB2YXIgc3RlcCkpKQogICAgICAgICAgICAoKGdlPyB2YXIgcGFzdCkpCiAgICAgICAgICBib2R5IC4uLikpKQogICAgKChmb3IgKHZhciBmaXJzdCBwYXN0KSBib2R5IC4uLikKICAgICAgKGxldCogKChmIGZpcnN0KSAocCBwYXN0KSAocyAoaWYgKDwgZmlyc3QgcGFzdCkgMSAtMSkpKQogICAgICAgIChmb3IgKHZhciBmIHAgcykgYm9keSAuLi4pKSkKICAgICgoZm9yICh2YXIgcGFzdCkgYm9keSAuLi4pCiAgICAgIChsZXQqICgocCBwYXN0KSkgKGZvciAodmFyIDAgcCkgYm9keSAuLi4pKSkpKQoKKGRlZmluZSAoZmlsbC1pbiBtKQogIChsZXQgKChucm93cyAobWF0cml4LXJvd3MgbSkpCiAgICAgICAgKG5jb2xzIChtYXRyaXgtY29scyBtKSkKICAgICAgICAoeHMgKGxpc3QpKSkKICAgIChmb3IgKHIgMCBucm93cykKICAgICAgKGZvciAoYyAwIG5jb2xzKQogICAgICAgICh3aGVuICg9IChtYXRyaXgtcmVmIG0gciBjKSAxKQogICAgICAgICAgKHNldCEgeHMgKGNvbnMgKGNvbnMgciBjKSB4cykpKSkpCiAgICAobGV0IGxvb3AgKCh4cyB4cykpCiAgICAgIChjb25kICgobnVsbD8geHMpIG0pCiAgICAgIChlbHNlIChmb3IgKHIgMCBucm93cykKICAgICAgICAgICAgICAobWF0cml4LXNldCEgbSByIChjZGFyIHhzKSAxKSkKICAgICAgICAgICAgKGZvciAoYyAwIG5jb2xzKQogICAgICAgICAgICAgIChtYXRyaXgtc2V0ISBtIChjYWFyIHhzKSBjIDEpKQogICAgICAgICAgICAobG9vcCAoY2RyIHhzKSkpKSkpKQoKKGRpc3BsYXkKICAoZmlsbC1pbiAnIygKICAgICMoMCAwIDAgMCAwKQogICAgIygwIDAgMCAwIDApCiAgICAjKDAgMCAwIDEgMCkKICAgICMoMSAwIDAgMCAwKQogICAgIygwIDAgMCAwIDApKSkp