solve_1.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "math"
  6. "os"
  7. "slices"
  8. "sort"
  9. "strconv"
  10. "strings"
  11. )
  12. func main(){
  13. fmt.Println("Advent of Code 2025 - Day 8 - Part 1")
  14. f,_:=os.Open("8/input")
  15. defer f.Close()
  16. var junction_boxes [][]int64
  17. scanner := bufio.NewScanner(f)
  18. for scanner.Scan(){
  19. line := scanner.Text()
  20. var coords []int64
  21. for c := range strings.SplitSeq(line, ","){
  22. c_i,_ := strconv.ParseInt(c,10,64)
  23. coords = append(coords, c_i)
  24. }
  25. junction_boxes = append(junction_boxes, coords)
  26. }
  27. distances := calculate_distances(junction_boxes)
  28. top3_circuits := create_circuits(1000, distances)[:3]
  29. res := 1
  30. for _,c := range top3_circuits{
  31. res *= c
  32. }
  33. fmt.Println(res)
  34. }
  35. func create_circuits(nb_connections int, distances sj_box_distances) []int {
  36. var circuits [][]int
  37. circuits = append(circuits, []int{distances[0].b1, distances[0].b2})
  38. for i := 1; i < nb_connections; i++ {
  39. b1,b2 := distances[i].b1, distances[i].b2
  40. new := true
  41. for cir := range circuits {
  42. ok1, ok2 := slices.Contains(circuits[cir],b1), slices.Contains(circuits[cir],b2)
  43. if ok1 && ok2 {
  44. new = false
  45. break
  46. } else if ok1 && !ok2 {
  47. new = false
  48. merge_circuits(cir, b2, &circuits)
  49. break
  50. } else if !ok1 && ok2 {
  51. new = false
  52. merge_circuits(cir, b1, &circuits)
  53. break
  54. }
  55. }
  56. if new {
  57. circuits = append(circuits, []int{b1,b2})
  58. }
  59. }
  60. var res []int
  61. for _,c := range circuits{
  62. res = append(res, len(c))
  63. }
  64. sort.Sort(sort.Reverse(sort.IntSlice(res)))
  65. return res
  66. }
  67. func merge_circuits(idx_cir, box int, circuits* [][]int) {
  68. idx_cir_tomerge := -1
  69. for i := range *circuits{
  70. if slices.Contains((*circuits)[i],box){
  71. idx_cir_tomerge = i
  72. }
  73. }
  74. if idx_cir_tomerge >= 0 {
  75. (*circuits)[idx_cir] = append((*circuits)[idx_cir], (*circuits)[idx_cir_tomerge]...)
  76. (*circuits)[idx_cir_tomerge] = (*circuits)[len(*circuits)-1]
  77. (*circuits) = (*circuits)[:len(*circuits)-1]
  78. } else {
  79. (*circuits)[idx_cir] = append((*circuits)[idx_cir], box)
  80. }
  81. }
  82. type j_box_distance struct {
  83. b1,b2 int
  84. dis float64
  85. }
  86. type sj_box_distances []j_box_distance
  87. func (a sj_box_distances) Len() int { return len(a)}
  88. func (a sj_box_distances) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
  89. func (a sj_box_distances) Less(i, j int) bool { return a[i].dis < a[j].dis }
  90. func calculate_distances(points [][]int64) sj_box_distances {
  91. var res sj_box_distances
  92. for i := range(points) {
  93. for j := i+1; j < len(points); j++{
  94. b1,b2 := i,j
  95. dis := euclidiean_distance(points[i],points[j])
  96. res = append(res, j_box_distance{b1,b2,dis})
  97. }
  98. }
  99. sort.Sort(res)
  100. return res
  101. }
  102. func euclidiean_distance(p1, p2 []int64) float64 {
  103. dx,dy,dz := math.Pow(float64(p1[0] - p2[0]), 2.0), math.Pow(float64(p1[1] - p2[1]), 2.0), math.Pow(float64(p1[2] - p2[2]), 2.0)
  104. return math.Sqrt(dx + dy + dz)
  105. }