https://atcoder.jp/contests/abc246/tasks/abc246_a
selectにVecではなく、できればiteratorを渡したいですよね。
オブジェクト指向が抜けないと
fn select(v: Iterator<i32>) -> Option<i32> {
みたいに書きそうですが、std::iter::Iteratorはtraitなので、Genericsを使って、
fn select<T: Iterator<Item=i32>>(v: T) -> Option<i32> {
と書かないといけないんですね。
// Four Points #![allow(non_snake_case)] use std::collections::HashMap; fn read<T: std::str::FromStr>() -> T { let mut line = String::new(); std::io::stdin().read_line(&mut line).ok(); line.trim().parse().ok().unwrap() } #[derive(Copy, Clone)] struct Point { x: i32, y: i32, } fn read_point() -> Point { let v: Vec<i32> = read::<String>().split_whitespace() .map(|e| e.parse().ok().unwrap()).collect(); Point { x: v[0], y: v[1] } } fn read_points() -> Vec<Point> { (0..3).map(|_| read_point()).collect() } fn select<T: Iterator<Item=i32>>(v: T) -> Option<i32> { let mut m = HashMap::<i32,i32>::new(); for x in v { let counter = m.entry(x).or_insert(0); *counter += 1; } let res = m.iter().filter(|(&_key, &val)| val == 1).next(); match res { Some((&key, &_val)) => Some(key), _ => None } } fn main() { let points = read_points(); let xs = points.iter().map(|pt| pt.x); let some_x = select(xs); let ys = points.iter().map(|pt| pt.y); let some_y = select(ys); match (some_x, some_y) { (Some(x), Some(y)) => println!("{} {}", x, y), _ => () } }