2019年12月27日金曜日

【C#】手抜き競プロライブラリ〜入力編〜

最近競プロを再開しました。
競プロやってたって言えたらかっこいいじゃないですか。
目標は水色。

今日は基本中の基本かつ速度の大幅な向上を期待できる入力のライブラリをご紹介します。

といってもStreamを使ってどうたらこうたら......とかはしないです。

あくまで自分の理解を越えない範囲で、コスパの良い書き方を目指しました。
class Input {
    static IEnumerator<string> enumerator = new string[] { }.AsEnumerable().GetEnumerator();

    public static string Line => Console.ReadLine();

    public static string[] StrArr => Line.Split(' ');

    public static int NextInt => int.Parse(NextWord());

    public static long NextLong => long.Parse(NextWord());

    public static List<int> IntList => StrArr.Select(int.Parse).ToList();

    public static List<long> LongList => StrArr.Select(long.Parse).ToList();

    public static string NextWord() {
        while (!enumerator.MoveNext()) {
            enumerator = StrArr.AsEnumerable().GetEnumerator();
        }
        return enumerator.Current;
    }
}

うーん、NextWordだけ"()"が必要なあたりすごく手を抜いてる感が出てますね。

NextInt等はJavaのScannerに挙動が近いです。(Scannerの宣言ないけど)
var a = NextInt;
Console.WriteLine(a);

こんな感じ。

賢い点はenumeratorの初期値に空のstringを入れていること。
これによってwhile文の条件式が簡潔に済ませられます。

コードはご自由にどうぞ。間違いがあったらごめんね。