Day18
This commit is contained in:
parent
83834436a1
commit
367e5eda0f
@ -4,7 +4,6 @@ import (
|
|||||||
"AOC2022/helper"
|
"AOC2022/helper"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -110,19 +109,11 @@ func getPoints(lines []string) [][2][2]int {
|
|||||||
for i, line := range lines {
|
for i, line := range lines {
|
||||||
intPair := [2][2]int{}
|
intPair := [2][2]int{}
|
||||||
stringParts := strings.Split(line[12:], ":")
|
stringParts := strings.Split(line[12:], ":")
|
||||||
sensorStringNumbers := stringSliceToIntSlice(strings.Split(stringParts[0], ", y="))
|
sensorStringNumbers := helper.StringSliceToIntSlice(strings.Split(stringParts[0], ", y="))
|
||||||
beaconStringNumbers := stringSliceToIntSlice(strings.Split(strings.ReplaceAll(stringParts[1], " closest beacon is at x=", ""), ", y="))
|
beaconStringNumbers := helper.StringSliceToIntSlice(strings.Split(strings.ReplaceAll(stringParts[1], " closest beacon is at x=", ""), ", y="))
|
||||||
intPair[0] = [2]int{sensorStringNumbers[0], sensorStringNumbers[1]}
|
intPair[0] = [2]int{sensorStringNumbers[0], sensorStringNumbers[1]}
|
||||||
intPair[1] = [2]int{beaconStringNumbers[0], beaconStringNumbers[1]}
|
intPair[1] = [2]int{beaconStringNumbers[0], beaconStringNumbers[1]}
|
||||||
points[i] = intPair
|
points[i] = intPair
|
||||||
}
|
}
|
||||||
return points
|
return points
|
||||||
}
|
}
|
||||||
|
|
||||||
func stringSliceToIntSlice(input []string) []int {
|
|
||||||
intSlice := []int{}
|
|
||||||
for _, str := range input {
|
|
||||||
intSlice = append(intSlice, helper.RemoveError(strconv.Atoi(str)))
|
|
||||||
}
|
|
||||||
return intSlice
|
|
||||||
}
|
|
||||||
|
158
day18/day18.go
Normal file
158
day18/day18.go
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"AOC2022/helper"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
args := os.Args[1:]
|
||||||
|
lines := helper.ReadTextFile(args[0])
|
||||||
|
points := make(map[[3]int]bool, len(lines))
|
||||||
|
for _, line := range lines {
|
||||||
|
point := [3]int{}
|
||||||
|
for j, number := range helper.StringSliceToIntSlice(strings.Split(line, ",")) {
|
||||||
|
point[j] = number
|
||||||
|
}
|
||||||
|
points[point] = true
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(removeOpenSurfacePointsWhichHaveNoConnectionToOutside(points))
|
||||||
|
same := false
|
||||||
|
pastLenPoints := len(points)
|
||||||
|
for !same {
|
||||||
|
removeOpenSurfacePointsWhichHaveNoConnectionToOutside(points)
|
||||||
|
if pastLenPoints != len(points) {
|
||||||
|
pastLenPoints = len(points)
|
||||||
|
} else {
|
||||||
|
same = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
openSurfacesSum := 0
|
||||||
|
for point, _ := range points {
|
||||||
|
openSurfacesPoint := 6
|
||||||
|
neighbors := getNeighbors(point)
|
||||||
|
for _, neighbor := range neighbors {
|
||||||
|
if points[neighbor] {
|
||||||
|
openSurfacesPoint--
|
||||||
|
}
|
||||||
|
}
|
||||||
|
openSurfacesSum += openSurfacesPoint
|
||||||
|
}
|
||||||
|
fmt.Println(openSurfacesSum)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeOpenSurfacePointsWhichHaveNoConnectionToOutside(points map[[3]int]bool) int {
|
||||||
|
openSurfacesSum := 0
|
||||||
|
openSurfacesPoints := make(map[[3]int]bool)
|
||||||
|
for point, _ := range points {
|
||||||
|
openSurfacesPoint := 6
|
||||||
|
neighbors := getNeighbors(point)
|
||||||
|
for _, neighbor := range neighbors {
|
||||||
|
if points[neighbor] {
|
||||||
|
openSurfacesPoint--
|
||||||
|
} else {
|
||||||
|
openSurfacesPoints[neighbor] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
openSurfacesSum += openSurfacesPoint
|
||||||
|
}
|
||||||
|
|
||||||
|
for point, _ := range openSurfacesPoints {
|
||||||
|
if !checkIfPathToOutSideExists(points, point) {
|
||||||
|
points[point] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return openSurfacesSum
|
||||||
|
}
|
||||||
|
|
||||||
|
func getNeighbors(point [3]int) (neighbors [6][3]int) {
|
||||||
|
directions := [][3]int{{0, -1, 0}, {+1, 0, 0}, {0, 1, 0}, {-1, 0, 0}, {0, 0, 1}, {0, 0, -1}}
|
||||||
|
for i, direction := range directions {
|
||||||
|
neighbors[i] = [3]int{point[0] + direction[0], point[1] + direction[1], point[2] + direction[2]}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkIfPathToOutSideExists(points map[[3]int]bool, startPoint [3]int) bool {
|
||||||
|
activePoints := make(map[[3]int]bool)
|
||||||
|
pointsCopy := deepCopyMap(points)
|
||||||
|
activePoints[startPoint] = true
|
||||||
|
foundAWay := false
|
||||||
|
areaLimits := getAreaLimits(points)
|
||||||
|
for !foundAWay && len(activePoints) > 0 {
|
||||||
|
step(&pointsCopy, &activePoints, &foundAWay, areaLimits)
|
||||||
|
}
|
||||||
|
return foundAWay
|
||||||
|
}
|
||||||
|
|
||||||
|
func step(points *map[[3]int]bool, activePoints *map[[3]int]bool, foundAWay *bool, areaLimits [6]int) {
|
||||||
|
activePoint := get_some_key(*activePoints)
|
||||||
|
delete(*activePoints, activePoint)
|
||||||
|
if (activePoint[0] > areaLimits[0] ||
|
||||||
|
activePoint[0] < areaLimits[1]) &&
|
||||||
|
(activePoint[1] > areaLimits[2] ||
|
||||||
|
activePoint[1] < areaLimits[3]) &&
|
||||||
|
(activePoint[2] > areaLimits[4] ||
|
||||||
|
activePoint[2] < areaLimits[5]) {
|
||||||
|
*foundAWay = true
|
||||||
|
return
|
||||||
|
|
||||||
|
}
|
||||||
|
(*points)[activePoint] = true
|
||||||
|
neighbors := getNeighbors(activePoint)
|
||||||
|
for _, neighbor := range neighbors {
|
||||||
|
if !(*points)[neighbor] {
|
||||||
|
(*activePoints)[neighbor] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func getAreaLimits(points map[[3]int]bool) [6]int {
|
||||||
|
highestX := -1
|
||||||
|
lowestX := 999999
|
||||||
|
highestY := -1
|
||||||
|
lowestY := 999999
|
||||||
|
highestZ := -1
|
||||||
|
lowestZ := 999999
|
||||||
|
for point, _ := range points {
|
||||||
|
if point[0] > highestX {
|
||||||
|
highestX = point[0]
|
||||||
|
}
|
||||||
|
if point[0] < lowestX {
|
||||||
|
lowestX = point[0]
|
||||||
|
}
|
||||||
|
if point[1] > highestY {
|
||||||
|
highestY = point[1]
|
||||||
|
}
|
||||||
|
if point[1] < lowestY {
|
||||||
|
lowestY = point[1]
|
||||||
|
}
|
||||||
|
if point[2] > highestZ {
|
||||||
|
highestZ = point[2]
|
||||||
|
}
|
||||||
|
if point[2] < lowestZ {
|
||||||
|
lowestZ = point[2]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return [6]int{highestX, lowestX, highestY, lowestY, highestZ, lowestZ}
|
||||||
|
}
|
||||||
|
|
||||||
|
func get_some_key[T any](m map[[3]int]T) [3]int {
|
||||||
|
for k := range m {
|
||||||
|
return k
|
||||||
|
}
|
||||||
|
return [3]int{-1, -1, -1}
|
||||||
|
}
|
||||||
|
|
||||||
|
func deepCopyMap(points map[[3]int]bool) map[[3]int]bool {
|
||||||
|
tmpValves := make(map[[3]int]bool)
|
||||||
|
for k, v := range points {
|
||||||
|
tmpValves[k] = v
|
||||||
|
}
|
||||||
|
return tmpValves
|
||||||
|
}
|
2090
day18/input
Normal file
2090
day18/input
Normal file
File diff suppressed because it is too large
Load Diff
13
day18/testinput
Normal file
13
day18/testinput
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
2,2,2
|
||||||
|
1,2,2
|
||||||
|
3,2,2
|
||||||
|
2,1,2
|
||||||
|
2,3,2
|
||||||
|
2,2,1
|
||||||
|
2,2,3
|
||||||
|
2,2,4
|
||||||
|
2,2,6
|
||||||
|
1,2,5
|
||||||
|
3,2,5
|
||||||
|
2,1,5
|
||||||
|
2,3,5
|
@ -5,6 +5,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@ -144,3 +145,11 @@ func Abs[T constraints.Integer](x T) T {
|
|||||||
func ManHattanDistance(p1, p2 [2]int) int {
|
func ManHattanDistance(p1, p2 [2]int) int {
|
||||||
return Abs(p1[0]-p2[0]) + Abs(p1[1]-p2[1])
|
return Abs(p1[0]-p2[0]) + Abs(p1[1]-p2[1])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func StringSliceToIntSlice(input []string) []int {
|
||||||
|
intSlice := []int{}
|
||||||
|
for _, str := range input {
|
||||||
|
intSlice = append(intSlice, RemoveError(strconv.Atoi(str)))
|
||||||
|
}
|
||||||
|
return intSlice
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user