>>400

UpperCamelCaseはそのまま返すべきだろう。
(と言う事で、1文字目が大文字かつ全文に’_’が無い場合は、(恐らくUpperCamelCaseだろうと期待して)そのまま返すようにした)

Haskell

import Data.Char

main = mapM_ (print.f) ["snake_case","ODAI00_99_TEST","x_0_x","UpperCamelCase","notupperCamelCase"]

f [] = []
f lst@(x:_) | and [elem x ['A'..'Z'], (not.elem '_') lst] = lst
f (x:xs) = toUpper x:map toLower a ++ f (map toLower $ f' a b)
where
(a,b) = span (/= '_') xs

f' _ [] = []
f' [] (y:ys) = ys
f' xs lst@('_':y:ys) |and [(isDigit.last) xs, isDigit y] = lst
f' _ (_:ys) = ys


out:

"SnakeCase"
"Odai00_99Test"
"X0X"
"UpperCamelCase"
"Notuppercamelcase"