# abc122B : 2019 年 4 月 5 日 [ATCoder (200 点)](https://atcoder.jp/contests/abc122/tasks/abc122_b) ## C++ 特になんの工夫もせず。 $$
{ #includeusing namespace std; bool isACGT(char c){ return (c == 'A' || c == 'C' || c == 'G' || c == 'T'); } int main() { string s; cin >> s; int len = s.length(); int i, j, maxlen = 0; for (i = 0; i < len; i++, j=0){ while (isACGT(s[i+j])){ j++; } maxlen = max(j, maxlen); } cout << maxlen << endl; } $$} ## Haskell 自分でかいたやつより、[Naoki_M_ さんの](https://atcoder.jp/contests/abc122/submissions/4733034)が良いと思う。こんなの: $$ { main = getLine >>= print . solve 0 0 solve ans _ [] = ans solve ans cnt (c:cs) = if c `elem` "ACGT" then solve (max ans (cnt + 1)) (cnt + 1) cs else solve ans 0 cs $$} [自分で書いてみたやつ](https://atcoder.jp/contests/abc122/submissions/4832259) は、かなり、いまいちだなぁ。 ${max} つけわすれて WA になったり。 また、hlint に言われたこと: - $ {(flip elem "ACGT")} は $ {(`elem` "ACGT")}でよい - $ {putStrLn . show} は $ {print} そうですね。 ## C# C++ 版と同じように書いたら、RE。あー、そうか。C++ だと文字列の終端 $ {'\0'} との比較で自然と while がとまっていたのが、 C# では範囲外アクセスで例外になるのかー。 $$ { using static System.Console; using static System.Math; class AtCoder { public static void Main() { var s = ReadLine(); int ans = 0; int ct; for (int i = 0; i < s.Length; i++){ ct = 0; while (i+ct < s.Length && isACGT(s[i+ct])){ ct++; } ans = Max(ans, ct); } WriteLine(ans); } static bool isACGT(char c) { return (c == 'A' || c == 'C' || c == 'G' || c == 'T'); } } $$} そういえば、C++ 版、return 0 してないけど、いいのかな、とか、C# の Main 関数の引数がどうあるべきなのか、とか、気にしてないや。 あとで調べよう。 - C++ では省略可能で、省略した場合には return 0; とみなされるよう。 - C# の Main 関数の戻り値の型は void か int らしい