123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- package main
- import (
- "fmt"
- "log"
- "os"
- "strconv"
- "strings"
- )
- func readInput(file string) []int {
- data, err := os.ReadFile(file)
- if err != nil {
- log.Fatal(err)
- }
- var stones []int
- parts := strings.Split(strings.Trim(string(data), "\n"), " ")
- for _, part := range parts {
- stone, err := strconv.Atoi(part)
- if err != nil {
- log.Fatalf("Bad input %s: %s", part, err)
- }
- stones = append(stones, stone)
- }
- return stones
- }
- func splitStone(stoneString string) (int, int) {
- half := len(stoneString) / 2
- first, err1 := strconv.Atoi(stoneString[:half])
- if err1 != nil {
- log.Fatalf("Can't convert %s: %s", stoneString[:half], err1)
- }
- second, err2 := strconv.Atoi(stoneString[half:])
- if err1 != nil {
- log.Fatalf("Can't convert %s: %s", stoneString[half:], err2)
- }
- return first, second
- }
- func processStones(stones []int) []int {
- var newStones []int
- for _, stone := range stones {
- if stone == 0 {
- newStones = append(newStones, 1)
- continue
- }
- stoneString := fmt.Sprintf("%d", stone)
- if len(stoneString)%2 == 0 {
- first, second := splitStone(stoneString)
- newStones = append(newStones, first)
- newStones = append(newStones, second)
- } else {
- newStones = append(newStones, stone*2024)
- }
- }
- return newStones
- }
- func part1(stones []int) int {
- for i := 0; i < 25; i++ {
- stones = processStones(stones)
- }
- return len(stones)
- }
- func main() {
- if len(os.Args) < 2 {
- log.Fatal("You need to specify a file!")
- }
- stones := readInput(os.Args[1])
- fmt.Println("Part1:", part1(stones))
- }
|