Gaucheで天下一プログラマー予選例題
以下の文字列はUTF-8を文字エンコーディング形式とする16進数のバイト列である。
UTF-8でエンコーディングされた文字列として解析した場合、この文字列の【文字数】を答えなさい。
e4bba5e4b88be381aee69687e5ad97e58897e381af5554462d38e38292e69687e5ad97
e382a8e383b3e382b3e383bce38387e382a3e383b3e382b0e5bda2e5bc8fe381a8e381
99e3828b3136e980b2e695b0e381aee38390e382a4e38388e58897e381a7e38182e3828be38082
/ ̄ ̄\ / _ノ \ | ( ●)(●) <おっと、それ以上は言うなよ… . | (__人__)____ | ` ⌒/ ─' 'ー\ . | /( ○) (○)\ . ヽ / ⌒(n_人__)⌒ \ ヽ |、 ( ヨ | Emacsでhexl-insert-hex-stringすれば / `ー─− 厂 / | 、 _ __,,/ \
Gaucheでまっとうにやります。
処理内容
"e4bb....82" -> '(e 4 b b a 5 ...) -> '("e4" "bb" "a5" ...) -> '(228 187 165 ...) -> #u8(228 187 165 ...) -> UTF-8文字列
(use srfi-1) (use util.list) (use gauche.uvector) (define (天下一 str) (string-length (u8vector->string (list->u8vector (map (lambda (x) (string->number (apply string x) 16)) (slices (string->list str) 2))))))
(天下一 (string-append "e4bba5e4b88be381aee69687e5ad97e58897e381af5554462d38e38292e69687e5ad97" "e382a8e383b3e382b3e383bce38387e382a3e383b3e382b0e5bda2e5bc8fe381a8e381" "99e3828b3136e980b2e695b0e381aee38390e382a4e38388e58897e381a7e38182e3828be38082")) => 41
もっと簡単な解き方がありそう。
(追記 2009/6/18 22:20)
packで一発でした。
(use binary.pack) (string-length (pack "H*" '("e4bba5...中略...e38082") :to-string? #t))