code.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "log"
  6. "os"
  7. "strconv"
  8. "strings"
  9. )
  10. func readInput(file *os.File) ([]string, []string) {
  11. scanner := bufio.NewScanner(file)
  12. var numberLines []string
  13. var symbols []string
  14. for scanner.Scan() {
  15. line := scanner.Text()
  16. if line == "" {
  17. continue
  18. }
  19. if line[0] == '+' || line[0] == '*' {
  20. var symbol []byte
  21. for i := range line {
  22. if i > 0 && line[i] == '+' || line[i] == '*' {
  23. symbols = append(symbols, string(symbol))
  24. symbol = []byte{}
  25. }
  26. symbol = append(symbol, line[i])
  27. }
  28. symbols = append(symbols, string(symbol))
  29. } else {
  30. numberLines = append(numberLines, line)
  31. }
  32. }
  33. return numberLines, symbols
  34. }
  35. func parseNumbers(numberLines, symbols []string) [][]string {
  36. var numbers [][]string
  37. for _, line := range numberLines {
  38. var start, end int
  39. var lineNumbers []string
  40. for _, symbol := range symbols {
  41. end += len(symbol)
  42. var number string
  43. for i := start; i < end; i++ {
  44. number += string(line[i])
  45. }
  46. lineNumbers = append(lineNumbers, number)
  47. start = end
  48. }
  49. numbers = append(numbers, lineNumbers)
  50. }
  51. return numbers
  52. }
  53. func part1(numbers [][]string, symbols []string) int {
  54. var sum int
  55. for i, symbol := range symbols {
  56. var result int
  57. for row := range numbers {
  58. if numbers[row][i] == "" {
  59. continue
  60. }
  61. number, err := strconv.Atoi(strings.Trim(numbers[row][i], " "))
  62. if err != nil {
  63. log.Fatalf("Failed to convert %s to int (row: %d, col: %d)!\n", numbers[row][i], row, i)
  64. }
  65. if symbol[0] == '+' {
  66. result += number
  67. } else if symbol[0] == '*' {
  68. if result == 0 {
  69. result = 1
  70. }
  71. result *= number
  72. }
  73. }
  74. sum += result
  75. }
  76. return sum
  77. }
  78. func main() {
  79. if len(os.Args) < 2 {
  80. log.Fatal("You need to specify a file!")
  81. }
  82. filePath := os.Args[1]
  83. file, err := os.Open(filePath)
  84. if err != nil {
  85. log.Fatalf("Failed to open %s!\n", filePath)
  86. }
  87. numberLines, symbols := readInput(file)
  88. numbers := parseNumbers(numberLines, symbols)
  89. fmt.Println("Part1:", part1(numbers, symbols))
  90. }