This commit is contained in:
Ben Charlton 2017-12-22 12:28:05 +00:00
parent b051d147ae
commit 9b72a5ac06
2 changed files with 230 additions and 0 deletions

132
22/22.2.go Normal file
View file

@ -0,0 +1,132 @@
package main
import (
"bufio"
"fmt"
"os"
)
// Coords are y,x as first grid array index = y coord.
// 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
}

98
22/22.go Normal file
View file

@ -0,0 +1,98 @@
package main
import (
"bufio"
"fmt"
"os"
)
// Coords are y,x as first grid array index = y coord.
// cat input | go run 22.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] = 1
}
}
y++
}
posX := y/2
posY := y/2
dir := "u"
infections := 0
fmt.Println(grid)
fmt.Println(posX, posY, dir)
for i:=0; i<10000; i++ {
current := fmt.Sprint(posX, posY)
node := grid[current]
// Turn
dir = Turn(dir, node)
// Infect/clean
if node == 1 {
grid[current] = 0
} else {
grid[current] = 1
infections++
}
// Move
posX, posY = Move(posX, posY, dir)
}
fmt.Println(infections)
}
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, infected int) string {
if infected == 1 {
switch dir {
case "u":
return "r"
case "d":
return "l"
case "l":
return "u"
case "r":
return "d"
}
}
switch dir {
case "u":
return "l"
case "d":
return "r"
case "l":
return "d"
case "r":
return "u"
}
return ""
}