d5
This commit is contained in:
		
							parent
							
								
									72dc38807d
								
							
						
					
					
						commit
						db7295bcd9
					
				
					 3 changed files with 112 additions and 0 deletions
				
			
		
							
								
								
									
										88
									
								
								d5/d5.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								d5/d5.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,88 @@ | ||||||
|  | package d5 | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"math" | ||||||
|  | 	"strconv" | ||||||
|  | 	"strings" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type point struct { | ||||||
|  | 	x int | ||||||
|  | 	y int | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type segment struct { | ||||||
|  | 	a point | ||||||
|  | 	b point | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func createSegments(lines []string) []segment { | ||||||
|  | 	segments := make([]segment, len(lines)) | ||||||
|  | 	for i, line := range lines { | ||||||
|  | 		points := strings.Split(line, " -> ") | ||||||
|  | 		start := strings.Split(points[0], ",") | ||||||
|  | 		end := strings.Split(points[1], ",") | ||||||
|  | 		x1, _ := strconv.Atoi(start[0]) | ||||||
|  | 		y1, _ := strconv.Atoi(start[1]) | ||||||
|  | 		x2, _ := strconv.Atoi(end[0]) | ||||||
|  | 		y2, _ := strconv.Atoi(end[1]) | ||||||
|  | 		segments[i] = segment{point{x1, y1}, point{x2, y2}} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return segments | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func generatePoints(segments []segment) []point { | ||||||
|  | 	points := []point{} | ||||||
|  | 
 | ||||||
|  | 	for _, segment := range segments { | ||||||
|  | 		if segment.a.x == segment.b.x { | ||||||
|  | 			min := int(math.Min(float64(segment.a.y), float64(segment.b.y))) | ||||||
|  | 			max := int(math.Max(float64(segment.a.y), float64(segment.b.y))) | ||||||
|  | 			for i := min; i <= max; i++ { | ||||||
|  | 				points = append(points, point{segment.a.x, i}) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if segment.a.y == segment.b.y { | ||||||
|  | 			min := int(math.Min(float64(segment.a.x), float64(segment.b.x))) | ||||||
|  | 			max := int(math.Max(float64(segment.a.x), float64(segment.b.x))) | ||||||
|  | 			for i := min; i <= max; i++ { | ||||||
|  | 				points = append(points, point{i, segment.a.y}) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return points | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func findIntersections(points []point) map[point]int { | ||||||
|  | 
 | ||||||
|  | 	intersections := map[point]int{} | ||||||
|  | 
 | ||||||
|  | 	for _, a := range points { | ||||||
|  | 		intersections[a]++ | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return intersections | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func countIntersections(intersections map[point]int) int { | ||||||
|  | 	count := 0 | ||||||
|  | 
 | ||||||
|  | 	for _, crosses := range intersections { | ||||||
|  | 		if crosses > 1 { | ||||||
|  | 			count++ | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return count | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func D5(input string) int { | ||||||
|  | 	lines := strings.Split(strings.TrimSpace(input), "\n") | ||||||
|  | 	segments := createSegments(lines) | ||||||
|  | 	points := generatePoints(segments) | ||||||
|  | 	intersections := findIntersections(points) | ||||||
|  | 	return countIntersections(intersections) | ||||||
|  | } | ||||||
							
								
								
									
										22
									
								
								d5/d5_test.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								d5/d5_test.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,22 @@ | ||||||
|  | package d5 | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"testing" | ||||||
|  | 
 | ||||||
|  | 	"github.com/stretchr/testify/assert" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func TestD5(t *testing.T) { | ||||||
|  | 	input := `0,9 -> 5,9 | ||||||
|  | 8,0 -> 0,8 | ||||||
|  | 9,4 -> 3,4 | ||||||
|  | 2,2 -> 2,1 | ||||||
|  | 7,0 -> 7,4 | ||||||
|  | 6,4 -> 2,0 | ||||||
|  | 0,9 -> 2,9 | ||||||
|  | 3,4 -> 1,4 | ||||||
|  | 0,0 -> 8,8 | ||||||
|  | 5,5 -> 8,2` | ||||||
|  | 
 | ||||||
|  | 	assert.EqualValues(t, 5, D5(input)) | ||||||
|  | } | ||||||
							
								
								
									
										2
									
								
								main.go
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								main.go
									
										
									
									
									
								
							|  | @ -11,6 +11,7 @@ import ( | ||||||
| 	"github.com/fotonmoton/aoc2021/d2" | 	"github.com/fotonmoton/aoc2021/d2" | ||||||
| 	"github.com/fotonmoton/aoc2021/d3" | 	"github.com/fotonmoton/aoc2021/d3" | ||||||
| 	"github.com/fotonmoton/aoc2021/d4" | 	"github.com/fotonmoton/aoc2021/d4" | ||||||
|  | 	"github.com/fotonmoton/aoc2021/d5" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func main() { | func main() { | ||||||
|  | @ -31,4 +32,5 @@ func main() { | ||||||
| 	fmt.Printf("day 3 part 2: %v\n", d3.D3P2(client.Day(3))) | 	fmt.Printf("day 3 part 2: %v\n", d3.D3P2(client.Day(3))) | ||||||
| 	fmt.Printf("day 4: %v\n", d4.D4(client.Day(4))) | 	fmt.Printf("day 4: %v\n", d4.D4(client.Day(4))) | ||||||
| 	fmt.Printf("day 4 part 2: %v\n", d4.D4P2(client.Day(4))) | 	fmt.Printf("day 4 part 2: %v\n", d4.D4P2(client.Day(4))) | ||||||
|  | 	fmt.Printf("day 5: %v\n", d5.D5(client.Day(5))) | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue