]> Panopticon :: Haskell :: Python Challenge(3)

<< DjangoでRSSリーダーを作る(4) カスタムタグ内で別の変数を参照したいとき | main | FedoraにBerylをインストールmemo >>

Python Challenge(3)

Lv3

アルファベットのみからなる文字列中から、大文字ちょうど三つにはさまれた小文字を抜き出す

ex. "aPQRbVWXcYZABd" -> "b"

import Text.ParserCombinators.Parsec 

bodyguards :: Parser String
bodyguards = try ( do { upper; upper; upper ; c <- lower
                ; upper; upper; upper; many1 lower; return [c] })
            <|> do { skipMany1 upper ; skipMany1 lower ; return ""}

bg :: Parser String
bg = do { many lower ; r <- many1 (try bodyguards)
        ; many upper ; eof ; return $ concat r }

readBdGrs :: String -> String
readBdGrs input = case parse bg "" input of
   Left err -> "No match: " ++ show err
   Right val -> show val

main :: IO()
main = do x <- getContents
          putStrLn $ readBdGrs $ filter (/= '\n') x

Haskellに正規表現は似合わない、と思ったものの、いまいちParsecが使いこなせなくて困る。skipManyやconcatのあたりとか、もうちょっと恰好よくできないものか。

カテゴリ

Trackback URI

http://www.panopticon.jp/mt/mt-tb.cgi/74

Trackbacks(0)

コメントする