AtCoder Beginner Contest 246 A(1)

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),
        _                  => ()
    }
}