; two boys and a canoe
(define (canoes xs)
(let ((xv (list->vector (sort xs <)))
(len (length xs)))
(define (x i) (vector-ref xv i))
(let loop ((lo 0) (hi (- len 1)) (cs (list)))
(cond ((< hi lo) cs)
((< 150 (x hi))
(loop lo (- hi 1)
(cons (list (x hi) 'toobig) cs)))
((= lo hi) (cons (list (x hi)) cs))
((<= (+ (x lo) (x hi)) 150)
(loop (+ lo 1) (- hi 1)
(cons (list (x lo) (x hi)) cs)))
(else (loop lo (- hi 1)
(cons (list (x hi)) cs)))))))
(define (canoe-count xs)
(length (filter (lambda (c)
(or (null? (cdr c))
(not (equal? (cadr c) 'toobig))))
(canoes xs))))
(display (canoes '(40 120 122 124 156 100 140 20 50 80 30 60 80 100 40 70 30 20))) (newline)
(display (canoe-count '(40 120 122 124 156 100 140 20 50 80 30 60 80 100 40 70 30 20))) (newline)
OyB0d28gYm95cyBhbmQgYSBjYW5vZQoKKGRlZmluZSAoY2Fub2VzIHhzKQogIChsZXQgKCh4diAobGlzdC0+dmVjdG9yIChzb3J0IHhzIDwpKSkKICAgICAgICAobGVuIChsZW5ndGggeHMpKSkKICAgIChkZWZpbmUgKHggaSkgKHZlY3Rvci1yZWYgeHYgaSkpCiAgICAobGV0IGxvb3AgKChsbyAwKSAoaGkgKC0gbGVuIDEpKSAoY3MgKGxpc3QpKSkKICAgICAgKGNvbmQgKCg8IGhpIGxvKSBjcykKICAgICAgICAgICAgKCg8IDE1MCAoeCBoaSkpCiAgICAgICAgICAgICAgKGxvb3AgbG8gKC0gaGkgMSkKICAgICAgICAgICAgICAgICAgICAoY29ucyAobGlzdCAoeCBoaSkgJ3Rvb2JpZykgY3MpKSkKICAgICAgICAgICAgKCg9IGxvIGhpKSAoY29ucyAobGlzdCAoeCBoaSkpIGNzKSkKICAgICAgICAgICAgKCg8PSAoKyAoeCBsbykgKHggaGkpKSAxNTApCiAgICAgICAgICAgICAgKGxvb3AgKCsgbG8gMSkgKC0gaGkgMSkKICAgICAgICAgICAgICAgICAgICAoY29ucyAobGlzdCAoeCBsbykgKHggaGkpKSBjcykpKQogICAgICAgICAgICAoZWxzZSAobG9vcCBsbyAoLSBoaSAxKQogICAgICAgICAgICAgICAgICAgICAgICAoY29ucyAobGlzdCAoeCBoaSkpIGNzKSkpKSkpKQoKKGRlZmluZSAoY2Fub2UtY291bnQgeHMpCiAgKGxlbmd0aCAoZmlsdGVyIChsYW1iZGEgKGMpCiAgICAgICAgICAgICAgICAgICAgKG9yIChudWxsPyAoY2RyIGMpKQogICAgICAgICAgICAgICAgICAgICAgICAobm90IChlcXVhbD8gKGNhZHIgYykgJ3Rvb2JpZykpKSkKICAgICAgICAgICAgICAgICAgKGNhbm9lcyB4cykpKSkKCihkaXNwbGF5IChjYW5vZXMgJyg0MCAxMjAgMTIyIDEyNCAxNTYgMTAwIDE0MCAyMCA1MCA4MCAzMCA2MCA4MCAxMDAgNDAgNzAgMzAgMjApKSkgKG5ld2xpbmUpCgooZGlzcGxheSAoY2Fub2UtY291bnQgJyg0MCAxMjAgMTIyIDEyNCAxNTYgMTAwIDE0MCAyMCA1MCA4MCAzMCA2MCA4MCAxMDAgNDAgNzAgMzAgMjApKSkgKG5ld2xpbmUp