Browse Source

Robot is moving

Piotr Czajkowski 1 week ago
parent
commit
e74dc9c11a
1 changed files with 53 additions and 1 deletions
  1. 53 1
      15/code.go

+ 53 - 1
15/code.go

@@ -58,6 +58,58 @@ func readInput(file *os.File) (*Point, [][]byte, []byte) {
 	return robot, matrix, moves
 }
 
+func moveBox(x, y int, matrix [][]byte, xPlus, yPlus int) bool {
+	field := matrix[y][x]
+	if field == '#' {
+		return false
+	}
+
+	if field == 'O' {
+		if !moveBox(x+xPlus, y+yPlus, matrix, xPlus, yPlus) {
+			return false
+		}
+	}
+
+	matrix[y][x] = 'O'
+	return true
+}
+
+func moveRobot(robot *Point, matrix [][]byte, x, y int) {
+	matrix[robot.y][robot.x] = '.'
+	field := matrix[robot.y+y][robot.x+x]
+	if field == '#' {
+		return
+	}
+
+	if field == 'O' {
+		if !moveBox(robot.x+x, robot.y+y, matrix, x, y) {
+			return
+		}
+	}
+
+	robot.x += x
+	robot.y += y
+}
+
+func processMoves(robot *Point, matrix [][]byte, moves []byte) {
+	for _, move := range moves {
+		switch move {
+		case '^':
+			moveRobot(robot, matrix, 0, -1)
+			fmt.Println(robot, matrix)
+		case 'v':
+			moveRobot(robot, matrix, 0, 1)
+			fmt.Println(robot, matrix)
+		case '<':
+			moveRobot(robot, matrix, -1, 0)
+			fmt.Println(robot, matrix)
+		case '>':
+			moveRobot(robot, matrix, 1, 0)
+			fmt.Println(robot, matrix)
+		}
+	}
+}
+
 func main() {
 	if len(os.Args) < 2 {
 		log.Fatal("You need to specify a file!")
@@ -70,5 +122,5 @@ func main() {
 	}
 
 	robot, matrix, moves := readInput(file)
-	fmt.Println(robot, matrix, moves)
+	processMoves(robot, matrix, moves)
 }