Kgtkr's Blog

競プロ用、Rust標準入力パースマクロ

2018/08/30
proconrust

競プロで標準入力のパースがめんどうだったのでマクロ作りました。
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!(入力値=>パーサー...);

1行の入力

(変数名:型...)

複数行の入力

{行数;変数名:型}

構文解説例入力
単一の型とマッチ(parse::<型>()でパースされる)i6410
#文字列#abc
@1から始まるインデックスを0からに変換するやつ。つまりusizeでパースして-1してるだけ@1
[型]配列[i64]1 2 3 4 5
(型,...)タプル(i64,#)10 abc