day1.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package day1
  2. import (
  3. "bufio"
  4. "flag"
  5. "fmt"
  6. "math"
  7. "os"
  8. "sort"
  9. "strconv"
  10. "strings"
  11. )
  12. func readInput(filename string, v bool) ([]int, []int, error) {
  13. file, err := os.Open(filename)
  14. if err != nil {
  15. return nil, nil, err
  16. }
  17. defer file.Close()
  18. var leftList, rightList []int
  19. reader := bufio.NewReader(file)
  20. for {
  21. line, _, err := reader.ReadLine()
  22. if len(line) == 0 {
  23. break
  24. }
  25. numbers := strings.Fields(string(line))
  26. if v {
  27. fmt.Println(numbers)
  28. }
  29. if len(numbers) != 2 {
  30. return nil, nil, fmt.Errorf("invalid line format: %s", line)
  31. }
  32. // Convert the numbers to integers
  33. leftNum, err := strconv.Atoi(numbers[0])
  34. if err != nil {
  35. return nil, nil, err
  36. }
  37. rightNum, err := strconv.Atoi(numbers[1])
  38. if err != nil {
  39. return nil, nil, err
  40. }
  41. leftList = append(leftList, leftNum)
  42. rightList = append(rightList, rightNum)
  43. }
  44. return leftList, rightList, nil
  45. }
  46. func totalDistance(leftList, rightList []int) int {
  47. sort.Ints(leftList)
  48. sort.Ints(rightList)
  49. total := 0
  50. for i := 0; i < len(leftList); i++ {
  51. total += int(math.Abs(float64(leftList[i] - rightList[i])))
  52. }
  53. return total
  54. }
  55. func similarityScore(leftList, rightList []int) int {
  56. rightFrequency := make(map[int]int)
  57. for _, num := range rightList {
  58. rightFrequency[num]++
  59. }
  60. total := 0
  61. for _, num := range leftList {
  62. total += num * rightFrequency[num]
  63. }
  64. return total
  65. }
  66. func main() {
  67. args := flag.String("filename", "input", "example or input, just type the filename")
  68. // Read input from file
  69. flag.Parse()
  70. filename := fmt.Sprint(*args + ".txt")
  71. leftList, rightList, err := readInput(filename, true)
  72. if err != nil {
  73. fmt.Println("Error reading input:", err)
  74. return
  75. }
  76. // Calculate and print the result
  77. result1 := totalDistance(leftList, rightList)
  78. result2 := similarityScore(leftList, rightList)
  79. fmt.Println("Part 1 Total Distance:", result1)
  80. fmt.Println("Part 2 Total Similarity:", result2)
  81. }