Task
Implement a Vector class (or a set of functions) that models a Physical Vector. The four basic operations and a pretty print function should be implemented.



The Vector may be initialized in any reasonable way.

 Start and end points, and direction
 Angular coefficient and value (length)


The four operations to be implemented are:

 Vector  +  Vector addition
 Vector  -  Vector subtraction
 Vector  *  scalar multiplication
 Vector  /  scalar division


def polar(r; angle):
  [ r*(angle|cos), r*(angle|sin) ];
 
# If your jq allows multi-arity functions, you may wish to uncomment the following line:
# def polar(r): [r, 0];
 
def polar2vector: polar(.[0]; .[1]);
 
def vector(x; y):
  if (x|type) == "number" and (y|type) == "number" then [x,y]
  else error("TypeError")
  end;
 
# Input: an array of same-dimensional vectors of any dimension to be added
def sum:
  def sum2: .[0] as $a | .[1] as $b | reduce range(0;$a|length) as $i ($a; .[$i] += $b[$i]);
  if length <= 1 then .
  else reduce .[1:][] as $v (.[0] ; [., $v]|sum2)
  end;
 
def multiply(scalar): [ .[] * scalar ];
 
def negate: multiply(-1);
 
def minus(v): [., (v|negate)] | sum;
 
def divide(scalar):
  if scalar == 0 then error("division of a vector by 0 is not supported")
  else [ .[] / scalar ]
  end;
 
def r: (.[0] | .*.) + (.[1] | .*.) | sqrt;
 
def atan2:
  def pi: 1 | atan * 4;
  def sign: if . < 0 then -1 elif . > 0 then 1 else 0 end;
  .[0] as $x | .[1] as $y
  | if $x == 0 then $y | sign * pi / 2
    else  ($y / $x) | if $x > 0 then atan elif . > 0 then atan - pi else atan + pi end
    end;
 
def angle: atan2;
 
def topolar: [r, angle];