using System.Collections.Generic;
public static void Main()
var result = new Ray().solution(new Point2D[] {
new Point2D { x = -1, y = -2 },
new Point2D { x = 1, y = 2 },
new Point2D { x = 2, y = 4 },
Console.WriteLine(result);
public bool IsOnLine(Point2D endPoint1, Point2D endPoint2, Point2D checkPoint)
var result = (checkPoint.x - endPoint1.x) * (endPoint2.y - endPoint1.y) == (endPoint2.x - endPoint1.x) * (checkPoint.y - endPoint1.y)
&& Math.Sign(endPoint1.x) == Math.Sign(checkPoint.x) && Math.Sign(endPoint1.y) == Math.Sign(checkPoint.y); ;
public int solution(Point2D[] A)
var sortedBeamsByLength = new List<Point2DWrapper>();
sortedBeamsByLength.Add(new Point2DWrapper { Point = point });
sortedBeamsByLength.Sort((x, y) =>
if (x.Weight == 0 || x.Weight == 0)
return y.Weight.CompareTo(x.Weight);
for (var i = 0; i < sortedBeamsByLength.Count; i++)
if (i >= sortedBeamsByLength.Count)
var copy = new List<Point2DWrapper>(sortedBeamsByLength);
for (var j = 0; j < copy.Count; j++)
var pointAsStartOfBeam = sortedBeamsByLength[i];
var isPointOnLine = IsOnLine(pointAsStartOfBeam.Point, new Point2D { x = 0, y = 0 }, copy[j].Point);
sortedBeamsByLength.Remove(copy[j]);
return sortedBeamsByLength.Count;
public class Point2DWrapper
public long Weight { get { return Math.Abs(Point.x) + Math.Abs(Point.y); } }