https://atcoder.jp/contests/abc246/tasks/abc246_a
各座標をカウントして、1個しかない方が欠けた座標です。
Pythonで辞書を作ります。
x_counter = Counter(x for x, y in points)
rustで辞書はHashMapやBTreeMapです。
let v: Vec<i32> = points.iter().map(|pt| pt.x).collect(); let mut m = HashMap::<i32,i32>::new(); for x in v.iter() { let counter = m.entry(*x).or_insert(0); *counter += 1; }
entryでそのキーの値をリファレンスで取り出して、キーが無ければ0を挿入しています。
そして、値が1のキーを取り出します。
let res = m.iter().filter(|(&_key, &val)| val == 1).next(); match res { Some((&key, &_val)) => Some(key), _ => None }
タプルもちゃんとパターンマッチしてくれます。
&S[..S.len()-1];
これで最後の文字以外の文字列を取れたことになります。型は&strになります。
あとは"0"と結合すればよいですが、文字列の結合はString + &strなので、
// 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() } 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(v: &Vec<i32>) -> Option<i32> { let mut m = HashMap::<i32,i32>::new(); for x in v.iter() { 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).collect(); let some_x = select(&xs); let ys = points.iter().map(|pt| pt.y).collect(); let some_y = select(&ys); match (some_x, some_y) { (Some(x), Some(y)) => println!("{} {}", x, y), _ => () } }