2008年9月17日水曜日

文字列に含まれる単語の最初の文字を大文字にする (LL Golf Hole 2)

どう書く?orgより LL Golf Hole 2 - 文字列に含まれる単語の最初の文字を大文字にする

kozimaさんの書いたコードを改造してみた。たぶん処理系依存でなくなったと思う。

(defun cap (str)
  (labels ((fn (x y)
             (if (and (upper-case-p x)
                      (lower-case-p y))
                 x
               y)))
    (map 'string #'fn
         str
         (string-capitalize str))))
(cap "LL day and night") ; =>"LL Day And Night"

やっていることといえば、

①元の文字列と②string-capitalizeした文字列の各文字をそれぞれ比べて、①の大文字部分が②で小文字に変わっていたら①の文字を、そうでなければ②の文字を選択しているだけ。

下のを縦読みするとなんとなく分かるかもしれない。

"LL day and night"        ; ①str
"Ll Day And Night"        ; ②(string-capitalize str)
------------------
"LL Day And Night"        ; 結果

そもそもstring-capitalizeの実装ってどうやるんだろう?

0 件のコメント:

コメントを投稿