2010年1月21日木曜日

平均値順にソート

元ネタは上記リンクから。
Common Lispで書いてみる。


(defmacro avg (lst)
`(/ (apply #'+ ,lst)
(length ,lst)))

(defun avg-sort (lst)
(let ((a (avg lst)))
(sort (copy-list lst)
#'(lambda (x y)
(or
(< (abs (- x a))
(abs (- y a)))
(< x y))))))


平均を計算する関数はANSI Common Lispには何故か存在しないので、ポール・グレアム的示唆により、マクロとして定義します。
後は、インチキっぽいんですが、Perlよりも短く仕上がってるとは思います。本当にズルいんだけどね!!!
実行例は以下の通り。

CL-USER> (avg-sort '(4 2 1 3))
(2 3 1 4)
CL-USER>

0 件のコメント:

コメントを投稿