day21.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "log"
  6. "os"
  7. "strings"
  8. )
  9. type dish struct {
  10. ingredients []string
  11. allergens []string
  12. }
  13. func readDish(line string) dish {
  14. var food dish
  15. parts := strings.Split(line, " (contains ")
  16. if len(parts) != 2 {
  17. log.Fatalf("Invalid line: %s", line)
  18. }
  19. for _, ingredient := range strings.Split(parts[0], " ") {
  20. food.ingredients = append(food.ingredients, ingredient)
  21. }
  22. cleanedPart2 := strings.TrimSuffix(parts[1], ")")
  23. for _, allergen := range strings.Split(cleanedPart2, ", ") {
  24. food.allergens = append(food.allergens, allergen)
  25. }
  26. return food
  27. }
  28. func readFile(file *os.File) []dish {
  29. var foods []dish
  30. scanner := bufio.NewScanner(file)
  31. for scanner.Scan() {
  32. line := scanner.Text()
  33. if line == "" {
  34. break
  35. }
  36. foods = append(foods, readDish(line))
  37. }
  38. if err := scanner.Err(); err != nil {
  39. log.Fatalf("Scanner error: %s", err)
  40. }
  41. return foods
  42. }
  43. func main() {
  44. if len(os.Args) < 2 {
  45. log.Fatal("You need to specify a file!")
  46. }
  47. filePath := os.Args[1]
  48. file, err := os.Open(filePath)
  49. if err != nil {
  50. log.Fatalf("Failed to open %s!\n", filePath)
  51. }
  52. foods := readFile(file)
  53. if err := file.Close(); err != nil {
  54. log.Fatalf("Failed to close file: %s", err)
  55. }
  56. fmt.Println(foods)
  57. }