diff --git a/day11/data.txt b/day11/data.txt new file mode 100644 index 0000000..2d3344e --- /dev/null +++ b/day11/data.txt @@ -0,0 +1 @@ +554735 45401 8434 0 188 7487525 77 7 diff --git a/day11/stones.go b/day11/stones.go new file mode 100644 index 0000000..6b31afa --- /dev/null +++ b/day11/stones.go @@ -0,0 +1,76 @@ +package main + +import ( + "os" + "fmt" + "strconv" + "strings" +) + + +// general util +func check(e error) { + if e != nil { panic(e) } +} + +func apply_rules(arr []int) []int { + for i, e := range arr { + switch { + // rule 1 + case e == 0: + arr[i] = 1 + // mark for rule 2 + case len(strconv.Itoa(e)) % 2 == 0: + arr[i] = -e + // rule 3 + default: + arr[i] = e * 2024 + } + } + // rule 2 + arr_cp := make([]int, len(arr)) + copy(arr_cp, arr) + arr = arr[:0] + + for _, e := range arr_cp { + if e > 0 { + arr = append(arr, e) + } else { + e_str := strconv.Itoa(-e) + num1, err := strconv.Atoi(e_str[:len(e_str) / 2]) + check(err) + num2, err := strconv.Atoi(e_str[len(e_str) / 2:]) + check(err) + + arr = append(arr, num1) + arr = append(arr, num2) + } + } + + return arr +} + + +// main loop +func main() { + + // read in file + dat, err := os.ReadFile("data.txt") + check(err) + dat_str := strings.TrimSpace(string(dat)) + line_arr := strings.Split(dat_str, " ") + + // convert to list of numbers + numbers := make([]int, 0, len(line_arr)) + + for _, e := range line_arr { + num, err := strconv.Atoi(e) + check(err) + numbers = append(numbers, num) + } + + for range 75 { + numbers = apply_rules(numbers) + } + fmt.Println(len(numbers)) +}