torus711 のアレ

主に競技プログラミングの問題について書きます.PC 以外だと数式が表示されないかもしれないです

AtCoder Beginner Contest #003, B : AtCoderトランプ

概要

 英小文字及び '@' からなり、長さの等しい文字列が二つ与えられる。両文字列に含まれる '@' を、"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@" )