Let's write β

プログラミング中にできたことか、思ったこととか

ソウルナンバー算出

 適当にテレビをみていたらソウルナンバー占いとやらが紹介されていました。
占いは別としてプログラムとしては面白そうだったのでつくってみました

(defn keta-inner [number-str]
  (if (< (Integer/parseInt number-str) 10)
    (Integer/parseInt number-str)
    (keta-inner (str (reduce + 
                             (map #(Integer/parseInt %)
                                  (re-seq #"." number-str)))))))

(defn soul-number [year month day]
  (keta-inner (str year month day)))

適当に書いているので効率とかは重視していません。
というか数値を一度文字列にして各桁に分解してからparseIntしているのが非常に非効率
だとおもうのですが、数字を各桁に分解する効率のいい方法とは何があるのでしょうか?
過去のプログラムでも何回かこういった作業をする必要に駆られているのですが、なにか
いいアルゴリズムはないのでしょうか?
ご存知のかたは教えてください。