feat(go): add day8

This commit is contained in:
2025-12-08 21:30:07 +07:00
parent 84008d9b4e
commit f405d2057b
2 changed files with 120 additions and 0 deletions
+117
View File
@@ -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)
}
}
}
+3
View File
@@ -0,0 +1,3 @@
module day8
go 1.23.4