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