From 9b3b5e9df0cd7357e27432204161b869f863f812 Mon Sep 17 00:00:00 2001 From: Ryo Yamashita Date: Sun, 15 Dec 2019 14:21:35 +0900 Subject: [PATCH 1/5] Add a test for APG4b-EX25 --- examples/apg4b-ex25.rs | 89 +++++++++++++++++++ examples/tests.ron | 4 + examples/testsets/apg4b-ex25/in/sample_01.txt | 5 ++ examples/testsets/apg4b-ex25/in/sample_02.txt | 5 ++ examples/testsets/apg4b-ex25/in/sample_03.txt | 5 ++ examples/testsets/apg4b-ex25/in/sample_04.txt | 5 ++ examples/testsets/apg4b-ex25/in/sample_05.txt | 5 ++ examples/testsets/apg4b-ex25/in/sample_06.txt | 5 ++ .../testsets/apg4b-ex25/out/sample_01.txt | 1 + .../testsets/apg4b-ex25/out/sample_02.txt | 1 + .../testsets/apg4b-ex25/out/sample_03.txt | 1 + .../testsets/apg4b-ex25/out/sample_04.txt | 1 + .../testsets/apg4b-ex25/out/sample_05.txt | 1 + .../testsets/apg4b-ex25/out/sample_06.txt | 1 + 14 files changed, 129 insertions(+) create mode 100644 examples/apg4b-ex25.rs create mode 100644 examples/testsets/apg4b-ex25/in/sample_01.txt create mode 100644 examples/testsets/apg4b-ex25/in/sample_02.txt create mode 100644 examples/testsets/apg4b-ex25/in/sample_03.txt create mode 100644 examples/testsets/apg4b-ex25/in/sample_04.txt create mode 100644 examples/testsets/apg4b-ex25/in/sample_05.txt create mode 100644 examples/testsets/apg4b-ex25/in/sample_06.txt create mode 100644 examples/testsets/apg4b-ex25/out/sample_01.txt create mode 100644 examples/testsets/apg4b-ex25/out/sample_02.txt create mode 100644 examples/testsets/apg4b-ex25/out/sample_03.txt create mode 100644 examples/testsets/apg4b-ex25/out/sample_04.txt create mode 100644 examples/testsets/apg4b-ex25/out/sample_05.txt create mode 100644 examples/testsets/apg4b-ex25/out/sample_06.txt diff --git a/examples/apg4b-ex25.rs b/examples/apg4b-ex25.rs new file mode 100644 index 0000000..a19484e --- /dev/null +++ b/examples/apg4b-ex25.rs @@ -0,0 +1,89 @@ +// https://atcoder.jp/contests/APG4b/tasks/APG4b_bx + +use fixedbitset::FixedBitSet; +use itertools::Itertools as _; + +fn main() { + // use std::io::{self, Read as _}; + // + // let mut input = "".to_owned(); + // io::stdin().read_to_string(&mut input).unwrap(); + // let mut input = input.split_whitespace(); + // macro_rules! read { + // ([$t:tt; $n:expr]) => { + // (0..$n).map(|_| read!($t)).collect::>() + // }; + // (($($t:tt),+)) => { + // ($(read!($t)),*) + // }; + // (_1based) => { + // read!(usize) - 1 + // }; + // (_bytes) => { + // read!(String).into_bytes() + // }; + // ($ty:ty) => { + // input.next().unwrap().parse::<$ty>().unwrap() + // }; + // } + // + // let n = read!(usize); + // let a = read!([usize; n]); + // let m = read!(usize); + // let b = read!([usize; m]); + // let arg0 = read!(String); + // let args = read!([usize; if arg0 == "subtract" { 1 } else { 0 }]); + + use proconio::input; + + input! { + n: usize, + a: [usize; n], + m: usize, + b: [usize; m], + arg0: String, + args: [usize; if arg0 == "subtract" { 1 } else { 0 }], + } + + let (a, b) = (a.into_iter().collect(), b.into_iter().collect()); + + print_set(&match (&*arg0, &*args) { + ("intersection", []) => intersection(&a, &b), + ("union_set", []) => union_set(&a, &b), + ("symmetric_diff", []) => symmetric_diff(&a, &b), + ("subtract", &[x]) => subtract(a, x), + ("increment", []) => increment(&a), + ("decrement", []) => decrement(&a), + _ => unreachable!(), + }); +} + +fn print_set(set: &FixedBitSet) { + println!("{}", (0..50).filter(|&i| set[i]).format(" ")); +} + +fn intersection(a: &FixedBitSet, b: &FixedBitSet) -> FixedBitSet { + a & b +} + +fn union_set(a: &FixedBitSet, b: &FixedBitSet) -> FixedBitSet { + a | b +} + +fn symmetric_diff(a: &FixedBitSet, b: &FixedBitSet) -> FixedBitSet { + a ^ b +} + +fn subtract(mut a: FixedBitSet, x: usize) -> FixedBitSet { + // > xは存在することが保証される。 + a.set(x, false); + a +} + +fn increment(a: &FixedBitSet) -> FixedBitSet { + a.ones().map(|x| (x + 1) % 50).collect() +} + +fn decrement(a: &FixedBitSet) -> FixedBitSet { + a.ones().map(|x| (x + 49) % 50).collect() +} diff --git a/examples/tests.ron b/examples/tests.ron index e86cc49..90d7509 100644 --- a/examples/tests.ron +++ b/examples/tests.ron @@ -7,6 +7,10 @@ name: "APG4b: A - 1.00.はじめに", matching: ExactWhole, ), + "apg4b-ex25": ( + name: "APG4b: EX25 - 集合の操作 / 3.05", + matching: ExactWords, + ), "practice-a": ( name: "practice contest: A - Welcome to AtCoder", matching: ExactWords, diff --git a/examples/testsets/apg4b-ex25/in/sample_01.txt b/examples/testsets/apg4b-ex25/in/sample_01.txt new file mode 100644 index 0000000..72d1a5d --- /dev/null +++ b/examples/testsets/apg4b-ex25/in/sample_01.txt @@ -0,0 +1,5 @@ +3 +0 1 2 +3 +1 2 3 +intersection diff --git a/examples/testsets/apg4b-ex25/in/sample_02.txt b/examples/testsets/apg4b-ex25/in/sample_02.txt new file mode 100644 index 0000000..975f08a --- /dev/null +++ b/examples/testsets/apg4b-ex25/in/sample_02.txt @@ -0,0 +1,5 @@ +3 +0 1 2 +3 +1 2 3 +union_set diff --git a/examples/testsets/apg4b-ex25/in/sample_03.txt b/examples/testsets/apg4b-ex25/in/sample_03.txt new file mode 100644 index 0000000..cc0e508 --- /dev/null +++ b/examples/testsets/apg4b-ex25/in/sample_03.txt @@ -0,0 +1,5 @@ +3 +0 1 2 +3 +1 2 3 +symmetric_diff diff --git a/examples/testsets/apg4b-ex25/in/sample_04.txt b/examples/testsets/apg4b-ex25/in/sample_04.txt new file mode 100644 index 0000000..c5ee91b --- /dev/null +++ b/examples/testsets/apg4b-ex25/in/sample_04.txt @@ -0,0 +1,5 @@ +3 +0 1 2 +3 +1 2 3 +subtract 2 diff --git a/examples/testsets/apg4b-ex25/in/sample_05.txt b/examples/testsets/apg4b-ex25/in/sample_05.txt new file mode 100644 index 0000000..354e615 --- /dev/null +++ b/examples/testsets/apg4b-ex25/in/sample_05.txt @@ -0,0 +1,5 @@ +3 +0 1 49 +3 +1 2 3 +increment diff --git a/examples/testsets/apg4b-ex25/in/sample_06.txt b/examples/testsets/apg4b-ex25/in/sample_06.txt new file mode 100644 index 0000000..8d4d22c --- /dev/null +++ b/examples/testsets/apg4b-ex25/in/sample_06.txt @@ -0,0 +1,5 @@ +3 +0 1 49 +3 +1 2 3 +decrement diff --git a/examples/testsets/apg4b-ex25/out/sample_01.txt b/examples/testsets/apg4b-ex25/out/sample_01.txt new file mode 100644 index 0000000..8d04f96 --- /dev/null +++ b/examples/testsets/apg4b-ex25/out/sample_01.txt @@ -0,0 +1 @@ +1 2 diff --git a/examples/testsets/apg4b-ex25/out/sample_02.txt b/examples/testsets/apg4b-ex25/out/sample_02.txt new file mode 100644 index 0000000..fd15fe1 --- /dev/null +++ b/examples/testsets/apg4b-ex25/out/sample_02.txt @@ -0,0 +1 @@ +0 1 2 3 diff --git a/examples/testsets/apg4b-ex25/out/sample_03.txt b/examples/testsets/apg4b-ex25/out/sample_03.txt new file mode 100644 index 0000000..65c9b94 --- /dev/null +++ b/examples/testsets/apg4b-ex25/out/sample_03.txt @@ -0,0 +1 @@ +0 3 diff --git a/examples/testsets/apg4b-ex25/out/sample_04.txt b/examples/testsets/apg4b-ex25/out/sample_04.txt new file mode 100644 index 0000000..6e8183b --- /dev/null +++ b/examples/testsets/apg4b-ex25/out/sample_04.txt @@ -0,0 +1 @@ +0 1 diff --git a/examples/testsets/apg4b-ex25/out/sample_05.txt b/examples/testsets/apg4b-ex25/out/sample_05.txt new file mode 100644 index 0000000..63fb4bf --- /dev/null +++ b/examples/testsets/apg4b-ex25/out/sample_05.txt @@ -0,0 +1 @@ +0 1 2 diff --git a/examples/testsets/apg4b-ex25/out/sample_06.txt b/examples/testsets/apg4b-ex25/out/sample_06.txt new file mode 100644 index 0000000..03ebe79 --- /dev/null +++ b/examples/testsets/apg4b-ex25/out/sample_06.txt @@ -0,0 +1 @@ +0 48 49 From 4551db2025d07baa93ff6b1e3e060114d981d254 Mon Sep 17 00:00:00 2001 From: Ryo Yamashita Date: Sun, 15 Dec 2019 14:24:03 +0900 Subject: [PATCH 2/5] Add a test for APG4b-EX26 --- examples/apg4b-ex26.rs | 235 ++++++++++++++++++ examples/tests.ron | 4 + examples/testsets/apg4b-ex26/in/sample_01.txt | 5 + examples/testsets/apg4b-ex26/in/sample_02.txt | 3 + examples/testsets/apg4b-ex26/in/sample_03.txt | 2 + examples/testsets/apg4b-ex26/in/sample_04.txt | 2 + examples/testsets/apg4b-ex26/in/sample_05.txt | 3 + examples/testsets/apg4b-ex26/in/sample_06.txt | 3 + examples/testsets/apg4b-ex26/in/sample_07.txt | 5 + examples/testsets/apg4b-ex26/in/sample_08.txt | 5 + examples/testsets/apg4b-ex26/in/sample_09.txt | 7 + .../testsets/apg4b-ex26/out/sample_01.txt | 2 + .../testsets/apg4b-ex26/out/sample_02.txt | 2 + .../testsets/apg4b-ex26/out/sample_03.txt | 1 + .../testsets/apg4b-ex26/out/sample_04.txt | 1 + .../testsets/apg4b-ex26/out/sample_05.txt | 1 + .../testsets/apg4b-ex26/out/sample_06.txt | 1 + .../testsets/apg4b-ex26/out/sample_07.txt | 1 + .../testsets/apg4b-ex26/out/sample_08.txt | 1 + .../testsets/apg4b-ex26/out/sample_09.txt | 3 + 20 files changed, 287 insertions(+) create mode 100644 examples/apg4b-ex26.rs create mode 100644 examples/testsets/apg4b-ex26/in/sample_01.txt create mode 100644 examples/testsets/apg4b-ex26/in/sample_02.txt create mode 100644 examples/testsets/apg4b-ex26/in/sample_03.txt create mode 100644 examples/testsets/apg4b-ex26/in/sample_04.txt create mode 100644 examples/testsets/apg4b-ex26/in/sample_05.txt create mode 100644 examples/testsets/apg4b-ex26/in/sample_06.txt create mode 100644 examples/testsets/apg4b-ex26/in/sample_07.txt create mode 100644 examples/testsets/apg4b-ex26/in/sample_08.txt create mode 100644 examples/testsets/apg4b-ex26/in/sample_09.txt create mode 100644 examples/testsets/apg4b-ex26/out/sample_01.txt create mode 100644 examples/testsets/apg4b-ex26/out/sample_02.txt create mode 100644 examples/testsets/apg4b-ex26/out/sample_03.txt create mode 100644 examples/testsets/apg4b-ex26/out/sample_04.txt create mode 100644 examples/testsets/apg4b-ex26/out/sample_05.txt create mode 100644 examples/testsets/apg4b-ex26/out/sample_06.txt create mode 100644 examples/testsets/apg4b-ex26/out/sample_07.txt create mode 100644 examples/testsets/apg4b-ex26/out/sample_08.txt create mode 100644 examples/testsets/apg4b-ex26/out/sample_09.txt diff --git a/examples/apg4b-ex26.rs b/examples/apg4b-ex26.rs new file mode 100644 index 0000000..ecc0c9a --- /dev/null +++ b/examples/apg4b-ex26.rs @@ -0,0 +1,235 @@ +// https://atcoder.jp/contests/APG4b/tasks/APG4b_bw + +use itertools::Itertools as _; +use maplit::hashmap; +use matches::matches; + +use std::collections::HashMap; +use std::io::{self, Read as _}; +use std::str::FromStr; + +fn main() { + let mut input = "".to_owned(); + io::stdin().read_to_string(&mut input).unwrap(); + let mut env = hashmap!(); + for line in input.lines().skip(1) { + line.parse::().unwrap().eval(&mut env); + } +} + +#[derive(Debug)] +enum Stmt { + DeclInt(char, IntExpr), + PrintInt(IntExpr), + DeclVec(char, VecExpr), + PrintVec(VecExpr), +} + +impl Stmt { + fn eval(&self, env: &mut HashMap) { + match self { + Self::DeclInt(name, expr) => { + env.insert(*name, Val::Int(expr.eval(env))); + } + Self::PrintInt(expr) => println!("{}", expr.eval(env)), + Self::DeclVec(name, expr) => { + env.insert(*name, Val::Vec(expr.eval(env))); + } + Self::PrintVec(expr) => println!("[ {} ]", expr.eval(env).iter().format(" ")), + } + } +} + +impl FromStr for Stmt { + type Err = (String, usize, nom::error::ErrorKind); + + fn from_str(input: &str) -> Result { + use nom::branch::alt; + use nom::bytes::complete::{tag, take_while_m_n}; + use nom::character::complete::{char, one_of, space0, space1}; + use nom::combinator::{map, map_res}; + use nom::multi::{fold_many0, separated_list}; + use nom::sequence::{pair, preceded, tuple}; + use nom::IResult; + + fn decl_int(input: &str) -> IResult<&str, Stmt> { + let (input, _) = space0(input)?; + let (input, _) = tag("int")(input)?; + let (input, _) = space1(input)?; + let (input, name) = var_name(input)?; + let (input, _) = space0(input)?; + let (input, _) = tag("=")(input)?; + let (input, _) = space0(input)?; + let (input, expr) = int_expr(input)?; + let (input, _) = space0(input)?; + let (input, _) = char(';')(input)?; + Ok((input, Stmt::DeclInt(name, expr))) + } + + fn print_int(input: &str) -> IResult<&str, Stmt> { + let (input, _) = space0(input)?; + let (input, _) = tag("print_int")(input)?; + let (input, _) = space1(input)?; + let (input, expr) = int_expr(input)?; + let (input, _) = space0(input)?; + let (input, _) = tag(";")(input)?; + Ok((input, Stmt::PrintInt(expr))) + } + + fn decl_vec(input: &str) -> IResult<&str, Stmt> { + let (input, _) = space0(input)?; + let (input, _) = tag("vec")(input)?; + let (input, _) = space1(input)?; + let (input, name) = var_name(input)?; + let (input, _) = space0(input)?; + let (input, _) = char('=')(input)?; + let (input, _) = space0(input)?; + let (input, val) = vec_expr(input)?; + let (input, _) = space0(input)?; + let (input, _) = char(';')(input)?; + Ok((input, Stmt::DeclVec(name, val))) + } + + fn print_vec(input: &str) -> IResult<&str, Stmt> { + let (input, _) = space0(input)?; + let (input, _) = tag("print_vec")(input)?; + let (input, _) = space1(input)?; + let (input, val) = vec_expr(input)?; + let (input, _) = space0(input)?; + let (input, _) = char(';')(input)?; + Ok((input, Stmt::PrintVec(val))) + } + + fn int_expr(input: &str) -> IResult<&str, IntExpr> { + let (input, expr) = int_term(input)?; + fold_many0( + preceded(space0, pair(one_of("+-"), preceded(space0, int_term))), + expr, + |expr, (op, term)| match op { + '+' => IntExpr::Add(Box::new(expr), Box::new(term)), + '-' => IntExpr::Sub(Box::new(expr), Box::new(term)), + _ => unreachable!(), + }, + )(input) + } + + fn int_term(input: &str) -> IResult<&str, IntExpr> { + let (input, _) = space0(input)?; + alt(( + map(var_name, IntExpr::Var), + map( + take_while_m_n::<_, &str, _>(1, 1, |c| matches!(c, '0'..='9')), + |s| IntExpr::Lit(s.parse().unwrap()), + ), + ))(input) + } + + fn vec_expr(input: &str) -> IResult<&str, VecExpr> { + let (input, expr) = vec_term(input)?; + fold_many0( + preceded(space0, pair(one_of("+-"), preceded(space0, vec_term))), + expr, + |expr, (op, term)| match op { + '+' => VecExpr::Add(Box::new(expr), Box::new(term)), + '-' => VecExpr::Sub(Box::new(expr), Box::new(term)), + _ => unreachable!(), + }, + )(input) + } + + fn vec_term(input: &str) -> IResult<&str, VecExpr> { + let (input, _) = space0(input)?; + alt((map(var_name, VecExpr::Var), |input| { + let (input, _) = char('[')(input)?; + let (input, _) = space0(input)?; + let (input, vec) = + separated_list(tuple((space0, char(','), space0)), int_expr)(input)?; + let (input, _) = space0(input)?; + let (input, _) = char(']')(input)?; + Ok((input, VecExpr::Lit(vec))) + }))(input) + } + + fn var_name(input: &str) -> IResult<&str, char> { + map_res(take_while_m_n(1, 1, |c| matches!(c, 'a'..='z')), str::parse)(input) + } + + decl_int(input) + .or_else(|_| print_int(input)) + .or_else(|_| decl_vec(input)) + .or_else(|_| print_vec(input)) + .map(|(_, stmt)| stmt) + .map_err(|err| match err { + nom::Err::Incomplete(_) => unreachable!(), + nom::Err::Error((s, k)) | nom::Err::Failure((s, k)) => { + (input.to_owned(), input.len() - s.len(), k) + } + }) + } +} + +#[derive(Debug)] +enum Val { + Int(i32), + Vec(Vec), +} + +impl Val { + fn unwrap_int(&self) -> i32 { + match self { + Self::Int(n) => *n, + Self::Vec(_) => panic!(), + } + } + + fn unwrap_vec(&self) -> &[i32] { + match self { + Self::Int(_) => panic!(), + Self::Vec(vec) => vec, + } + } +} + +#[derive(Debug, Clone)] +enum IntExpr { + Lit(i32), + Var(char), + Add(Box, Box), + Sub(Box, Box), +} + +impl IntExpr { + fn eval(&self, env: &HashMap) -> i32 { + match self { + Self::Lit(n) => *n, + Self::Var(s) => env[s].unwrap_int(), + Self::Add(l, r) => l.eval(env) + r.eval(env), + Self::Sub(l, r) => l.eval(env) - r.eval(env), + } + } +} + +#[derive(Debug, Clone)] +enum VecExpr { + Lit(Vec), + Var(char), + Add(Box, Box), + Sub(Box, Box), +} + +impl VecExpr { + fn eval(&self, env: &HashMap) -> Vec { + match self { + Self::Lit(v) => v.iter().map(|x| x.eval(env)).collect(), + Self::Var(s) => env[s].unwrap_vec().to_owned(), + Self::Add(l, r) => { + let (l, r) = (l.eval(env), r.eval(env)); + l.into_iter().zip_eq(r).map(|(l, r)| l + r).collect() + } + Self::Sub(l, r) => { + let (l, r) = (l.eval(env), r.eval(env)); + l.into_iter().zip_eq(r).map(|(l, r)| l - r).collect() + } + } + } +} diff --git a/examples/tests.ron b/examples/tests.ron index 90d7509..a834c38 100644 --- a/examples/tests.ron +++ b/examples/tests.ron @@ -11,6 +11,10 @@ name: "APG4b: EX25 - 集合の操作 / 3.05", matching: ExactWords, ), + "apg4b-ex26": ( + name: "APG4b: EX26 - 電卓を作ろう3 / 3.06", + matching: ExactWords, + ), "practice-a": ( name: "practice contest: A - Welcome to AtCoder", matching: ExactWords, diff --git a/examples/testsets/apg4b-ex26/in/sample_01.txt b/examples/testsets/apg4b-ex26/in/sample_01.txt new file mode 100644 index 0000000..c73dcea --- /dev/null +++ b/examples/testsets/apg4b-ex26/in/sample_01.txt @@ -0,0 +1,5 @@ +4 +int x = 1 + 2 ; +print_int x + 3 ; +vec a = [ 1 , 2 , x ] ; +print_vec a + [ 4 , 5 , 6 ] ; diff --git a/examples/testsets/apg4b-ex26/in/sample_02.txt b/examples/testsets/apg4b-ex26/in/sample_02.txt new file mode 100644 index 0000000..52f5052 --- /dev/null +++ b/examples/testsets/apg4b-ex26/in/sample_02.txt @@ -0,0 +1,3 @@ +2 +print_int 1 - 2 ; +print_vec [ 1 , 2 , 3 ] - [ 3 , 2 , 1 ] ; diff --git a/examples/testsets/apg4b-ex26/in/sample_03.txt b/examples/testsets/apg4b-ex26/in/sample_03.txt new file mode 100644 index 0000000..9698270 --- /dev/null +++ b/examples/testsets/apg4b-ex26/in/sample_03.txt @@ -0,0 +1,2 @@ +1 +print_int 5 ; diff --git a/examples/testsets/apg4b-ex26/in/sample_04.txt b/examples/testsets/apg4b-ex26/in/sample_04.txt new file mode 100644 index 0000000..58ee2d6 --- /dev/null +++ b/examples/testsets/apg4b-ex26/in/sample_04.txt @@ -0,0 +1,2 @@ +1 +print_vec [ 1 , 2 ] ; diff --git a/examples/testsets/apg4b-ex26/in/sample_05.txt b/examples/testsets/apg4b-ex26/in/sample_05.txt new file mode 100644 index 0000000..0f3f7a4 --- /dev/null +++ b/examples/testsets/apg4b-ex26/in/sample_05.txt @@ -0,0 +1,3 @@ +2 +int x = 1 ; +print_int x ; diff --git a/examples/testsets/apg4b-ex26/in/sample_06.txt b/examples/testsets/apg4b-ex26/in/sample_06.txt new file mode 100644 index 0000000..bca6173 --- /dev/null +++ b/examples/testsets/apg4b-ex26/in/sample_06.txt @@ -0,0 +1,3 @@ +2 +vec a = [ 3 , 4 ] ; +print_vec a ; diff --git a/examples/testsets/apg4b-ex26/in/sample_07.txt b/examples/testsets/apg4b-ex26/in/sample_07.txt new file mode 100644 index 0000000..edbcbb1 --- /dev/null +++ b/examples/testsets/apg4b-ex26/in/sample_07.txt @@ -0,0 +1,5 @@ +4 +int x = 1 ; +int y = 2 ; +int z = 3 ; +print_int x + y + z ; diff --git a/examples/testsets/apg4b-ex26/in/sample_08.txt b/examples/testsets/apg4b-ex26/in/sample_08.txt new file mode 100644 index 0000000..62b13df --- /dev/null +++ b/examples/testsets/apg4b-ex26/in/sample_08.txt @@ -0,0 +1,5 @@ +4 +vec a = [ 1 , 2 , 3 ] ; +vec b = [ 4 , 5 , 6 ] ; +vec c = [ 7 , 8 , 9 ] ; +print_vec a + b + c ; diff --git a/examples/testsets/apg4b-ex26/in/sample_09.txt b/examples/testsets/apg4b-ex26/in/sample_09.txt new file mode 100644 index 0000000..ba24ea5 --- /dev/null +++ b/examples/testsets/apg4b-ex26/in/sample_09.txt @@ -0,0 +1,7 @@ +6 +vec a = [ 1 , 2 ] ; +vec b = a + [ 3 , 4 ] ; +vec c = a - [ 5 , 6 ] ; +print_vec a ; +print_vec b ; +print_vec c ; diff --git a/examples/testsets/apg4b-ex26/out/sample_01.txt b/examples/testsets/apg4b-ex26/out/sample_01.txt new file mode 100644 index 0000000..e21af7e --- /dev/null +++ b/examples/testsets/apg4b-ex26/out/sample_01.txt @@ -0,0 +1,2 @@ +6 +[ 5 7 9 ] diff --git a/examples/testsets/apg4b-ex26/out/sample_02.txt b/examples/testsets/apg4b-ex26/out/sample_02.txt new file mode 100644 index 0000000..22e4cf0 --- /dev/null +++ b/examples/testsets/apg4b-ex26/out/sample_02.txt @@ -0,0 +1,2 @@ +-1 +[ -2 0 2 ] diff --git a/examples/testsets/apg4b-ex26/out/sample_03.txt b/examples/testsets/apg4b-ex26/out/sample_03.txt new file mode 100644 index 0000000..7ed6ff8 --- /dev/null +++ b/examples/testsets/apg4b-ex26/out/sample_03.txt @@ -0,0 +1 @@ +5 diff --git a/examples/testsets/apg4b-ex26/out/sample_04.txt b/examples/testsets/apg4b-ex26/out/sample_04.txt new file mode 100644 index 0000000..b4a1e66 --- /dev/null +++ b/examples/testsets/apg4b-ex26/out/sample_04.txt @@ -0,0 +1 @@ +[ 1 2 ] diff --git a/examples/testsets/apg4b-ex26/out/sample_05.txt b/examples/testsets/apg4b-ex26/out/sample_05.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/examples/testsets/apg4b-ex26/out/sample_05.txt @@ -0,0 +1 @@ +1 diff --git a/examples/testsets/apg4b-ex26/out/sample_06.txt b/examples/testsets/apg4b-ex26/out/sample_06.txt new file mode 100644 index 0000000..b6f6fec --- /dev/null +++ b/examples/testsets/apg4b-ex26/out/sample_06.txt @@ -0,0 +1 @@ +[ 3 4 ] diff --git a/examples/testsets/apg4b-ex26/out/sample_07.txt b/examples/testsets/apg4b-ex26/out/sample_07.txt new file mode 100644 index 0000000..1e8b314 --- /dev/null +++ b/examples/testsets/apg4b-ex26/out/sample_07.txt @@ -0,0 +1 @@ +6 diff --git a/examples/testsets/apg4b-ex26/out/sample_08.txt b/examples/testsets/apg4b-ex26/out/sample_08.txt new file mode 100644 index 0000000..b77f265 --- /dev/null +++ b/examples/testsets/apg4b-ex26/out/sample_08.txt @@ -0,0 +1 @@ +[ 12 15 18 ] diff --git a/examples/testsets/apg4b-ex26/out/sample_09.txt b/examples/testsets/apg4b-ex26/out/sample_09.txt new file mode 100644 index 0000000..20db499 --- /dev/null +++ b/examples/testsets/apg4b-ex26/out/sample_09.txt @@ -0,0 +1,3 @@ +[ 1 2 ] +[ 4 6 ] +[ -4 -4 ] From 208e5ea872a611d4480f6fd748a33a4e34fca9f4 Mon Sep 17 00:00:00 2001 From: Ryo Yamashita Date: Mon, 16 Dec 2019 22:21:21 +0900 Subject: [PATCH 3/5] Add a test for ABC054-C --- examples/abc054-c.rs | 55 ++++++++++++++++++++ examples/tests.ron | 6 ++- examples/testsets/abc054-c/in/sample_01.txt | 4 ++ examples/testsets/abc054-c/in/sample_02.txt | 8 +++ examples/testsets/abc054-c/out/sample_01.txt | 1 + examples/testsets/abc054-c/out/sample_02.txt | 1 + 6 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 examples/abc054-c.rs create mode 100644 examples/testsets/abc054-c/in/sample_01.txt create mode 100644 examples/testsets/abc054-c/in/sample_02.txt create mode 100644 examples/testsets/abc054-c/out/sample_01.txt create mode 100644 examples/testsets/abc054-c/out/sample_02.txt diff --git a/examples/abc054-c.rs b/examples/abc054-c.rs new file mode 100644 index 0000000..63d8f99 --- /dev/null +++ b/examples/abc054-c.rs @@ -0,0 +1,55 @@ +// https://atcoder.jp/contests/abc054/tasks/abc054_c + +use petgraph::csr::Csr; +use petgraph::Undirected; + +fn main() { + // use std::io::{self, Read as _}; + // + // let mut input = "".to_owned(); + // io::stdin().read_to_string(&mut input).unwrap(); + // let mut input = input.split_whitespace(); + // macro_rules! read { + // ([$t:tt; $n:expr]) => { + // (0..$n).map(|_| read!($t)).collect::>() + // }; + // (($($t:tt),+)) => { + // ($(read!($t)),*) + // }; + // (_1based) => { + // read!(usize) - 1 + // }; + // (_bytes) => { + // read!(String).into_bytes() + // }; + // ($ty:ty) => { + // input.next().unwrap().parse::<$ty>().unwrap() + // }; + // } + // + // let (n, m) = read!((usize, usize)); + // let mut abs = read!([(_1based, _1based); m]); + + use proconio::input; + use proconio::marker::Usize1; + + input! { + n: usize, + m: usize, + mut abs: [(Usize1, Usize1); m], + } + + abs.sort(); + let mut g = Csr::<(), (), Undirected, usize>::with_nodes(n); + for (a, b) in abs { + g.add_edge(a, b, ()); + } + let mut ans = 0; + let mut es = (0..n).collect::>(); + permutohedron::heap_recursive(&mut es, |es| { + if es[0] == 0 && es.windows(2).all(|w| g.contains_edge(w[0], w[1])) { + ans += 1; + } + }); + println!("{}", ans); +} diff --git a/examples/tests.ron b/examples/tests.ron index a834c38..a4ee922 100644 --- a/examples/tests.ron +++ b/examples/tests.ron @@ -31,8 +31,12 @@ name: "ABC049 / ARC065: C - 白昼夢 / Daydream", matching: ExactWords, ), + "abc054-c": ( + name: "ABC045: C - One-stroke Path", + matching: ExactWords, + ), "abc120-d": ( - name: "ABC120: D - Decayed Bridges ", + name: "ABC120: D - Decayed Bridges", matching: ExactWords, ), } diff --git a/examples/testsets/abc054-c/in/sample_01.txt b/examples/testsets/abc054-c/in/sample_01.txt new file mode 100644 index 0000000..bc88773 --- /dev/null +++ b/examples/testsets/abc054-c/in/sample_01.txt @@ -0,0 +1,4 @@ +3 3 +1 2 +1 3 +2 3 diff --git a/examples/testsets/abc054-c/in/sample_02.txt b/examples/testsets/abc054-c/in/sample_02.txt new file mode 100644 index 0000000..052f07a --- /dev/null +++ b/examples/testsets/abc054-c/in/sample_02.txt @@ -0,0 +1,8 @@ +7 7 +1 3 +2 7 +3 4 +4 5 +4 6 +5 6 +6 7 diff --git a/examples/testsets/abc054-c/out/sample_01.txt b/examples/testsets/abc054-c/out/sample_01.txt new file mode 100644 index 0000000..0cfbf08 --- /dev/null +++ b/examples/testsets/abc054-c/out/sample_01.txt @@ -0,0 +1 @@ +2 diff --git a/examples/testsets/abc054-c/out/sample_02.txt b/examples/testsets/abc054-c/out/sample_02.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/examples/testsets/abc054-c/out/sample_02.txt @@ -0,0 +1 @@ +1 From b9ae6f32f96b4d9be9251a8b94cd941b0e0a762b Mon Sep 17 00:00:00 2001 From: Ryo Yamashita Date: Tue, 17 Dec 2019 22:55:42 +0900 Subject: [PATCH 4/5] Add a test for ABC084-D --- examples/abc084-d.rs | 52 ++++++++++++++++++++ examples/tests.ron | 4 ++ examples/testsets/abc084-d/in/sample_01.txt | 2 + examples/testsets/abc084-d/in/sample_02.txt | 5 ++ examples/testsets/abc084-d/in/sample_03.txt | 7 +++ examples/testsets/abc084-d/out/sample_01.txt | 1 + examples/testsets/abc084-d/out/sample_02.txt | 4 ++ examples/testsets/abc084-d/out/sample_03.txt | 6 +++ 8 files changed, 81 insertions(+) create mode 100644 examples/abc084-d.rs create mode 100644 examples/testsets/abc084-d/in/sample_01.txt create mode 100644 examples/testsets/abc084-d/in/sample_02.txt create mode 100644 examples/testsets/abc084-d/in/sample_03.txt create mode 100644 examples/testsets/abc084-d/out/sample_01.txt create mode 100644 examples/testsets/abc084-d/out/sample_02.txt create mode 100644 examples/testsets/abc084-d/out/sample_03.txt diff --git a/examples/abc084-d.rs b/examples/abc084-d.rs new file mode 100644 index 0000000..2a06584 --- /dev/null +++ b/examples/abc084-d.rs @@ -0,0 +1,52 @@ +// https://atcoder.jp/contests/abc084/tasks/abc084_d + +use itertools_num::ItertoolsNum as _; +use primal::Sieve; + +#[proconio::fastout] +fn main() { + // use std::io::{self, Read as _}; + // + // let mut input = "".to_owned(); + // io::stdin().read_to_string(&mut input).unwrap(); + // let mut input = input.split_whitespace(); + // macro_rules! read { + // ([$t:tt; $n:expr]) => { + // (0..$n).map(|_| read!($t)).collect::>() + // }; + // (($($t:tt),+)) => { + // ($(read!($t)),*) + // }; + // (_1based) => { + // read!(usize) - 1 + // }; + // (_bytes) => { + // read!(String).into_bytes() + // }; + // ($ty:ty) => { + // input.next().unwrap().parse::<$ty>().unwrap() + // }; + // } + // + // let q = read!(usize); + // let lrs = read!([(usize, usize); q]); + + use proconio::input; + + input! { + q: usize, + lrs: [(usize, usize); q], + } + + // サンプルケースでしか試してないので嘘かもしれない。 + + let hi = lrs.iter().map(|&(_, r)| r).max().unwrap(); + let sieve = Sieve::new(hi); + let nums = (0..=hi) + .map(|k| u32::from(sieve.is_prime(k) && sieve.is_prime((k + 1) / 2))) + .cumsum() + .collect::>(); + for (l, r) in lrs { + println!("{}", nums[r] - nums[l - 1]); + } +} diff --git a/examples/tests.ron b/examples/tests.ron index a4ee922..ec87426 100644 --- a/examples/tests.ron +++ b/examples/tests.ron @@ -35,6 +35,10 @@ name: "ABC045: C - One-stroke Path", matching: ExactWords, ), + "abc084-d": ( + name: "ABC084: D - 2017-like Number", + matching: ExactWords, + ), "abc120-d": ( name: "ABC120: D - Decayed Bridges", matching: ExactWords, diff --git a/examples/testsets/abc084-d/in/sample_01.txt b/examples/testsets/abc084-d/in/sample_01.txt new file mode 100644 index 0000000..6990404 --- /dev/null +++ b/examples/testsets/abc084-d/in/sample_01.txt @@ -0,0 +1,2 @@ +1 +3 7 diff --git a/examples/testsets/abc084-d/in/sample_02.txt b/examples/testsets/abc084-d/in/sample_02.txt new file mode 100644 index 0000000..988378b --- /dev/null +++ b/examples/testsets/abc084-d/in/sample_02.txt @@ -0,0 +1,5 @@ +4 +13 13 +7 11 +7 11 +2017 2017 diff --git a/examples/testsets/abc084-d/in/sample_03.txt b/examples/testsets/abc084-d/in/sample_03.txt new file mode 100644 index 0000000..da66f27 --- /dev/null +++ b/examples/testsets/abc084-d/in/sample_03.txt @@ -0,0 +1,7 @@ +6 +1 53 +13 91 +37 55 +19 51 +73 91 +13 49 diff --git a/examples/testsets/abc084-d/out/sample_01.txt b/examples/testsets/abc084-d/out/sample_01.txt new file mode 100644 index 0000000..0cfbf08 --- /dev/null +++ b/examples/testsets/abc084-d/out/sample_01.txt @@ -0,0 +1 @@ +2 diff --git a/examples/testsets/abc084-d/out/sample_02.txt b/examples/testsets/abc084-d/out/sample_02.txt new file mode 100644 index 0000000..680eb50 --- /dev/null +++ b/examples/testsets/abc084-d/out/sample_02.txt @@ -0,0 +1,4 @@ +1 +0 +0 +1 diff --git a/examples/testsets/abc084-d/out/sample_03.txt b/examples/testsets/abc084-d/out/sample_03.txt new file mode 100644 index 0000000..10cd9ca --- /dev/null +++ b/examples/testsets/abc084-d/out/sample_03.txt @@ -0,0 +1,6 @@ +4 +4 +1 +1 +1 +2 From 84afc9656243aad63f5a2977cbde522022adaed7 Mon Sep 17 00:00:00 2001 From: Ryo Yamashita Date: Tue, 17 Dec 2019 23:54:47 +0900 Subject: [PATCH 5/5] Add a test for ABC142-D --- examples/abc142-d.rs | 53 ++++++++++++++++++++ examples/tests.ron | 4 ++ examples/testsets/abc142-d/in/sample_01.txt | 1 + examples/testsets/abc142-d/in/sample_02.txt | 1 + examples/testsets/abc142-d/in/sample_03.txt | 1 + examples/testsets/abc142-d/out/sample_01.txt | 1 + examples/testsets/abc142-d/out/sample_02.txt | 1 + examples/testsets/abc142-d/out/sample_03.txt | 1 + 8 files changed, 63 insertions(+) create mode 100644 examples/abc142-d.rs create mode 100644 examples/testsets/abc142-d/in/sample_01.txt create mode 100644 examples/testsets/abc142-d/in/sample_02.txt create mode 100644 examples/testsets/abc142-d/in/sample_03.txt create mode 100644 examples/testsets/abc142-d/out/sample_01.txt create mode 100644 examples/testsets/abc142-d/out/sample_02.txt create mode 100644 examples/testsets/abc142-d/out/sample_03.txt diff --git a/examples/abc142-d.rs b/examples/abc142-d.rs new file mode 100644 index 0000000..a8fdb4e --- /dev/null +++ b/examples/abc142-d.rs @@ -0,0 +1,53 @@ +// https://atcoder.jp/contests/abc142/tasks/abc142_d + +use primal::Sieve; + +use std::cmp::max; +use std::collections::HashSet; + +fn main() { + // use std::io::{self, Read as _}; + // + // let mut input = "".to_owned(); + // io::stdin().read_to_string(&mut input).unwrap(); + // let mut input = input.split_whitespace(); + // macro_rules! read { + // ([$t:tt; $n:expr]) => { + // (0..$n).map(|_| read!($t)).collect::>() + // }; + // (($($t:tt),+)) => { + // ($(read!($t)),*) + // }; + // (_1based) => { + // read!(usize) - 1 + // }; + // (_bytes) => { + // read!(String).into_bytes() + // }; + // ($ty:ty) => { + // input.next().unwrap().parse::<$ty>().unwrap() + // }; + // } + // + // let (n, m) = read!((usize, usize)); + + use proconio::input; + + input! { + a: usize, + b: usize, + } + + // サンプルケースでしか試してないので嘘かもしれない。 + + let sieve = Sieve::new(num_integer::sqrt(max(a, b))); + let bases = |k| -> HashSet<_> { + sieve + .factor(k) + .unwrap() + .into_iter() + .map(|(p, _)| p) + .collect() + }; + println!("{}", (&bases(a) & &bases(b)).len() + 1); +} diff --git a/examples/tests.ron b/examples/tests.ron index ec87426..c96e7e5 100644 --- a/examples/tests.ron +++ b/examples/tests.ron @@ -43,5 +43,9 @@ name: "ABC120: D - Decayed Bridges", matching: ExactWords, ), + "abc142-d": ( + name: "ABC124: D - Disjoint Set of Common Divisors", + matching: ExactWords, + ), } ) diff --git a/examples/testsets/abc142-d/in/sample_01.txt b/examples/testsets/abc142-d/in/sample_01.txt new file mode 100644 index 0000000..f86db24 --- /dev/null +++ b/examples/testsets/abc142-d/in/sample_01.txt @@ -0,0 +1 @@ +12 18 diff --git a/examples/testsets/abc142-d/in/sample_02.txt b/examples/testsets/abc142-d/in/sample_02.txt new file mode 100644 index 0000000..2b55e52 --- /dev/null +++ b/examples/testsets/abc142-d/in/sample_02.txt @@ -0,0 +1 @@ +420 660 diff --git a/examples/testsets/abc142-d/in/sample_03.txt b/examples/testsets/abc142-d/in/sample_03.txt new file mode 100644 index 0000000..381ada1 --- /dev/null +++ b/examples/testsets/abc142-d/in/sample_03.txt @@ -0,0 +1 @@ +1 2019 diff --git a/examples/testsets/abc142-d/out/sample_01.txt b/examples/testsets/abc142-d/out/sample_01.txt new file mode 100644 index 0000000..00750ed --- /dev/null +++ b/examples/testsets/abc142-d/out/sample_01.txt @@ -0,0 +1 @@ +3 diff --git a/examples/testsets/abc142-d/out/sample_02.txt b/examples/testsets/abc142-d/out/sample_02.txt new file mode 100644 index 0000000..b8626c4 --- /dev/null +++ b/examples/testsets/abc142-d/out/sample_02.txt @@ -0,0 +1 @@ +4 diff --git a/examples/testsets/abc142-d/out/sample_03.txt b/examples/testsets/abc142-d/out/sample_03.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/examples/testsets/abc142-d/out/sample_03.txt @@ -0,0 +1 @@ +1