code.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "log"
  6. "os"
  7. "strconv"
  8. "strings"
  9. )
  10. func readInput(file *os.File) ([][]int, []string) {
  11. scanner := bufio.NewScanner(file)
  12. var numbers [][]int
  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 []int
  29. parts := strings.Split(line, " ")
  30. for _, part := range parts {
  31. if part == "" || part == " " {
  32. continue
  33. }
  34. i, err := strconv.Atoi(strings.Trim(part, " "))
  35. if err != nil {
  36. log.Fatalf("Bad input: %s", part)
  37. }
  38. lineNumbers = append(lineNumbers, i)
  39. }
  40. numbers = append(numbers, lineNumbers)
  41. }
  42. }
  43. return numbers, symbols
  44. }
  45. func part1(numbers [][]int, symbols []string) int {
  46. var sum int
  47. for i, symbol := range symbols {
  48. var result int
  49. for row := range numbers {
  50. if symbol == "+" {
  51. result += numbers[row][i]
  52. } else if symbol == "*" {
  53. if result == 0 {
  54. result = 1
  55. }
  56. result *= numbers[row][i]
  57. }
  58. }
  59. sum += result
  60. }
  61. return sum
  62. }
  63. func main() {
  64. if len(os.Args) < 2 {
  65. log.Fatal("You need to specify a file!")
  66. }
  67. filePath := os.Args[1]
  68. file, err := os.Open(filePath)
  69. if err != nil {
  70. log.Fatalf("Failed to open %s!\n", filePath)
  71. }
  72. numbers, symbols := readInput(file)
  73. fmt.Println("Part1:", part1(numbers, symbols))
  74. }