概要
英小文字及び '@' からなり、長さの等しい文字列が二つ与えられる。両文字列に含まれる '@' を、"atcoder" に含まれるいずれかの文字に置き換える操作をする。二つの文字列を同一にできるかどうか求めよ。
解法
インデックス毎に考えていきます。いずれかが '@' である場合、他方が "atcoder@" のいずれかであれば目標を可能で、それ以外の文字であれば不可能です。そうでないとき、二つの文字が一致していれば達成可能で、異なれば不可能です。達成不可能となるインデックスが存在しなければ全体でも達成可能になります。
コード
main = do s1 <- getLine s2 <- getLine putStrLn $ if solve s1 s2 then "You can win" else "You will lose" solve [] [] = True solve (c1:s1) (c2:s2) | c1 == '@' && ok c2 = solve s1 s2 | c2 == '@' && ok c1 = solve s1 s2 | c1 == c2 = solve s1 s2 | otherwise = False where ok = ( `elem` "atcoder@" )