; freq

(define (uniq-c eql? xs)
  (if (null? xs) xs
    (let loop ((xs (cdr xs)) (prev (car xs)) (k 1) (result '()))
      (cond ((null? xs) (reverse (cons (cons prev k) result)))
            ((eql? (car xs) prev) (loop (cdr xs) prev (+ k 1) result))
            (else (loop (cdr xs) (car xs) 1 (cons (cons prev k) result)))))))

(define (freq str . block)
  (let ((block (if (pair? block) (car block) 1))
        (len (string-length str)))
    (if (< len block) (list)
      (let loop ((k 0) (txt (list)))
        (if (<= k (- len block))
            (loop (+ k 1) (cons (substring str k (+ k block)) txt))
            (let ((txt (sort txt string<?)))
              (uniq-c string=? txt)))))))

(define cryptogram (string-append
  "V MVXEGC NK V RGIIZH HYZ IGXDK PZQ "
  "YNK QLMCGIIV HYGX AYG KQX NK KYNXNXO "
  "VXD HZXAK NA MVUE AYG LNXQAG NA "
  "MGONXK AZ CVNX LVCE AHVNX"))

(display (sort (freq cryptogram 1) (lambda (a b) (< (cdr b) (cdr a))))) (newline)
(display (sort (freq cryptogram 2) (lambda (a b) (< (cdr b) (cdr a))))) (newline)
(display (sort (freq cryptogram 3) (lambda (a b) (< (cdr b) (cdr a))))) (newline)