code.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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 numbers [][]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. parts := strings.Split(line, " ")
  21. for _, part := range parts {
  22. if part == "" || part == " " {
  23. continue
  24. }
  25. symbols = append(symbols, strings.Trim(part, " "))
  26. }
  27. } else {
  28. var lineNumbers []string
  29. var number string
  30. for i := range line {
  31. if line[i] == ' ' {
  32. if i > 0 && line[i-1] >= '0' && line[i-1] <= '9' {
  33. lineNumbers = append(lineNumbers, number)
  34. number = ""
  35. continue
  36. }
  37. }
  38. number += string(line[i])
  39. }
  40. lineNumbers = append(lineNumbers, number)
  41. numbers = append(numbers, lineNumbers)
  42. }
  43. }
  44. return numbers, symbols
  45. }
  46. func part1(numbers [][]string, symbols []string) int {
  47. var sum int
  48. for i, symbol := range symbols {
  49. var result int
  50. for row := range numbers {
  51. number, err := strconv.Atoi(strings.Trim(numbers[row][i], " "))
  52. if err != nil {
  53. log.Fatalf("Failed to convert %s to int!\n", numbers[row][i])
  54. }
  55. if symbol == "+" {
  56. result += number
  57. } else if symbol == "*" {
  58. if result == 0 {
  59. result = 1
  60. }
  61. result *= number
  62. }
  63. }
  64. sum += result
  65. }
  66. return sum
  67. }
  68. func main() {
  69. if len(os.Args) < 2 {
  70. log.Fatal("You need to specify a file!")
  71. }
  72. filePath := os.Args[1]
  73. file, err := os.Open(filePath)
  74. if err != nil {
  75. log.Fatalf("Failed to open %s!\n", filePath)
  76. }
  77. numbers, symbols := readInput(file)
  78. fmt.Println("Part1:", part1(numbers, symbols))
  79. }