fork download
  1. ; n-gram frequency
  2.  
  3. (define (uniq-c eql? xs)
  4. (if (null? xs) xs
  5. (let loop ((xs (cdr xs)) (prev (car xs)) (k 1) (result '()))
  6. (cond ((null? xs) (reverse (cons (cons prev k) result)))
  7. ((eql? (car xs) prev) (loop (cdr xs) prev (+ k 1) result))
  8. (else (loop (cdr xs) (car xs) 1 (cons (cons prev k) result)))))))
  9.  
  10. (define (freq str . size)
  11. (let ((size (if (pair? size) (car size) 1)))
  12. (do ((i 0 (+ i 1)) (blocks (list) (cons (substring str i (+ i size)) blocks)))
  13. ((< (string-length str) (+ i size)) (uniq-c string=? (sort blocks string<?))))))
  14.  
  15. (display (freq "Programming Praxis" 2)) (newline)
Success #stdin #stdout 0.04s 8240KB
stdin
Standard input is empty
stdout
(( P . 1) (Pr . 2) (am . 1) (ax . 1) (g  . 1) (gr . 1) (in . 1) (is . 1) (mi . 1) (mm . 1) (ng . 1) (og . 1) (ra . 2) (ro . 1) (xi . 1))