; matrix search
(define (bsearch lt? x xs)
(let loop ((lo 0) (hi (- (vector-length xs) 1)) (result #f))
(let ((mid (+ lo (quotient (- hi lo) 2))))
(cond ((< hi lo) result)
((lt? x (vector-ref xs mid)) (loop lo (- mid 1) result))
((lt? (vector-ref xs mid) x) (loop (+ mid 1) hi result))
(else (loop lo (- mid 1) mid))))))
(define (vector-row r mat) (vector-ref mat r))
(define (matsearch lt? x mat)
(let ((len (vector-length mat)))
(let loop ((r 0))
(cond ((= r (vector-length mat)) #f)
((bsearch lt? x (vector-row r mat)) =>
(lambda (c) (list r c)))
(else (loop (+ r 1)))))))
(define mat '#(#(2 5 8) #(1 4 7) #(3 6 9)))
(display (matsearch < 8 mat)) (newline)
(display (matsearch < 6 mat)) (newline)
(display (matsearch < 0 mat)) (newline)
OyBtYXRyaXggc2VhcmNoCgooZGVmaW5lIChic2VhcmNoIGx0PyB4IHhzKQogIChsZXQgbG9vcCAoKGxvIDApIChoaSAoLSAodmVjdG9yLWxlbmd0aCB4cykgMSkpIChyZXN1bHQgI2YpKQogICAgKGxldCAoKG1pZCAoKyBsbyAocXVvdGllbnQgKC0gaGkgbG8pIDIpKSkpCiAgICAgIChjb25kICgoPCBoaSBsbykgcmVzdWx0KQogICAgICAgICAgICAoKGx0PyB4ICh2ZWN0b3ItcmVmIHhzIG1pZCkpIChsb29wIGxvICgtIG1pZCAxKSByZXN1bHQpKQogICAgICAgICAgICAoKGx0PyAodmVjdG9yLXJlZiB4cyBtaWQpIHgpIChsb29wICgrIG1pZCAxKSBoaSByZXN1bHQpKQogICAgICAgICAgICAoZWxzZSAobG9vcCBsbyAoLSBtaWQgMSkgbWlkKSkpKSkpCgooZGVmaW5lICh2ZWN0b3Itcm93IHIgbWF0KSAodmVjdG9yLXJlZiBtYXQgcikpCgooZGVmaW5lIChtYXRzZWFyY2ggbHQ/IHggbWF0KQogIChsZXQgKChsZW4gKHZlY3Rvci1sZW5ndGggbWF0KSkpCiAgICAobGV0IGxvb3AgKChyIDApKQogICAgICAoY29uZCAoKD0gciAodmVjdG9yLWxlbmd0aCBtYXQpKSAjZikKICAgICAgICAgICAgKChic2VhcmNoIGx0PyB4ICh2ZWN0b3Itcm93IHIgbWF0KSkgPT4KICAgICAgICAgICAgICAobGFtYmRhIChjKSAobGlzdCByIGMpKSkKICAgICAgICAgICAgKGVsc2UgKGxvb3AgKCsgciAxKSkpKSkpKQoKKGRlZmluZSBtYXQgJyMoIygyIDUgOCkgIygxIDQgNykgIygzIDYgOSkpKQooZGlzcGxheSAobWF0c2VhcmNoIDwgOCBtYXQpKSAobmV3bGluZSkKKGRpc3BsYXkgKG1hdHNlYXJjaCA8IDYgbWF0KSkgKG5ld2xpbmUpCihkaXNwbGF5IChtYXRzZWFyY2ggPCAwIG1hdCkpIChuZXdsaW5lKQ==