use std::collections::HashMap; use std::fmt::Debug; use std::io; use std::str::FromStr; struct Scanner where R: io::BufRead, W: io::Write, { reader: R, writer: W, #[allow(dead_code)] buffer: Vec, } impl Scanner { fn new(reader: R, writer: W) -> Self where R: io::BufRead, W: io::Write, { Self { reader, writer, buffer: Vec::new(), } } #[allow(dead_code)] fn next(&mut self) -> T { loop { if let Some(token) = self.buffer.pop() { return token.parse().ok().expect("Failed parse"); } let mut input = String::new(); self.reader.read_line(&mut input).expect("Failed read"); self.buffer = input.split_whitespace().rev().map(String::from).collect(); } } #[allow(dead_code)] fn next_vec(&mut self) -> Vec where ::Err: Debug, { let mut input = String::new(); self.reader.read_line(&mut input).expect("Failed read"); input .split_whitespace() .rev() .map(|x| x.parse::().unwrap()) .collect() } } fn solve(scan: &mut Scanner) { let records = vec![ vec![ "gray", "brown", "green", "cyan", "blue", "yellow", "orange", "red", ], vec!["gray", "green", "blue", "yellow", "red"], vec!["gray", "green", "cyan", "blue", "violet", "orange", "red"], ]; let mut sets = HashMap::new(); for i in records[0].iter() { for j in records[1].iter() { for k in records[2].iter() { let mut a = vec![ i.to_owned().to_owned(), j.to_owned().to_owned(), k.to_owned().to_owned(), ]; a.sort_by(|a, b| a.cmp(&b)); sets.entry(a) .and_modify(|x: &mut usize| { *x += 1; }) .or_insert(1); } } } let mut input = scan.next_vec::(); input.sort_by(|a, b| a.cmp(&b)); if let Some(x) = sets.get(&input) { if x == &1 { writeln!(scan.writer, "Yes").ok(); } else { writeln!(scan.writer, "No").ok(); } } else { writeln!(scan.writer, "No").ok(); } } fn main() { let stdin = io::stdin(); let stdout = &mut io::BufWriter::new(io::stdout()); let mut scan = Scanner::new(stdin.lock(), stdout); solve(&mut scan); } #[cfg(test)] mod tests { use super::*; fn get_output(input: &[u8]) -> String { let stdout = Vec::new(); let mut scan = Scanner::new(&input[..], stdout); solve(&mut scan); let output = String::from_utf8(scan.writer).expect("what?"); let output = output.trim(); output.to_string() } #[test] fn case_0() { let output = get_output(b"gray green blue"); assert_eq!(output, "No".to_owned()); } #[test] fn case_1() { let output = get_output(b"violet red orange"); assert_eq!(output, "Yes".to_owned()); } #[test] fn case_2() { let output = get_output(b"red red red"); assert_eq!(output, "Yes".to_owned()); } #[test] fn case_3() { let output = get_output(b"brown gray gray"); assert_eq!(output, "Yes".to_owned()); } #[test] fn case_4() { let output = get_output(b"cyan cyan brown"); assert_eq!(output, "No".to_owned()); } #[test] fn case_5() { let output = get_output(b"violet yellow yellow"); assert_eq!(output, "Yes".to_owned()); } #[test] fn case_6() { let output = get_output(b"violet blue blue"); assert_eq!(output, "Yes".to_owned()); } #[test] fn case_7() { let output = get_output(b"orange cyan yellow"); assert_eq!(output, "No".to_owned()); } #[test] fn case_8() { let output = get_output(b"brown brown brown"); assert_eq!(output, "No".to_owned()); } #[test] fn case_9() { let output = get_output(b"cyan blue cyan"); assert_eq!(output, "Yes".to_owned()); } }