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