; 初期値 N = 1 として左から順に ; L のとき N <- 2 * N, R のとき N <- 2 * N + 1 ; と更新していく (defun main () (let* ((s (read-line)) (n 1) ; reduce に渡す関数を作成する ; 2 引数 x, c を取り (x は累積変数、 c は現在注目している文字) ; 今見ている文字 c が 'L' の場合 2 * x 'R' の場合 2 * x + 1 を返す関数 (f (lambda (x c) (+ (* x 2) (if (char= c #\L) 0 1))))) ; :initial-value によって初期値を設定できる (princ (reduce f s :initial-value n)) (terpri))) (main)