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))