challenge /*コメント*/を取り除く

与えられた文字列から「/*」と「*/」で挟まれた部分を取り除くコードを書いてください。

なお、「/*」と入力末尾で挟まれた部分も取り除いてください。 つまり、入力が「AAA/*BBB」なら出力は「AAA」です。 また、コメントは入れ子になりません。入力が「AAA/*BBB/*CCC*/DDD*/EEE」のとき、ひとつめの「*/」でコメントが終わるので出力は「AAADDD*/EEE」になります。 「//」や「**」が混ざる場合の挙動は失敗しやすいので要注意です。

Pythonでの実行例は下のようになります:

>>> remove_comment('AAA')
'AAA'
>>> remove_comment('AAA/*BBB*/')
'AAA'
>>> remove_comment('AAA/*BBB')
'AAA'
>>> remove_comment('AAA/*BBB*/CCC')
'AAACCC'
>>> remove_comment('AAA/*BBB/*CCC*/DDD*/EEE')
'AAADDD*/EEE'
>>> remove_comment('AAA/a//*BB*B**/CCC')
'AAA/a/CCC'

このお題は匿名での投稿を参考にして作成しました。 ありがとうございます。

Posted feedbacks - Haskell

正規表現使わない
1
2
3
4
5
6
7
8
removeComment []           = []
removeComment ('/':'*':xs) = skip xs
    where skip []           = []
          skip ('*':'/':xs) = removeComment xs
          skip (x:xs)       = skip xs  
removeComment (x:xs)       = x : removeComment xs 

main = getContents >>= (putStr . removeComment)

Haskell の練習
1
2
3
4
5
6
7
8
9
removeComment :: String -> String
removeComment = outOfComment
  where
    outOfComment ('/':'*':cs) = inComment cs
    outOfComment (c:cs) = c : outOfComment cs
    outOfComment [] = []
    inComment ('*':'/':cs) = outOfComment cs
    inComment (c:cs) = inComment cs
    inComment [] = []

Index

Feed

Other

Link

Pathtraq

loading...