code.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. "strconv"
  7. "strings"
  8. )
  9. func readInput(file string) map[int]int {
  10. data, err := os.ReadFile(file)
  11. if err != nil {
  12. log.Fatal(err)
  13. }
  14. stones := make(map[int]int)
  15. parts := strings.Split(strings.Trim(string(data), "\n"), " ")
  16. for _, part := range parts {
  17. stone, err := strconv.Atoi(part)
  18. if err != nil {
  19. log.Fatalf("Bad input %s: %s", part, err)
  20. }
  21. stones[stone]++
  22. }
  23. return stones
  24. }
  25. func splitStone(stoneString string) (int, int) {
  26. half := len(stoneString) / 2
  27. first, err1 := strconv.Atoi(stoneString[:half])
  28. if err1 != nil {
  29. log.Fatalf("Can't convert %s: %s", stoneString[:half], err1)
  30. }
  31. second, err2 := strconv.Atoi(stoneString[half:])
  32. if err1 != nil {
  33. log.Fatalf("Can't convert %s: %s", stoneString[half:], err2)
  34. }
  35. return first, second
  36. }
  37. func processStones(stones map[int]int) map[int]int {
  38. newStones := make(map[int]int)
  39. for key, value := range stones {
  40. if key == 0 {
  41. newStones[1] += value
  42. } else if stoneString := fmt.Sprintf("%d", key); len(stoneString)%2 == 0 {
  43. first, second := splitStone(stoneString)
  44. newStones[first] += value
  45. newStones[second] += value
  46. } else {
  47. m := key * 2024
  48. newStones[m] += value
  49. }
  50. }
  51. return newStones
  52. }
  53. func part1(stones map[int]int) int {
  54. for i := 0; i < 25; i++ {
  55. stones = processStones(stones)
  56. }
  57. var result int
  58. for _, value := range stones {
  59. result += value
  60. }
  61. return result
  62. }
  63. func main() {
  64. if len(os.Args) < 2 {
  65. log.Fatal("You need to specify a file!")
  66. }
  67. stones := readInput(os.Args[1])
  68. fmt.Println("Part1:", part1(stones))
  69. }