; one-swappable array
(define (swappable? xs)
(define (x i) (vector-ref xs i))
(define (swap! i j)
(let ((t (vector-ref xs i)))
(vector-set! xs i
(vector-ref xs j))
(vector-set! xs j t)))
(define (sorted? i j)
(cond ((= i j) #t)
((not (< (x i) (x (+ i 1)))) #f)
(else (sorted? (+ i 1) j))))
(let* ((len (vector-length xs))
(left (let loop ((i 0))
(if (= i (- len 1)) #f
(if (< (x (+ i 1)) (x i)) i
(loop (+ i 1))))))
(right (let loop ((j (- len 1)))
(if (= j 1) #f
(if (< (x j) (x (- j 1))) j
(loop (- j 1)))))))
(if (not (and left right)) #f
(begin
(swap! left right)
(if (sorted? (max (- left 1) 0)
(min (+ right 1) (- len 1)))
(list left right)
#f)))))
(display (swappable? '#(1 2 6 4 5 3 7))) (newline)
(display (swappable? '#(7 6 5 4 3 2 1))) (newline)
(display (swappable? '#(1 2 3 4 5 6 7))) (newline)
(display (swappable? '#(7 2 3 4 5 6 1))) (newline)
(display (swappable? '#(1 2 4 3 5 6 7))) (newline)
(display (swappable? '#(2 7 3 4 5 1 6))) (newline)
OyBvbmUtc3dhcHBhYmxlIGFycmF5CgooZGVmaW5lIChzd2FwcGFibGU/IHhzKQogIChkZWZpbmUgKHggaSkgKHZlY3Rvci1yZWYgeHMgaSkpCiAgKGRlZmluZSAoc3dhcCEgaSBqKQogICAgKGxldCAoKHQgKHZlY3Rvci1yZWYgeHMgaSkpKQogICAgICAodmVjdG9yLXNldCEgeHMgaQogICAgICAgICh2ZWN0b3ItcmVmIHhzIGopKQogICAgICAodmVjdG9yLXNldCEgeHMgaiB0KSkpCiAgKGRlZmluZSAoc29ydGVkPyBpIGopCiAgICAoY29uZCAoKD0gaSBqKSAjdCkKICAgICAgICAgICgobm90ICg8ICh4IGkpICh4ICgrIGkgMSkpKSkgI2YpCiAgICAgICAgICAoZWxzZSAoc29ydGVkPyAoKyBpIDEpIGopKSkpCiAgKGxldCogKChsZW4gKHZlY3Rvci1sZW5ndGggeHMpKQogICAgICAgICAobGVmdCAobGV0IGxvb3AgKChpIDApKQogICAgICAgICAgICAgICAgIChpZiAoPSBpICgtIGxlbiAxKSkgI2YKICAgICAgICAgICAgICAgICAgIChpZiAoPCAoeCAoKyBpIDEpKSAoeCBpKSkgaQogICAgICAgICAgICAgICAgICAgICAobG9vcCAoKyBpIDEpKSkpKSkKICAgICAgICAgKHJpZ2h0IChsZXQgbG9vcCAoKGogKC0gbGVuIDEpKSkKICAgICAgICAgICAgICAgICAgKGlmICg9IGogMSkgI2YKICAgICAgICAgICAgICAgICAgICAoaWYgKDwgKHggaikgKHggKC0gaiAxKSkpIGoKICAgICAgICAgICAgICAgICAgICAgIChsb29wICgtIGogMSkpKSkpKSkKICAgIChpZiAobm90IChhbmQgbGVmdCByaWdodCkpICNmCiAgICAgIChiZWdpbgogICAgICAgIChzd2FwISBsZWZ0IHJpZ2h0KQogICAgICAgIChpZiAoc29ydGVkPyAobWF4ICgtIGxlZnQgMSkgMCkKICAgICAgICAgICAgICAgICAgICAgKG1pbiAoKyByaWdodCAxKSAoLSBsZW4gMSkpKQogICAgICAgICAgICAobGlzdCBsZWZ0IHJpZ2h0KQogICAgICAgICAgICAjZikpKSkpCgooZGlzcGxheSAoc3dhcHBhYmxlPyAnIygxIDIgNiA0IDUgMyA3KSkpIChuZXdsaW5lKQooZGlzcGxheSAoc3dhcHBhYmxlPyAnIyg3IDYgNSA0IDMgMiAxKSkpIChuZXdsaW5lKQooZGlzcGxheSAoc3dhcHBhYmxlPyAnIygxIDIgMyA0IDUgNiA3KSkpIChuZXdsaW5lKQooZGlzcGxheSAoc3dhcHBhYmxlPyAnIyg3IDIgMyA0IDUgNiAxKSkpIChuZXdsaW5lKQooZGlzcGxheSAoc3dhcHBhYmxlPyAnIygxIDIgNCAzIDUgNiA3KSkpIChuZXdsaW5lKQooZGlzcGxheSAoc3dhcHBhYmxlPyAnIygyIDcgMyA0IDUgMSA2KSkpIChuZXdsaW5lKQ==