use std::io::*; use std::str::FromStr; fn main() { let a = (0..5).map(|_| read()).collect::>(); exec(a); } fn exec(r: Vec) { let acc: Vec> = vec![]; let result = rec_pair(acc, r); println!("{}", make_hands(result)); } fn make_hands(mut r: Vec>) -> String { r.sort_by(|a, b| b.len().cmp(&a.len())); match r.len() { 4 => String::from("ONE PAIR"), 3 => three_or_two(r), 2 => fullhouse_or_no(r), _ => String::from("NO HAND"), } } fn three_or_two(r: Vec>) -> String { if r[0].len() == 3 { return String::from("THREE CARD"); } String::from("TWO PAIR") } fn fullhouse_or_no(r: Vec>) -> String { if r[0].len() == 3 { return String::from("FULL HOUSE"); } String::from("NO HAND") } fn rec_pair(mut acc: Vec>, mut r: Vec) -> Vec> { if r.is_empty() { return acc; } else { let head = r.remove(0); let mut b: Vec = vec![]; let mut remove_index: Vec = vec![]; b.push(head); for (i, v) in r.iter().enumerate() { if &head == v { remove_index.push(i); b.push(r[i]); } } remove_index.sort_by(|a, b| b.cmp(a)); for i in remove_index { r.remove(i); } acc.push(b); } rec_pair(acc, r) } fn read() -> T { let stdin = stdin(); let stdin = stdin.lock(); let token: String = stdin .bytes() .map(|c| c.expect("failed to read char") as char) .skip_while(|c| c.is_whitespace()) .take_while(|c| !c.is_whitespace()) .collect(); token.parse().ok().expect("failed to parse token") }