| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 | package main// Tuple3Int ...type Tuple3Int struct {	_1 int	_2 int	_3 int}/** * Definition for a point. * type Point struct { *     X int *     Y int * } */func maxPoints(points []Point) (maxPts int) {	xAxisDir := make(map[int]int)	yAxisDir := make(map[int]int)	weight := make(map[Point]int)	for i := range points {		xAxisDir[points[i].X]++		yAxisDir[points[i].Y]++		weight[points[i]]++	}	lines := make(map[Tuple3Int]map[Point]int)	for i := 0; i < len(points); i++ {		for j := i + 1; j < len(points); j++ {			if points[i].X != points[j].X && points[i].Y != points[j].Y {				pair := getParamsOfLine(points[i], points[j])				if _, ok := lines[pair]; !ok {					lines[pair] = make(map[Point]int)				}				if _, ok := lines[pair][points[i]]; !ok {					lines[pair][points[i]] += weight[points[i]]				}				if _, ok := lines[pair][points[j]]; !ok {					lines[pair][points[j]] += weight[points[j]]				}			}		}	}	for _, v := range xAxisDir {		if v > maxPts {			maxPts = v		}	}	for _, v := range yAxisDir {		if v > maxPts {			maxPts = v		}	}	for _, m := range lines {		pts := 0		for _, v := range m {			pts += v		}		if pts > maxPts {			maxPts = pts		}	}	return}// Caculate params of given line ay = bx + c, return Tuple3Int{a, b, c}func getParamsOfLine(p1, p2 Point) Tuple3Int {	y, x := p2.Y-p1.Y, p2.X-p1.X	a, b := x, y	for b != 0 {		a, b = b, a%b	}	return Tuple3Int{x / a, y / a, (x*p1.Y - y*p1.X) / a}}// func main() {// 	println(maxPoints(// 		[]Point{{1, 1}, {2, 2}, {1, 1}}))// 	println(maxPoints(// 		[]Point{{1, 1}, {2, 2}, {3, 3}}))// 	println(maxPoints(// 		[]Point{{1, 1}, {3, 2}, {5, 3}, {4, 1}, {2, 3}, {1, 4}}))// }
 |