アルゴリズムと数学 016

https://atcoder.jp/contests/math-and-algorithm/tasks/math_and_algorithm_p

この問題は、初期値を最初の項にするのでfoldは使えませんが、代わりにreduceが使えます。

    A.into_iter().reduce(gcd).unwrap()

手元でコンパイルすると通りました。しかし、AtCoderで通そうとすると

error[E0599]: no method named `reduce` found for struct `std::vec::IntoIter<i64>` in the current scope

とエラーが出てしまいました。バージョンが違うんですかね。
仕方なく初期値をAの頭にしてfoldを使うと、

    A.into_iter().fold(A[0], gcd)
error[E0382]: borrow of moved value: `A`

ああ、確かに。
結局次のようにしました。

    A[1..].into_iter().fold(A[0], |x, &y| gcd(x, y))

gcdを直接使えませんでした。

// Greatest Common Divisor of N Integers
#![allow(non_snake_case)]


//////////////////// library ////////////////////

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 gcd(n: i64, m: i64) -> i64 {
    if m == 0 {
        n
    }
    else {
        gcd(m, n % m)
    }
}


//////////////////// process ////////////////////

fn read_input() -> Vec<i64> {
    let _N: usize = read();
    let A = read_vec();
    A
}

fn f(A: Vec<i64>) -> i64 {
//  A.into_iter().reduce(gcd).unwrap()
//  A.into_iter().fold(A[0], gcd)
    A[1..].into_iter().fold(A[0], |x, &y| gcd(x, y))
}

fn main() {
    let A = read_input();
    println!("{}", f(A))
}