Day 17 solved
This commit is contained in:
parent
f6f1929382
commit
66e48278c5
135
2020/day17.go
Normal file
135
2020/day17.go
Normal file
|
@ -0,0 +1,135 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"git.annabunch.es/annabunches/adventofcode/2020/lib/util"
|
||||||
|
)
|
||||||
|
|
||||||
|
func parseInputCubes(input []string) map[[3]int]bool {
|
||||||
|
state := make(map[[3]int]bool)
|
||||||
|
for x, line := range input {
|
||||||
|
for y, char := range line {
|
||||||
|
coords := [3]int{x, y, 0}
|
||||||
|
if char == '#' {
|
||||||
|
state[coords] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return state
|
||||||
|
}
|
||||||
|
|
||||||
|
func iterateCubes(prev map[[3]int]bool) map[[3]int]bool {
|
||||||
|
counts := make(map[[3]int]int)
|
||||||
|
|
||||||
|
for node, v := range prev {
|
||||||
|
if !v {
|
||||||
|
log.Panicf("Unexpected false value!")
|
||||||
|
}
|
||||||
|
x := node[0]
|
||||||
|
y := node[1]
|
||||||
|
z := node[2]
|
||||||
|
neighbors := make([][3]int, 26)
|
||||||
|
index := 0
|
||||||
|
for i := -1; i < 2; i++ {
|
||||||
|
for j := -1; j < 2; j++ {
|
||||||
|
for k := -1; k < 2; k++ {
|
||||||
|
if i == 0 && j == 0 && k == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
neighbors[index] = [3]int{x + i, y + j, z + k}
|
||||||
|
index++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, n := range neighbors {
|
||||||
|
counts[n]++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
next := make(map[[3]int]bool)
|
||||||
|
for node, count := range counts {
|
||||||
|
if (prev[node] && count == 2) || count == 3 {
|
||||||
|
next[node] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return next
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseInputHypercubes(input []string) map[[4]int]bool {
|
||||||
|
state := make(map[[4]int]bool)
|
||||||
|
for x, line := range input {
|
||||||
|
for y, char := range line {
|
||||||
|
coords := [4]int{x, y, 0, 0}
|
||||||
|
if char == '#' {
|
||||||
|
state[coords] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return state
|
||||||
|
}
|
||||||
|
|
||||||
|
func iterateHypercubes(prev map[[4]int]bool) map[[4]int]bool {
|
||||||
|
counts := make(map[[4]int]int)
|
||||||
|
|
||||||
|
for node, v := range prev {
|
||||||
|
if !v {
|
||||||
|
log.Panicf("Unexpected false value!")
|
||||||
|
}
|
||||||
|
x := node[0]
|
||||||
|
y := node[1]
|
||||||
|
z := node[2]
|
||||||
|
w := node[3]
|
||||||
|
neighbors := make([][4]int, 80)
|
||||||
|
index := 0
|
||||||
|
for i := -1; i < 2; i++ {
|
||||||
|
for j := -1; j < 2; j++ {
|
||||||
|
for k := -1; k < 2; k++ {
|
||||||
|
for l := -1; l < 2; l++ {
|
||||||
|
if i == 0 && j == 0 && k == 0 && l == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
neighbors[index] = [4]int{x + i, y + j, z + k, w + l}
|
||||||
|
index++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, n := range neighbors {
|
||||||
|
counts[n]++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
next := make(map[[4]int]bool)
|
||||||
|
for node, count := range counts {
|
||||||
|
if (prev[node] && count == 2) || count == 3 {
|
||||||
|
next[node] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return next
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
step := os.Args[1]
|
||||||
|
values := util.InputParserStrings(os.Args[2])
|
||||||
|
switch step {
|
||||||
|
case "1":
|
||||||
|
state := parseInputCubes(values)
|
||||||
|
for i := 0; i < 6; i++ {
|
||||||
|
state = iterateCubes(state)
|
||||||
|
}
|
||||||
|
fmt.Println(len(state))
|
||||||
|
case "2":
|
||||||
|
state := parseInputHypercubes(values)
|
||||||
|
for i := 0; i < 6; i++ {
|
||||||
|
state = iterateHypercubes(state)
|
||||||
|
}
|
||||||
|
fmt.Println(len(state))
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user