; frequency counts

(define (freq vec)
  (let ((n (vector-length vec)))
    (let loop ((i 0))
      (cond ((= i n) (do ((j 0 (+ j 1))) ((= j n))
                       (when (negative? (vector-ref vec j))
                         (display (+ j 1)) (display " ")
                         (display (- (vector-ref vec j))) (newline))))
            ((not (positive? (vector-ref vec i))) (loop (+ i 1)))
            (else (let ((idx (- (vector-ref vec i) 1)))
                    (cond ((positive? (vector-ref vec idx))
                            (vector-set! vec i (vector-ref vec idx))
                            (vector-set! vec idx -1)
                            (loop i))
                          (else (vector-set! vec idx
                                  (- (vector-ref vec idx) 1))
                                (vector-set! vec i 0)
                                (loop (+ i 1))))))))))

(freq '#(2 3 3 2 5))

(define (freq vec)
  (let ((n (vector-length vec)))
    (do ((i 0 (+ i 1))) ((= i n))
      (vector-set! vec i
        (- (vector-ref vec i) 1)))
    (do ((i 0 (+ i 1))) ((= i n))
      (vector-set! vec (modulo (vector-ref vec i) n)
        (+ (vector-ref vec (modulo (vector-ref vec i) n)) n)))
    (do ((i 0 (+ i 1))) ((= i n))
      (when (< n (vector-ref vec i))
        (display (+ i 1)) (display " ")
        (display (quotient (vector-ref vec i) n)) (newline)))
    (do ((i 0 (+ i 1))) ((= i n))
      (vector-set! vec i
        (+ (remainder (vector-ref vec i) n) 1)))
    (display vec) (newline))) ; show that vec is unchanged

(freq '#(2 3 3 2 5))