Problem:
Score : 200 points

Problem Statement

There is a square in the xy-plane. The coordinates of its four vertices are (x_1,y_1),(x_2,y_2),(x_3,y_3) and (x_4,y_4) in counter-clockwise order.
(Assume that the positive x-axis points right, and the positive y-axis points up.)

Takahashi remembers (x_1,y_1) and (x_2,y_2), but he has forgot (x_3,y_3) and (x_4,y_4).

Given x_1,x_2,y_1,y_2, restore x_3,y_3,x_4,y_4. It can be shown that x_3,y_3,x_4 and y_4 uniquely exist and have integer values.

Constraints

|x_1|,|y_1|,|x_2|,|y_2| \leq 100

(x_1,y_1) ≠ (x_2,y_2)

All values in input are integers.

Input

Input is given from Standard Input in the following format:

x_1 y_1 x_2 y_2

Output

Print x_3,y_3,x_4 and y_4 as integers, in this order.

Sample Input 1

0 0 0 1

Sample Output 1

-1 1 -1 0

(0,0),(0,1),(-1,1),(-1,0) is the four vertices of a square in counter-clockwise order.
Note that (x_3,y_3)=(1,1),(x_4,y_4)=(1,0) is not accepted, as the vertices are in clockwise order.

Sample Input 2

2 3 6 6

Sample Output 2

3 10 -1 7

Sample Input 3

31 -41 -59 26

Sample Output 3

-126 -64 -36 -131

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

macro_rules! input {
    (source = $s:expr, $($r:tt)*) => {
        let mut iter = $s.split_whitespace();
        let mut next = || { iter.next().unwrap() };
        input_inner!{next, $($r)*}
    };
    ($($r:tt)*) => {
        let stdin = std::io::stdin();
        let mut bytes = std::io::Read::bytes(std::io::BufReader::new(stdin.lock()));
        let mut next = move || -> String{
            bytes
                .by_ref()
                .map(|r|r.unwrap() as char)
                .skip_while(|c|c.is_whitespace())
                .take_while(|c|!c.is_whitespace())
                .collect()
        };
        input_inner!{next, $($r)*}
    };
}
 
macro_rules! input_inner {
    ($next:expr) => {};
    ($next:expr, ) => {};
 
    ($next:expr, $var:ident : $t:tt $($r:tt)*) => {
        let $var = read_value!($next, $t);
        input_inner!{$next $($r)*}
    };
}
 
macro_rules! read_value {
    ($next:expr, ( $($t:tt),* )) => {
        ( $(read_value!($next, $t)),* )
    };
 
    ($next:expr, [ $t:tt ; $len:expr ]) => {
        (0..$len).map(|_| read_value!($next, $t)).collect::<Vec<_>>()
    };
 
    ($next:expr, chars) => {
        read_value!($next, String).chars().collect::<Vec<char>>()
    };
 
    ($next:expr, usize1) => {
        read_value!($next, usize) - 1
    };
 
    ($next:expr, $t:ty) => {
        $next().parse::<$t>().expect("Parse error")
    };
}

fn main() {
/*ABC109_A
    let ab=read_a();
    let a:i64=ab[0];
    let b:i64=ab[1];
    let mut j=false;
    for c in 1..4{
        if a*b*(c as i64)%2==1{j=true;}
    }
    if j{println!("Yes")} else {println!("No")};
*/

//use std::collections::BTreeSet;
/*ABC109_B
    let n=read_n();
    let mut w:Vec<Vec<char>>=vec!();
    for _ in 0..n{w.push(read_s())};
    //println!("{},{:?}", n,w);
    let mut j=true;
    if w.iter().collect::<BTreeSet<_>>().len() !=n{j=false};
    for i in 0..n-1{
        if w[i][w[i].len()-1]!=w[i+1][0]{j=false};
    }
    if j{println!("Yes");} else {println!("No");}
*/

//fn abs(a:i64)->i64{if a>0{a} else {-a}}
/*ABC109_C
    let nx:Vec<i64>=read_a();
    let n=nx[0] as usize;
    let x=nx[1];
    let mut a:Vec<i64>=read_a();
    let mut b:Vec<i64>=vec!();
    for i in 0..n{
        b.push(a[i as usize]-x);
    }
    fn gcd(a: i64, b: i64) -> i64 {
        if b == 0 {a} else {gcd(b, a % b)}
    }
    let mut ans=b[0];
    for i in 0..n{ans=gcd(ans,b[i]);}
    fn abs(a:i64)->i64{if a>0{a} else {-a}}
    ans=abs(ans);
    println!("{}",ans);
*/
/*ABC109_D
    input!{
        h: usize,
        w: usize,
        a: [[i32; w]; h],
    }
    let mut a=a;
    let mut n:usize=0;
    let mut ans=vec![];
    for i in 0..h{
        for j in 0..w{
            if j+1<w{
                if a[i][j]%2==1{
                    n+=1; a[i][j]-=1;a[i][j+1]+=1; ans.push((i+1,j+1,i+1,j+2));
                }
            }else if i+1<h{
                if a[i][j]%2==1{
                    n+=1; a[i][j]-=1;a[i+1][j]+=1; ans.push((i+1,j+1,i+2,j+1));
                }
            }
        }
    }
    println!("{}", n);
    for (x1,y1,x2,y2) in ans{
        println!("{} {} {} {}", x1,y1,x2,y2);
    }
*/

/*ABC108_A
    input!{
        k:usize,
    }
    let ans = {
        if k%2==0{k*k/4}else{k/2*(k-k/2)}
    };
    println!("{}",ans);
*/
/*ABC108_B
*/
    input!{
        xy:[i32;4]
    }
    let x1=xy[0];
    let y1=xy[1];
    let x2=xy[2];
    let y2=xy[3];
    let x3=x2-y2+y1;
    let y3=y2+x2-x1;
    let x4=x1-y2+y1;
    let y4=y1+x2-x1;
    println!("{} {} {} {}", x3,y3,x4,y4);

















}