initialise
This commit is contained in:
160
6/main.go
Normal file
160
6/main.go
Normal file
@@ -0,0 +1,160 @@
|
||||
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<len(path);i++ {
|
||||
if path[i][0] == position[0] && path[i][1] == position[1] {
|
||||
if i < len(path)-1 && path[i-1][0] == path[len(path)-1][0] && path[i-1][1] == path[len(path)-1][1] {
|
||||
result = true
|
||||
}
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func main() {
|
||||
file, _ := os.Open("input")
|
||||
defer file.Close()
|
||||
scanner := bufio.NewScanner(file)
|
||||
layout := [][]string{}
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
layout = append(layout, strings.Split(line, ""))
|
||||
}
|
||||
// fmt.Println(path)
|
||||
// fmt.Println(len(path))
|
||||
path, _ := calcPath(layout)
|
||||
pathOccurances := make(map[[2]int]int)
|
||||
for _, tuple := range path {
|
||||
key := [2]int{tuple[0],tuple[1]}
|
||||
pathOccurances[key]++
|
||||
}
|
||||
fmt.Println(len(pathOccurances))
|
||||
circleSpots := [][]int{}
|
||||
for i:=1;i<len(path);i++ {
|
||||
if path[i][0] == path[0][0] && path[i][1] == path[0][1] {
|
||||
continue
|
||||
} else {
|
||||
tempValue := layout[path[i][0]][path[i][1]]
|
||||
layout[path[i][0]][path[i][1]] = "#"
|
||||
_, circle := calcPath(layout)
|
||||
if circle {
|
||||
circleSpots = append(circleSpots, path[i])
|
||||
}
|
||||
layout[path[i][0]][path[i][1]] = tempValue
|
||||
}
|
||||
}
|
||||
uniqueCircles := make(map[[2]int]int)
|
||||
for _, tuple := range circleSpots {
|
||||
key := [2]int{tuple[0],tuple[1]}
|
||||
uniqueCircles[key]++
|
||||
}
|
||||
fmt.Println(len(uniqueCircles))
|
||||
}
|
||||
Reference in New Issue
Block a user