# abc122B : 2019 年 4 月 5 日 [ATCoder (200 点)](https://atcoder.jp/contests/abc122/tasks/abc122_b) ## C++ 特になんの工夫もせず。 $$
{
#include 
using 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 らしい