code.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. "strconv"
  7. "strings"
  8. )
  9. func readInput(file string) []int {
  10. data, err := os.ReadFile(file)
  11. if err != nil {
  12. log.Fatal(err)
  13. }
  14. var stones []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 = append(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 []int) []int {
  38. var newStones []int
  39. for _, stone := range stones {
  40. if stone == 0 {
  41. newStones = append(newStones, 1)
  42. continue
  43. }
  44. stoneString := fmt.Sprintf("%d", stone)
  45. if len(stoneString)%2 == 0 {
  46. first, second := splitStone(stoneString)
  47. newStones = append(newStones, first)
  48. newStones = append(newStones, second)
  49. } else {
  50. newStones = append(newStones, stone*2024)
  51. }
  52. }
  53. return newStones
  54. }
  55. func part1(stones []int) int {
  56. for i := 0; i < 25; i++ {
  57. stones = processStones(stones)
  58. }
  59. return len(stones)
  60. }
  61. func main() {
  62. if len(os.Args) < 2 {
  63. log.Fatal("You need to specify a file!")
  64. }
  65. stones := readInput(os.Args[1])
  66. fmt.Println("Part1:", part1(stones))
  67. }