solve_2.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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. b1,b2 := create_circuits(distances, len(junction_boxes))
  29. res := junction_boxes[b1][0] * junction_boxes[b2][0]
  30. fmt.Println(res)
  31. }
  32. func create_circuits(distances sj_box_distances, nb_jb int) (int,int) {
  33. res1,res2 := 0,0
  34. var circuits [][]int
  35. circuits = append(circuits, []int{distances[0].b1, distances[0].b2})
  36. for i := 1; i < len(distances); i++ {
  37. b1,b2 := distances[i].b1, distances[i].b2
  38. new := true
  39. for cir := range circuits {
  40. ok1, ok2 := slices.Contains(circuits[cir],b1), slices.Contains(circuits[cir],b2)
  41. if ok1 && ok2 {
  42. new = false
  43. break
  44. } else if ok1 && !ok2 {
  45. new = false
  46. merge_circuits(cir, b2, &circuits)
  47. break
  48. } else if !ok1 && ok2 {
  49. new = false
  50. merge_circuits(cir, b1, &circuits)
  51. break
  52. }
  53. }
  54. if new {
  55. circuits = append(circuits, []int{b1,b2})
  56. }
  57. if len(circuits) == 1 && len(circuits[0]) == nb_jb {
  58. res1,res2 = b1,b2
  59. break
  60. }
  61. }
  62. return res1,res2
  63. }
  64. func merge_circuits(idx_cir, box int, circuits* [][]int) {
  65. idx_cir_tomerge := -1
  66. for i := range *circuits{
  67. if slices.Contains((*circuits)[i],box){
  68. idx_cir_tomerge = i
  69. }
  70. }
  71. if idx_cir_tomerge >= 0 {
  72. (*circuits)[idx_cir] = append((*circuits)[idx_cir], (*circuits)[idx_cir_tomerge]...)
  73. (*circuits)[idx_cir_tomerge] = (*circuits)[len(*circuits)-1]
  74. (*circuits) = (*circuits)[:len(*circuits)-1]
  75. } else {
  76. (*circuits)[idx_cir] = append((*circuits)[idx_cir], box)
  77. }
  78. }
  79. type j_box_distance struct {
  80. b1,b2 int
  81. dis float64
  82. }
  83. type sj_box_distances []j_box_distance
  84. func (a sj_box_distances) Len() int { return len(a)}
  85. func (a sj_box_distances) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
  86. func (a sj_box_distances) Less(i, j int) bool { return a[i].dis < a[j].dis }
  87. func calculate_distances(points [][]int64) sj_box_distances {
  88. var res sj_box_distances
  89. for i := range(points) {
  90. for j := i+1; j < len(points); j++{
  91. b1,b2 := i,j
  92. dis := euclidiean_distance(points[i],points[j])
  93. res = append(res, j_box_distance{b1,b2,dis})
  94. }
  95. }
  96. sort.Sort(res)
  97. return res
  98. }
  99. func euclidiean_distance(p1, p2 []int64) float64 {
  100. 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)
  101. return math.Sqrt(dx + dy + dz)
  102. }