https://atcoder.jp/contests/abc256/tasks/abc256_c
こうすると怒られます。
if hs.iter().sum() != ws.iter().sum() {
40 | if hs.iter().sum() != ws.iter().sum() { | ^^^ cannot infer type for type parameter `S` declared on the associated function `sum`
なぜ型を推定できないのかよくわかりませんが、次のように型を指定すれば通ります。
if hs.iter().sum::<i32>() != ws.iter().sum() {
// Filling 3x3 array #![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 read_input() -> (Vec<i32>, Vec<i32>) { let v = read_vec(); (vec![v[0], v[1], v[2]], vec![v[3], v[4], v[5]]) } fn collect_pairs(h: i32) -> Vec<(i32, i32)> { let mut pairs = Vec::<(i32, i32)>::new(); for n1 in 1..(h-1) { for n2 in 1..(h-n1) { pairs.push((n1, n2)) } } pairs } fn f(hs: Vec<i32>, ws: Vec<i32>) -> usize { let is_satisfied = |a11: i32, a12: i32, a21: i32, a22: i32| -> bool { let a13 = hs[0] - a11 - a12; let a23 = hs[1] - a21 - a22; let a31 = ws[0] - a11 - a21; let a32 = ws[1] - a12 - a22; let a33 = ws[2] - a13 - a23; a13 > 0 && a23 > 0 && a31 > 0 && a32 > 0 && a33 > 0 }; if hs.iter().sum::<i32>() != ws.iter().sum() { return 0 } let pairs1 = collect_pairs(hs[0]); let pairs2 = collect_pairs(hs[1]); let mut counter: usize = 0; for (a11, a12) in pairs1.iter() { for (a21, a22) in pairs2.iter() { if is_satisfied(*a11, *a12, *a21, *a22) { counter += 1 } } } counter } fn main() { let v = read_input(); let hs = v.0; let ws = v.1; println!("{}", f(hs, ws)) }