package main import ( "bufio" "fmt" "os" "strings" ) func findPosition(layout [][]string) []int { position := []int{} for i := range layout { for j := range layout[i] { if layout[i][j] == "^" { position = append(position, i, j) } } } return position } func findObstacles(layout [][]string) [][]int { positions := [][]int{} for i := range layout { for j := range layout[i] { if layout[i][j] == "#" { positions = append(positions, []int{i,j}) } } } return positions } func calcPath(layout [][]string) ([][]int, bool) { circle := false direction := "up" guardPosition:=findPosition(layout) inBound := true currentPosition := guardPosition path := [][]int{currentPosition} for inBound && !circle { if direction == "up" { if currentPosition[0] == 0 { inBound = false break } else if layout[currentPosition[0]-1][currentPosition[1]] == "#" { direction = "right" continue } else { currentPosition = []int{currentPosition[0]-1, currentPosition[1]} if checkCircle(path, currentPosition) { circle = true } else { path = append(path, currentPosition) } } } if direction == "right" { if currentPosition[1] == len(layout)-1 { inBound = false break } else if layout[currentPosition[0]][currentPosition[1]+1] == "#" { direction = "down" continue } else { currentPosition = []int{currentPosition[0], currentPosition[1]+1} if checkCircle(path, currentPosition) { circle = true } else { path = append(path, currentPosition) } } } if direction == "down" { if currentPosition[0] == len(layout)-1 { inBound = false break } else if layout[currentPosition[0]+1][currentPosition[1]] == "#" { direction = "left" continue } else { currentPosition = []int{currentPosition[0]+1, currentPosition[1]} if checkCircle(path, currentPosition) { circle = true } else { path = append(path, currentPosition) } } } if direction == "left" { if currentPosition[1] == 0 { inBound = false break } else if layout[currentPosition[0]][currentPosition[1]-1] == "#" { direction = "up" continue } else { currentPosition = []int{currentPosition[0], currentPosition[1]-1} if checkCircle(path, currentPosition) { circle = true } else { path = append(path, currentPosition) } } } } return path, circle } func checkCircle(path [][]int, position []int) bool { result := false for i:=1;i