179 lines
4.1 KiB
Go
179 lines
4.1 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
type Hex struct {
|
|
q int
|
|
r int
|
|
s int
|
|
}
|
|
|
|
func CreateHex(q int, r int, s int) Hex {
|
|
return Hex{
|
|
q: q,
|
|
r: r,
|
|
s: s,
|
|
}
|
|
}
|
|
|
|
func (h *Hex) Print() string {
|
|
return strconv.Itoa(h.q) + "," + strconv.Itoa(h.r) + "," + strconv.Itoa(h.s)
|
|
}
|
|
|
|
func Count(arr []string, search string) int {
|
|
counter := 0
|
|
for i := 0; i < len(arr); i++ {
|
|
if arr[i] == search {
|
|
counter++
|
|
}
|
|
}
|
|
return counter
|
|
}
|
|
|
|
func AdjustValues(hexMap map[string]bool, key string, white *int, black *int) {
|
|
v, exists := hexMap[key]
|
|
if !exists {
|
|
return
|
|
}
|
|
|
|
if v {
|
|
*white++
|
|
} else {
|
|
*black++
|
|
}
|
|
}
|
|
|
|
func AddIfMissing(hexMap map[string]bool, hex string) {
|
|
_, exists := hexMap[hex]
|
|
if !exists {
|
|
hexMap[hex] = true
|
|
}
|
|
}
|
|
|
|
func AddAdjacents(hexMap map[string]bool, hex string) {
|
|
split := strings.Split(hex, ",")
|
|
q, _ := strconv.Atoi(split[0])
|
|
r, _ := strconv.Atoi(split[1])
|
|
s, _ := strconv.Atoi(split[2])
|
|
|
|
nw := strconv.Itoa(q) + "," + strconv.Itoa(r - 1) + "," + strconv.Itoa(s + 1)
|
|
w := strconv.Itoa(q - 1) + "," + strconv.Itoa(r) + "," + strconv.Itoa(s + 1)
|
|
sw := strconv.Itoa(q - 1) + "," + strconv.Itoa(r + 1) + "," + strconv.Itoa(s)
|
|
se := strconv.Itoa(q) + "," + strconv.Itoa(r + 1) + "," + strconv.Itoa(s - 1)
|
|
e := strconv.Itoa(q + 1) + "," + strconv.Itoa(r) + "," + strconv.Itoa(s - 1)
|
|
ne := strconv.Itoa(q + 1) + "," + strconv.Itoa(r - 1) + "," + strconv.Itoa(s)
|
|
|
|
AddIfMissing(hexMap, nw)
|
|
AddIfMissing(hexMap, w)
|
|
AddIfMissing(hexMap, sw)
|
|
AddIfMissing(hexMap, se)
|
|
AddIfMissing(hexMap, e)
|
|
AddIfMissing(hexMap, ne)
|
|
}
|
|
|
|
func CountAdjacent(hexMap map[string]bool, hex string) (int, int) {
|
|
white := 0
|
|
black := 0
|
|
|
|
split := strings.Split(hex, ",")
|
|
q, _ := strconv.Atoi(split[0])
|
|
r, _ := strconv.Atoi(split[1])
|
|
s, _ := strconv.Atoi(split[2])
|
|
|
|
nw := strconv.Itoa(q) + "," + strconv.Itoa(r - 1) + "," + strconv.Itoa(s + 1)
|
|
w := strconv.Itoa(q - 1) + "," + strconv.Itoa(r) + "," + strconv.Itoa(s + 1)
|
|
sw := strconv.Itoa(q - 1) + "," + strconv.Itoa(r + 1) + "," + strconv.Itoa(s)
|
|
se := strconv.Itoa(q) + "," + strconv.Itoa(r + 1) + "," + strconv.Itoa(s - 1)
|
|
e := strconv.Itoa(q + 1) + "," + strconv.Itoa(r) + "," + strconv.Itoa(s - 1)
|
|
ne := strconv.Itoa(q + 1) + "," + strconv.Itoa(r - 1) + "," + strconv.Itoa(s)
|
|
|
|
AdjustValues(hexMap, nw, &white, &black)
|
|
AdjustValues(hexMap, w, &white, &black)
|
|
AdjustValues(hexMap, sw, &white, &black)
|
|
AdjustValues(hexMap, se, &white, &black)
|
|
AdjustValues(hexMap, e, &white, &black)
|
|
AdjustValues(hexMap, ne, &white, &black)
|
|
|
|
return white, black
|
|
}
|
|
|
|
func main() {
|
|
fmt.Println("Day 24 Part 1")
|
|
|
|
file, err := os.ReadFile("input.txt")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
_content := strings.Split(string(file), "\n")
|
|
content := _content[:len(_content) - 1]
|
|
|
|
directionRegex := regexp.MustCompile("e|se|sw|w|nw|ne")
|
|
|
|
// true = white, false = black
|
|
cache := make(map[string]bool)
|
|
|
|
for _, line := range content {
|
|
matches := directionRegex.FindAllString(line, -1)
|
|
|
|
nw := Count(matches, "nw")
|
|
w := Count(matches, "w")
|
|
sw := Count(matches, "sw")
|
|
se := Count(matches, "se")
|
|
e := Count(matches, "e")
|
|
ne := Count(matches, "ne")
|
|
|
|
hex := CreateHex(ne + e - sw - w, se + sw - ne - nw, w + nw - se - e)
|
|
|
|
white, exists := cache[hex.Print()]
|
|
if !exists {
|
|
cache[hex.Print()] = false
|
|
} else {
|
|
cache[hex.Print()] = !white
|
|
}
|
|
}
|
|
|
|
blackTiles := 0
|
|
for _, white := range cache {
|
|
if !white {
|
|
blackTiles++
|
|
}
|
|
}
|
|
|
|
fmt.Printf("Part 1: %d\n", blackTiles)
|
|
|
|
for i := 0; i < 100; i++ {
|
|
|
|
toFlip := make([]string, 0)
|
|
for k := range cache {
|
|
AddAdjacents(cache, k)
|
|
}
|
|
|
|
for k, isWhite := range cache {
|
|
_, black := CountAdjacent(cache, k)
|
|
if isWhite && black == 2 {
|
|
toFlip = append(toFlip, k)
|
|
} else if !isWhite && (black == 0 || black > 2) {
|
|
toFlip = append(toFlip, k)
|
|
}
|
|
}
|
|
|
|
for _, k := range toFlip {
|
|
cache[k] = !cache[k]
|
|
}
|
|
|
|
myTiles := 0
|
|
for _, white := range cache {
|
|
if !white {
|
|
myTiles++
|
|
}
|
|
}
|
|
fmt.Println(i, myTiles)
|
|
}
|
|
}
|