130 lines
1.6 KiB
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
|
|
}
|