数字の分割
なんかxyzzyでProject 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してみたらほとんど遅い方使ってた、ショック…