diff --git a/22/22.2.go b/22/22.2.go new file mode 100644 index 0000000..6ea26d5 --- /dev/null +++ b/22/22.2.go @@ -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 +} diff --git a/22/22.go b/22/22.go new file mode 100644 index 0000000..b073c4c --- /dev/null +++ b/22/22.go @@ -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 "" +}