wc_avg.scm

30分プログラム、その19。
ファイルの平均行数を計算するプログラム。

$ gosh wc_avg.scm msort.rb
32.0

$ gosh wc_avg.scm sieve.rb
75.0

$ gosh wc_avg.scm msort.rb sieve.rb
53.5

ちなみに、これでいままでの30分プログラムの平均行数を調べたところ、次のようになった。

言語 平均行数
Perl 32.4
Python 37.8
Ruby 30.5
Scheme 24.25
総合 31.5

うん、だいたい感覚と一致している。まあ、いつも同じ難易度のプログラムではないからそれほど意味のあるデータではないけれど。

(use srfi-1)
 
(define (count-line str)
  (length (string-split str "\n")))
 
(define (read-content filename)
  (call-with-input-file filename 
    (lambda(io) (port->string io))))
 
(define (sum vals)
  (fold + 0 vals))
  
(define (avg vals)
  (/ (sum vals) (length vals)))
 
(define (avg-line-count filenames)
  (avg (map (lambda(x) (count-line (read-content x)))
	    filenames)))
 
(define (main args)
  (format #t "~d~%" (exact->inexact (avg-line-count (cdr args)))))
  • (lambda(x) (count-line (read-content x)))は関数の合成が使いたい。書こうとしたけど、時間切れ
  • avg/sumは、可変引数を受け取るほうが自然だと思う。でも、前回のflist.scm(id:mzp:20070502:flist)でapplyが多すぎると言われたから変えてみた
  • mainの返り値は0にしないと不自然だった
  • wc -lと比べてなぜか一行多い