day7.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package main
  2. import (
  3. "bufio"
  4. "flag"
  5. "fmt"
  6. "os"
  7. "strconv"
  8. "strings"
  9. "time"
  10. )
  11. func main() {
  12. args := flag.Bool("example", false, "example or input")
  13. flag.Parse()
  14. filename := "input.txt"
  15. if *args {
  16. filename = "example.txt"
  17. }
  18. file, err := os.Open(filename)
  19. if err != nil {
  20. fmt.Println(err)
  21. return
  22. }
  23. defer file.Close()
  24. scanner := bufio.NewScanner(file)
  25. var equations []Equation
  26. for scanner.Scan() {
  27. line := strings.TrimSpace(scanner.Text())
  28. equations = append(equations, parseEquation(line))
  29. }
  30. if err := scanner.Err(); err != nil {
  31. fmt.Println(err)
  32. return
  33. }
  34. // part 1
  35. start := time.Now()
  36. totalSum := 0
  37. for _, eq := range equations {
  38. if checkOperators(eq.numbers, eq.testValue, 0, eq.numbers[0], false) {
  39. totalSum += eq.testValue
  40. }
  41. }
  42. end1 := time.Since(start)
  43. // part2
  44. start = time.Now()
  45. totalSumWithMerged := 0
  46. for _, eq := range equations {
  47. if checkOperators(eq.numbers, eq.testValue, 0, eq.numbers[0], true) {
  48. totalSumWithMerged += eq.testValue
  49. }
  50. }
  51. end2 := time.Since(start)
  52. fmt.Println("Total Sum:", totalSum, "with time:", end1)
  53. fmt.Println("Total Sum With Merged:", totalSumWithMerged, "with time:", end2)
  54. }
  55. type Equation struct {
  56. testValue int
  57. numbers []int
  58. }
  59. func parseEquation(line string) Equation {
  60. parts := strings.Split(line, ":")
  61. testValue, _ := strconv.Atoi(strings.TrimSpace(parts[0]))
  62. numberStrings := strings.Fields(parts[1])
  63. var numbers []int
  64. for _, num := range numberStrings {
  65. n, _ := strconv.Atoi(num)
  66. numbers = append(numbers, n)
  67. }
  68. return Equation{testValue: testValue, numbers: numbers}
  69. }
  70. func checkOperators(numbers []int, target int, index int, currentValue int, merge bool) bool {
  71. if index == len(numbers)-1 {
  72. return currentValue == target
  73. }
  74. nextNumber := numbers[index+1]
  75. // +
  76. if checkOperators(numbers, target, index+1, currentValue+nextNumber, merge) {
  77. return true
  78. }
  79. // *
  80. if checkOperators(numbers, target, index+1, currentValue*nextNumber, merge) {
  81. return true
  82. }
  83. // ||
  84. if merge {
  85. merged, _ := strconv.Atoi(fmt.Sprintf("%v%v", currentValue, nextNumber))
  86. if checkOperators(numbers, target, index+1, merged, merge) {
  87. return true
  88. }
  89. }
  90. return false
  91. }