Piotr Czajkowski 3 dagar sedan
förälder
incheckning
b07dc5e54c
1 ändrade filer med 65 tillägg och 2 borttagningar
  1. 65 2
      18/code.go

+ 65 - 2
18/code.go

@@ -8,7 +8,8 @@ import (
 )
 
 type Point struct {
-	y, x int
+	y, x  int
+	steps int
 }
 
 func (p Point) key() string {
@@ -37,6 +38,68 @@ func readInput(file *os.File) []Point {
 	return points
 }
 
+var directions [][]int = [][]int{
+	{0, -1}, {1, 0}, {0, 1}, {-1, 0},
+}
+
+func getObstaclesMap(obstacles []Point, howMany, xMax, yMax int) map[string]bool {
+	obstaclesMap := make(map[string]bool)
+
+	for i := 0; i < howMany; i++ {
+		if obstacles[i].x < xMax && obstacles[i].y < yMax {
+			obstaclesMap[obstacles[i].key()] = true
+		}
+	}
+
+	return obstaclesMap
+}
+
+func getMoves(current Point, obstaclesMap map[string]bool, xMax, yMax int) []Point {
+	var moves []Point
+	for _, direction := range directions {
+		move := Point{x: current.x + direction[0], y: current.y + direction[1], steps: current.steps + 1}
+		if move.x < 0 || move.y < 0 || move.x > xMax || move.y > yMax {
+			continue
+		}
+
+		if !obstaclesMap[move.key()] {
+			moves = append(moves, move)
+		}
+	}
+
+	return moves
+}
+
+func hike(obstaclesMap map[string]bool, xMax, yMax int) int {
+	steps := 1000000000
+	visited := make(map[string]int)
+
+	goal := Point{x: xMax, y: yMax}
+	moves := []Point{Point{x: 0, y: 0}}
+	for len(moves) > 0 {
+		current := moves[0]
+		moves = moves[1:]
+		if current.x == goal.x && current.y == goal.y && current.steps < steps {
+			steps = current.steps
+		}
+
+		newMoves := getMoves(current, obstaclesMap, xMax, yMax)
+		for _, newMove := range newMoves {
+			if visited[newMove.key()] == 0 || visited[newMove.key()] >= newMove.steps {
+				moves = append(moves, newMove)
+				visited[newMove.key()] = newMove.steps
+			}
+		}
+	}
+
+	return steps
+}
+
+func part1(obstacles []Point, howMany, xMax, yMax int) int {
+	obstaclesMap := getObstaclesMap(obstacles, howMany, xMax, yMax)
+	return hike(obstaclesMap, xMax, yMax)
+}
+
 func main() {
 	if len(os.Args) < 2 {
 		log.Fatal("You need to specify a file!")
@@ -49,5 +112,5 @@ func main() {
 	}
 
 	obstacles := readInput(file)
-	fmt.Println(obstacles)
+	fmt.Println("Part1:", part1(obstacles, 12, 6, 6))
 }