code.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. "strconv"
  7. "strings"
  8. )
  9. func readInput(path string) []string {
  10. data, err := os.ReadFile(path)
  11. if err != nil {
  12. log.Fatal(err)
  13. }
  14. parts := strings.Split(string(data), ",")
  15. if len(parts) == 0 {
  16. log.Fatal("Bad input!")
  17. }
  18. for i := range parts {
  19. parts[i] = strings.TrimRight(parts[i], "\n")
  20. }
  21. return parts
  22. }
  23. const (
  24. Max = 256
  25. )
  26. func hash(text string) int {
  27. var current int
  28. for i := range text {
  29. current += int(text[i])
  30. current = current * 17 % Max
  31. }
  32. return current
  33. }
  34. func part1(steps []string) int {
  35. var result int
  36. for i := range steps {
  37. result += hash(steps[i])
  38. }
  39. return result
  40. }
  41. type Lens struct {
  42. label string
  43. power int
  44. }
  45. func getBoxes(steps []string) [][]Lens {
  46. lenses := make([][]Lens, 256)
  47. for i := range steps {
  48. if strings.Contains(steps[i], "=") {
  49. parts := strings.Split(steps[i], "=")
  50. if len(parts) != 2 {
  51. log.Fatalf("Problem reading step %s", steps[i])
  52. }
  53. lens := Lens{label: parts[0]}
  54. n, err := strconv.Atoi(parts[1])
  55. if err != nil {
  56. log.Fatalf("Problem converting number %s: %s", parts[1], err)
  57. }
  58. lens.power = n
  59. fmt.Println(lens)
  60. } else {
  61. label := strings.TrimRight(steps[i], "-")
  62. fmt.Println(label)
  63. }
  64. }
  65. return lenses
  66. }
  67. func part2(steps []string) int {
  68. var result int
  69. getBoxes(steps)
  70. return result
  71. }
  72. func main() {
  73. if len(os.Args) < 2 {
  74. log.Fatal("You need to specify a file!")
  75. }
  76. steps := readInput(os.Args[1])
  77. fmt.Println("Part1:", part1(steps))
  78. fmt.Println("Part2:", part2(steps))
  79. }