競プロで標準入力のパースがめんどうだったのでマクロ作りました。
AtCoderのRust(1.15.1)でテスト済みです。
https://github.com/kgtkr/procon-lib-rs/blob/master/src/parser.rs
標準入力を全て読み込む
let text = {
let mut s = String::new();
io::stdin().read_to_string(&mut s).unwrap();
s
};
入力値
5
10 20
1 a
2 b
3 c
4 d
5 e
1 2 3 4 5
input!(text=>
(n:usize)
(a:i64 b:i64)
{n;list:(i64,#)}
(arr:[i64])
);
assert_eq!(n, 5);
assert_eq!(a, 10);
assert_eq!(b, 20);
assert_eq!(list, vec![(1,"a"),(2,"b"),(3,"c"),(4,"d"),(5,"e")]);
assert_eq!(arr, vec![1,2,3,4,5]);
input!(入力値=>パーサー...);
(変数名:型...)
{行数;変数名:型}
|構文|解説|例|例入力|
|:-:|:-:|:-:|:-:|
|型|単一の型とマッチ(parse::<型>()
でパースされる)|i64|10|
|#|文字列|#|abc|
|@|1から始まるインデックスを0からに変換するやつ。つまりusizeでパースして-1してるだけ|@|1|
|[型]|配列|[i64]|1 2 3 4 5|
|(型,...)|タプル|(i64,#)|10 abc|