浏览代码

Solved part1

Piotr Czajkowski 1 年之前
父节点
当前提交
f6172534e2
共有 1 个文件被更改,包括 75 次插入16 次删除
  1. 75 16
      code.go

+ 75 - 16
code.go

@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"log"
 	"os"
+	"strings"
 )
 
 const (
@@ -19,7 +20,7 @@ type Point struct {
 	direction int
 }
 
-func (p *Point) move(maze []string, height int, width int) bool {
+func (p *Point) move(maze [][]byte, height int, width int) bool {
 	switch maze[p.y][p.x] {
 	case '|':
 		if p.direction == Up && p.y-1 >= 0 {
@@ -83,15 +84,68 @@ func (p *Point) move(maze []string, height int, width int) bool {
 	return false
 }
 
-func part1(maze []string) int {
-	biggest := 0
+const (
+	verticalAbove   = "|7F"
+	verticalBelow   = "|LJ"
+	horizontalLeft  = "-LF"
+	horizontalRight = "-J7"
+)
+
+func establishS(s Point, maze [][]byte, height int, width int) (byte, Point) {
+	var left, right, up, down bool
+	if s.x-1 >= 0 && strings.Contains(horizontalLeft, string(maze[s.y][s.x-1])) {
+		left = true
+	}
+
+	if s.x+1 < width && strings.Contains(horizontalRight, string(maze[s.y][s.x+1])) {
+		right = true
+	}
+
+	if s.y-1 >= 0 && strings.Contains(verticalAbove, string(maze[s.y-1][s.x])) {
+		up = true
+	}
+
+	if s.y+1 < height && strings.Contains(verticalBelow, string(maze[s.y+1][s.x])) {
+		down = true
+	}
+
+	var char byte
+	if left {
+		if right {
+			char = '-'
+			s.direction = Right
+		} else if up {
+			char = 'J'
+			s.direction = Down
+		} else if down {
+			char = '7'
+			s.direction = Up
+		}
+	} else if right {
+		if up {
+			char = 'L'
+			s.direction = Down
+		} else if down {
+			char = 'F'
+			s.direction = Up
+		}
+	} else if up {
+		char = '|'
+		s.direction = Down
+	}
+
+	return char, s
+}
+
+func part1(maze [][]byte) int {
 	height := len(maze)
 	width := len(maze[0])
 	for y := range maze {
 		for x := range maze[y] {
-			if maze[y][x] == 'F' {
-				current := Point{y: y, x: x}
-				start := Point{y: y, x: x}
+			if maze[y][x] == 'S' {
+				char, start := establishS(Point{y: y, x: x}, maze, height, width)
+				maze[y][x] = char
+				current := start
 				steps := 0
 				for {
 					if !current.move(maze, height, width) {
@@ -100,24 +154,20 @@ func part1(maze []string) int {
 					steps++
 
 					if current.x == start.x && current.y == start.y {
-						steps /= 2
-						if steps > biggest {
-							biggest = steps
-						}
-
-						break
+						return steps / 2
 					}
 				}
 			}
 		}
 	}
 
-	return biggest
+	return -1
 }
 
-func readInput(file *os.File) []string {
+func readInput(file *os.File) [][]byte {
 	scanner := bufio.NewScanner(file)
-	var maze []string
+	var maze [][]byte
+	width := -1
 
 	for scanner.Scan() {
 		line := scanner.Text()
@@ -125,7 +175,16 @@ func readInput(file *os.File) []string {
 			break
 		}
 
-		maze = append(maze, line)
+		if width < 0 {
+			width = len(line)
+		}
+
+		row := make([]byte, width)
+		for i := range line {
+			row[i] = line[i]
+		}
+
+		maze = append(maze, row)
 	}
 
 	return maze