adventofcode2017/22/22.2.go

130 lines
1.6 KiB
Go

package main
import (
"bufio"
"fmt"
"os"
)
// cat input | go run 22.2.go
func main() {
grid := make(map[string]int)
scanner := bufio.NewScanner(os.Stdin)
y := 0
for scanner.Scan() {
text := scanner.Text()
for x := range text {
coords := fmt.Sprint(x,y)
fmt.Println(coords)
if text[x] == '#' {
grid[coords] = 2
}
}
y++
}
posX := y/2
posY := y/2
dir := "u"
infections := 0
fmt.Println(grid)
fmt.Println(posX, posY, dir)
for i:=0; i<10000000; i++ {
current := fmt.Sprint(posX, posY)
node := grid[current]
// Turn
dir = Turn(dir, node)
// Infect/clean
result := ProcessNode(node)
grid[current] = result
if result == 2 {
infections++
}
// Move
posX, posY = Move(posX, posY, dir)
}
fmt.Println(infections)
}
func ProcessNode(node int) int {
// 0 clean
// 1 weakened
// 2 infected
// 3 flagged
if node == 3 {
node = 0
} else {
node++
}
return node
}
func Move (posX int, posY int, dir string) (int,int) {
switch dir {
case "u":
posY--
case "d":
posY++
case "l":
posX--
case "r":
posX++
}
return posX, posY
}
func Turn (dir string, state int) string {
// flagged
if state == 3 {
switch dir {
case "u":
return "d"
case "d":
return "u"
case "l":
return "r"
case "r":
return "l"
}
}
// infected
if state == 2 {
switch dir {
case "u":
return "r"
case "d":
return "l"
case "l":
return "u"
case "r":
return "d"
}
}
// clean (state 0)
if state == 0 {
switch dir {
case "u":
return "l"
case "d":
return "r"
case "l":
return "d"
case "r":
return "u"
}
}
// weakened (state 1)
return dir
}