day18.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "log"
  6. "os"
  7. "strconv"
  8. "strings"
  9. )
  10. func getTokens(line string) ([]rune, error) {
  11. scanner := bufio.NewScanner(strings.NewReader(line))
  12. scanner.Split(bufio.ScanWords)
  13. var tokens []rune
  14. for scanner.Scan() {
  15. newTokens := []rune(scanner.Text())
  16. tokens = append(tokens, newTokens...)
  17. }
  18. if err := scanner.Err(); err != nil {
  19. return tokens, fmt.Errorf("Scanner error: %s", err)
  20. }
  21. return tokens, nil
  22. }
  23. func getExpression(tokens []rune) []interface{} {
  24. var expression []interface{}
  25. for _, token := range tokens {
  26. stringToken := string(token)
  27. value, err := strconv.Atoi(stringToken)
  28. if err != nil {
  29. expression = append(expression, stringToken)
  30. continue
  31. }
  32. expression = append(expression, value)
  33. }
  34. return expression
  35. }
  36. func readFile(file *os.File) {
  37. scanner := bufio.NewScanner(file)
  38. for scanner.Scan() {
  39. line := scanner.Text()
  40. if line == "" {
  41. continue
  42. }
  43. tokens, err := getTokens(line)
  44. if err != nil {
  45. log.Fatalf("Error scanning %s: %s", line, err)
  46. }
  47. fmt.Println(getExpression(tokens))
  48. }
  49. if err := scanner.Err(); err != nil {
  50. log.Fatalf("Scanner error: %s", err)
  51. }
  52. }
  53. func main() {
  54. if len(os.Args) < 2 {
  55. log.Fatal("You need to specify a file!")
  56. }
  57. filePath := os.Args[1]
  58. file, err := os.Open(filePath)
  59. if err != nil {
  60. log.Fatalf("Failed to open %s!\n", filePath)
  61. }
  62. readFile(file)
  63. if err := file.Close(); err != nil {
  64. log.Fatalf("Failed to close file: %s", err)
  65. }
  66. }