# Daily Codewars #14

# Question

http://www.codewars.com/kata/53b7bc844db8fde50800020a/train/javascript Given some points (cartesian coordinates), return true if all of them lie on a line.

onLine([[1,2], [7, 4], [22, 9]]);       // returns true
onLine([[1,2], [-3, -14], [22, 9]]);    // returns false

좌표계에서 일직선에 있는지 구하는 문제다. 배열엔 3개뿐이 아니고, 여러개 또는 0개 혹은 같은 숫자들이 들어갈 수 있는 것을 유념해야 한다.

# My Solution

function onLine(points) {
  var prevSlope;
  if(points.length<=2) return true;

  for(i=0; i<points.length-1; i++){
    slope = (points[i][0]-points[i+1][0])/(points[i][1]-points[i+1][1])
    if(!prevSlope || isNaN(prevSlope)) prevSlope = slope;
    if(isNaN(slope)) continue;
    if(prevSlope != slope) return false;
  }
  return true;
}

처음 문제를 봤을땐 '뭐 이리 쉬운게 6kyu단계야' 했는데 막상 하니 오래걸렸다. NaN과 -infinite, +infinite를 구별해야 하고, 같은 배열(like [[1,2], [1,2], [2,4], [2,4]])따위를 처리하는것이 생각보다 까다로웠다.

# @lv.D's Solution

function onLine(points) {
  if (points.length < 3) return true;
  var x = points.shift();
  var a = undefined;
  return points.
    filter (function(y) { return !(x[0] == y[0] && x[1] == y[1]) }).
    map    (function(y) { return a = (x[0] - y[0])/(x[1] - y[1]) }).
    every  (function(y) { return y == a });
}

이 뭐... 아 뭐 이사람은 이렇게 풀 수도 있겠지... 그래...

# @Wisehorn's Solution

function onLine(points) {
  if (points.length < 3) return true;
  
  var returnValue = collinear.apply(null, points.slice(i, 3));
  for(var i = 1; i < points.length - 2; i++) {
    returnValue = returnValue && collinear.apply(null, points.slice(i, i+3));
  }

  return returnValue;

  function collinear(point1, point2, point3) {
    return (point1[1] - point2[1]) * (point1[0] - point3[0]) == 
           (point1[1] - point3[1]) * (point1[0] - point2[0]);
  }
}

나랑 비슷하게 for문을 돌렸다.