記録は作業の証

鉄道とコンピュータ

Rustで1行に数字が並ぶテキストを読む方法

はじめに

AtCoderなどの競技プログラミングのプラットフォームでは、標準入力として空白と改行で区切られたテキストが与えられることが多い。

N
A_1 A_2 ... A_N

Rustでは入出力の記述が煩雑になりやすいとされているため、有志によってproconioというクレートが開発されている。

docs.rs

もっと単純に事を済ませることができないかと考えたので、ここにコードを記録しておく。

コード

fn read_line() -> String {
    let mut line = String::new();
    std::io::stdin().read_line(&mut line).unwrap();
    line
}

fn scan_line<F>() -> Vec<F>
where
    F: std::str::FromStr,
{
    read_line()
        .trim()
        .split_whitespace()
        .flat_map(|s| s.parse::<F>())
        .collect()
}

データが空白区切りで、それぞれのデータが FromStr が実装されている型としてパースできればよいということにしてみた。

上の例のフォーマットで入力が与えられるとき、以下のようにすれば読み取ることができる。

if let [n] = scan_line()[..] {
    let a_n = scan_line()[..n].to_vec();
    solve(n, a_n);
}