Problem:
Score: 300 points

Problem Statement

We have a 3 \times 3 grid. A number c_{i, j} is written in the square (i, j), where (i, j) denotes the square at the i-th row from the top and the j-th column from the left.

According to Takahashi, there are six integers a_1, a_2, a_3, b_1, b_2, b_3 whose values are fixed, and the number written in the square (i, j) is equal to a_i + b_j.

Determine if he is correct.

Constraints

c_{i, j} \ (1 \leq i \leq 3, 1 \leq j \leq 3) is an integer between 0 and 100 (inclusive).

Input

Input is given from Standard Input in the following format:

c_{1,1} c_{1,2} c_{1,3}
c_{2,1} c_{2,2} c_{2,3}
c_{3,1} c_{3,2} c_{3,3}

Output

If Takahashi's statement is correct, print Yes; otherwise, print No.

Sample Input 1

1 0 1
2 1 2
1 0 1

Sample Output 1

Yes

Takahashi is correct, since there are possible sets of integers such as: a_1=0,a_2=1,a_3=0,b_1=1,b_2=0,b_3=1.

Sample Input 2

2 2 2
2 1 2
2 2 2

Sample Output 2

No

Takahashi is incorrect in this case.

Sample Input 3

0 8 8
0 8 8
0 8 8

Sample Output 3

Yes

Sample Input 4

1 8 6
2 9 7
0 7 7

Sample Output 4

No

Solution in Rust (1.15.1) (judge verdict: Accepted)

use std::io::*;
use std::str::FromStr;
use std::collections::HashMap;
use std::collections::BTreeSet;
use std::collections::HashSet;
use std::cmp;
use std::f64::consts;

fn main() {
    let mut vec: Vec<Vec<i32>> = Vec::new();

    for i in 0..3 {
        let mut each_vec: Vec<i32> =
            (0..3).map(|_| read()).collect();
        vec.push(each_vec);
    }

    let num11 = vec[0][0];
    let num12 = vec[0][1];
    let num13 = vec[0][2];
    let num21 = vec[1][0];
    let num22 = vec[1][1];
    let num23 = vec[1][2];
    let num31 = vec[2][0];
    let num32 = vec[2][1];
    let num33 = vec[2][2];

    let mut isOk: bool = false;

    for a1 in 0..num11+1 {
        let b1 = num11 - a1;
        let b2 = num12 - a1;
        let b3 = num13 - a1;
        let a2 = num21 - b1;
        let a3 = num31 - b1;

        let a1b1 = a1+b1;
        let a1b2 = a1+b2;
        let a1b3 = a1+b3;
        let a2b1 = a2+b1;
        let a2b2 = a2+b2;
        let a2b3 = a2+b3;
        let a3b1 = a3+b1;
        let a3b2 = a3+b2;
        let a3b3 = a3+b3;

        if a1b1 == num11 &&
            a1b2 == num12 &&
            a1b3 == num13 &&
            a2b1 == num21 &&
            a2b2 == num22 &&
            a2b3 == num23 &&
            a3b1 == num31 &&
            a3b2 == num32 &&
            a3b3 == num33 {
            isOk = true;
            break;
        }
    }

    println!("{}", if isOk {"Yes"} else {"No"});
}

fn read<T: FromStr>() -> T {
    let stdin = stdin();
    let stdin = stdin.lock();
    let token: String = stdin
        .bytes()
        .map(|c| c.expect("failed to read char") as char)
        .skip_while(|c| c.is_whitespace())
        .take_while(|c| !c.is_whitespace())
        .collect();
    token.parse().ok().expect("failed to parse token")
}

// 最大公約数
fn gcd(a: i32, b: i32) -> i32 {
    match b {
        0 => a,
        _ => gcd(b, a % b)
    }
}

// 最小公倍数
fn lcm(a: i32, b: i32) -> i32 {
    a * b / gcd(a, b)
}

// 階乗
fn kaijou(n: i32)->i32 {
    if n == 1 {
        return n;
    }
    return n * kaijou(n-1);
}