”漢数字からアラビア数字”をschemeで3

artonさんのトコを見たら

で、こんな感じになった。

KINDEX = "十一二三四五六七八九"
ARABIC = [ 10, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
 
def kj_to_arabic(s)
  n = 0
  s.each_char do |c|
    if n < 10 && n > 0
      n *= 10 
    else
      n += ARABIC[KINDEX.index(c)]
    end
  end
  n.to_s
end
L'eclat des jours(2010-12-10)

ということになってたので、やっぱりschemeで置き換えてみる

(define (kj_to_ar kj-string)
  (define kj-number '((#\十 10) (#\一 1) (#\二 2) (#\三 3) (#\四 4) (#\五 5) (#\六 6) (#\七 7)(#\八 8) (#\九 9)))
  (define (kj-ref kj)
    (cadr (assoc kj kj-number)))
  (let ((kj-lis (string->list kj-string)))
    (define (iter rest result)
      (if (null? rest)
          result
          (if (and (< result 10) (< 0 result))
              (iter (cdr rest) (* result 10))
              (iter (cdr rest) (+ result (kj-ref (car rest)))))))
    (iter kj-lis 0)))

なるほど。vectorとか使った方が良いのかなぁ。