数字の分割

なんかxyzzyProject Eulerやってる同志発見 → クリップしとこ → はてブでもないのに速攻捕捉された(!
という流れで、ちゃんと書いた自分のコードを晒してみる。

Project EulerのNo.20

(defun str-to-digits (s)
  (mapcar #'(lambda (c) (- (char-code c) 48))
          (coerce s 'list)))

(defun num-to-digits (n)
  (str-to-digits (format nil "~D" n)))
          
(defun fact (n)
  (if (= n 0) 1 (* n (fact (1- n)))))

(defun problem20 (n)
  (apply #'+ (num-to-digits (fact n))))

最初に書いた分割用のコード

(defun to-digits (n)
  (cond ((< n 10) (list n))
        (t (multiple-value-bind (q r) (floor n 10)
	     (append (to-digits q) (list r))))))

これはさっき実験してみたら上のnum-to-digitsの10倍以上遅かったんだけど、
今まで書いたコードをGREPしてみたらほとんど遅い方使ってた、ショック…