; 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)