day 22
This commit is contained in:
parent
b051d147ae
commit
9b72a5ac06
2 changed files with 230 additions and 0 deletions
132
22/22.2.go
Normal file
132
22/22.2.go
Normal 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
98
22/22.go
Normal 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 ""
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue