(define (3sum set)
  (define pr (let ([pargs (make-hash)])
               (lambda args
                 (unless (hash-has-key? pargs args)
                   (apply printf "~A ~A ~A~%" args)
                   (hash-set! pargs args #t)))))
  (for ([i (- (vector-length set) 3)])
    (define a (vector-ref set i))
    (let loop ([s (add1 i)]
               [e (sub1 (vector-length set))])
      (when (< s e)
        (let* ([b (vector-ref set s)]
               [c (vector-ref set e)]
               [+abc (+ a b c)])
          (cond [(= 0 +abc)
                 (pr a b c)
                 (loop s (sub1 e))]
              [(< 0 +abc) (loop s (sub1 e))]
              [else (loop (add1 s) e)]))))))

(for-each (lambda (x)
            (3sum x)
            (newline))
          (map (compose (curryr vector-sort <)
                        list->vector
                        (curry map string->number)
                        string-split)
               (port->lines)))