mirror of
https://github.com/tiennm99/adventofcode.git
synced 2026-06-17 14:47:51 +00:00
feat(go): add day8
This commit is contained in:
@@ -0,0 +1,117 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Edge struct {
|
||||
dist int64
|
||||
i, j int
|
||||
}
|
||||
|
||||
type DSU struct {
|
||||
parent []int
|
||||
}
|
||||
|
||||
func NewDSU(n int) *DSU {
|
||||
p := make([]int, n)
|
||||
for i := range p {
|
||||
p[i] = i
|
||||
}
|
||||
return &DSU{parent: p}
|
||||
}
|
||||
|
||||
func (d *DSU) Find(x int) int {
|
||||
if d.parent[x] != x {
|
||||
d.parent[x] = d.Find(d.parent[x])
|
||||
}
|
||||
return d.parent[x]
|
||||
}
|
||||
|
||||
func (d *DSU) Union(a, b int) {
|
||||
ra := d.Find(a)
|
||||
rb := d.Find(b)
|
||||
if ra != rb {
|
||||
d.parent[ra] = rb
|
||||
}
|
||||
}
|
||||
|
||||
type Point struct {
|
||||
x, y, z int
|
||||
}
|
||||
|
||||
func main() {
|
||||
data, _ := os.ReadFile("input.txt")
|
||||
lines := strings.Split(strings.TrimSpace(string(data)), "\n")
|
||||
|
||||
points := []Point{}
|
||||
for _, line := range lines {
|
||||
fields := strings.Split(line, ",")
|
||||
if len(fields) != 3 {
|
||||
continue
|
||||
}
|
||||
x, _ := strconv.Atoi(strings.TrimSpace(fields[0]))
|
||||
y, _ := strconv.Atoi(strings.TrimSpace(fields[1]))
|
||||
z, _ := strconv.Atoi(strings.TrimSpace(fields[2]))
|
||||
points = append(points, Point{x, y, z})
|
||||
}
|
||||
|
||||
n := len(points)
|
||||
|
||||
edges := make([]Edge, 0, n*(n-1)/2)
|
||||
for i := range n {
|
||||
p1 := points[i]
|
||||
for j := range i {
|
||||
p2 := points[j]
|
||||
dx := int64(p1.x - p2.x)
|
||||
dy := int64(p1.y - p2.y)
|
||||
dz := int64(p1.z - p2.z)
|
||||
dist := dx*dx + dy*dy + dz*dz
|
||||
edges = append(edges, Edge{dist, i, j})
|
||||
}
|
||||
}
|
||||
|
||||
sort.Slice(edges, func(a, b int) bool {
|
||||
return edges[a].dist < edges[b].dist
|
||||
})
|
||||
|
||||
dsu := NewDSU(n)
|
||||
|
||||
connections := 0
|
||||
|
||||
for t, e := range edges {
|
||||
if t == 1000 {
|
||||
sz := make(map[int]int)
|
||||
for x := range n {
|
||||
root := dsu.Find(x)
|
||||
sz[root]++
|
||||
}
|
||||
|
||||
list := make([]int, 0, len(sz))
|
||||
for _, v := range sz {
|
||||
list = append(list, v)
|
||||
}
|
||||
sort.Ints(list)
|
||||
|
||||
if len(list) >= 3 {
|
||||
fmt.Println(list[len(list)-1] * list[len(list)-2] * list[len(list)-3])
|
||||
} else {
|
||||
fmt.Println(0)
|
||||
}
|
||||
}
|
||||
|
||||
ri := dsu.Find(e.i)
|
||||
rj := dsu.Find(e.j)
|
||||
if ri != rj {
|
||||
connections++
|
||||
if connections == n-1 {
|
||||
fmt.Println(points[e.i].x * points[e.j].x)
|
||||
}
|
||||
dsu.Union(ri, rj)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
module day8
|
||||
|
||||
go 1.23.4
|
||||
Reference in New Issue
Block a user