https://atcoder.jp/contests/abc253/tasks/abc253_a
Pythonでこんな風に書いてみました。
def median(v): w = sorted(v) if len(w) % 2 == 1: return w[len(w)/2] else: return (w[len(w)/2-1] + w[len(w)/2]) * 0.5 def F(a, b, c): return YesNo(median((a, b, c)) == b)
Rustでも似た感じに書いてみます。
この書き方だと、medianは整数になるとは限らないので、f64を返すことにします。
引数のvをソートしますが、vを直接ソートするのは気持ちが悪いので、vのクローンを作ってそれをソートすることにします。
let mut w = v.clone(); w.sort();
Rustではifは式らしいので、こういう書き方ができます。
return if w.len() % 2 == 1 { w[w.len()/2] as f64 } else { ((w[w.len()/2-1] + w[w.len()/2]) as f64) * 2.0 }
else以下で、asの前に括弧が必要です。無いと
no implementation for `i32 + f64`
と怒られます。asの優先順位は+より高いようです。
Rustでは単に2.0と書くとf32のようですが、f64とf32の積はf64になるようです。
"Yes"や"No"は&strというプリミティブな文字列型で、それとは別にStringといういろいろメソッドが使える型があって、これに変更しないといけないようです。
#![allow(non_snake_case)] 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() } fn read_vec<T: std::str::FromStr>() -> Vec<T> { read::<String>().split_whitespace() .map(|e| e.parse().ok().unwrap()).collect() } fn YesNo(b: bool) -> String { return (if b { "Yes" } else { "No" }).to_string() } fn median(v: &Vec<i32>) -> f64 { let mut w = v.clone(); w.sort(); return if w.len() % 2 == 1 { w[w.len()/2] as f64 } else { ((w[w.len()/2-1] + w[w.len()/2]) as f64) * 2.0 } } fn main() { let v: Vec<i32> = read_vec(); let m = median(&v); println!("{}", YesNo((v[1] as f64) == m)) }