code.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package main
  2. import (
  3. "bytes"
  4. "fmt"
  5. "log"
  6. "os"
  7. "strconv"
  8. "strings"
  9. )
  10. func getRanges(data []byte) [][]int {
  11. var ranges [][]int
  12. ids := bytes.Split(data, []byte(","))
  13. for _, id := range ids {
  14. var start, end int
  15. n, err := fmt.Sscanf(string(id), "%d-%d", &start, &end)
  16. if err != nil || n != 2 {
  17. log.Fatalf("Invalid range: %s", id)
  18. }
  19. ranges = append(ranges, []int{start, end})
  20. }
  21. return ranges
  22. }
  23. func parts(ranges [][]int) (int, int) {
  24. invalid := make(map[int]int)
  25. invalidRest := make(map[int]int)
  26. for _, r := range ranges {
  27. for i := r[0]; i <= r[1]; i++ {
  28. s := strconv.Itoa(i)
  29. if len(s)%2 == 0 {
  30. half := len(s) / 2
  31. if s[:half] == s[half:] {
  32. invalid[i]++
  33. continue
  34. }
  35. }
  36. if len(s) > 1 {
  37. ds := s + s
  38. if strings.Contains(ds[1:len(ds)-2], s) {
  39. invalidRest[i]++
  40. }
  41. }
  42. }
  43. }
  44. var part1 int
  45. for key, value := range invalid {
  46. part1 += key * value
  47. }
  48. var part2 int
  49. for key, value := range invalidRest {
  50. part2 += key * value
  51. }
  52. return part1, part1 + part2
  53. }
  54. func main() {
  55. if len(os.Args) < 2 {
  56. log.Fatal("You need to specify a file!")
  57. }
  58. data, err := os.ReadFile(os.Args[1])
  59. if err != nil {
  60. log.Fatal(err)
  61. }
  62. ranges := getRanges(data)
  63. part1, part2 := parts(ranges)
  64. fmt.Println("Part1:", part1)
  65. fmt.Println("Part2:", part2)
  66. }