Comment detail

コード中の文字の頻度分析 (Nested Flatten)
Gauche (Scheme) で書きました。
Gauche 付属の srfi-42.scm を分析してみました。

#\space = 11142 / 38818 : 28.70 %
#\e = 2396 / 38818 : 6.17 %
#\( = 1640 / 38818 : 4.22 %
#\) = 1634 / 38818 : 4.20 %
#\r = 1492 / 38818 : 3.84 %
#\t = 1419 / 38818 : 3.65 %
#\= = 1391 / 38818 : 3.58 %
#\a = 1284 / 38818 : 3.30 %
#\s = 1280 / 38818 : 3.29 %
#\i = 1194 / 38818 : 3.07 %
...

やっぱり括弧がちょっと多めかな。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
(define make-char-counter (lambda ()
  (let ((ls '()))
    (lambda (c)
      (if (char? c)
        (set! ls
          (let loop ((li ls) (flag #f) (ret '()))
            (if (pair? li)
              (if (char=? c (caar li))
                (loop (cdr li) #t (cons (cons c (+ 1 (cdar li))) ret))
                (loop (cdr li) flag (cons (car li) ret)))
              (if flag ret (cons (cons c 1) ret)))))
        ls)))))

(define count-char (lambda (file)
  (call-with-input-file file
    (lambda (in)
      (let ((counter (make-char-counter)))
        (let loop ((c (read-char in)))
          (if (eof-object? c)
            (counter #f)
            (begin (counter c) (loop (read-char in))))))))))

(define main (lambda (args)
  (let* ((count (sort (count-char (cadr args)) (lambda (x y) (> (cdr x) (cdr y)))))
      (total (fold (lambda (p total) (+ (cdr p) total)) 0 count)))
    (for-each
      (lambda (p)
        (format #t "~s = ~d / ~d : ~d.~2,'0d %" (car p) (cdr p) total
          (inexact->exact (truncate (* (/ (cdr p) total) 100)))
          (remainder (inexact->exact (truncate (* (/ (cdr p) total) 10000))) 100))
        (newline))
      count))
  0))

Index

Feed

Other

Link

Pathtraq

loading...