summaryrefslogtreecommitdiff
path: root/2024/go/src
diff options
context:
space:
mode:
authoromagdy <omar.professional8777@gmail.com>2024-12-12 18:31:50 +0200
committeromagdy <omar.professional8777@gmail.com>2024-12-12 18:31:50 +0200
commit0cb12b95ef11fe283731e862e3953f27eeea8757 (patch)
tree66d54e44b821073ddf6381bf9b3d9d55b3d86c31 /2024/go/src
parent93cc02c058f39d370472dfe7d667ae7a2f6396b3 (diff)
downloadaoc-0cb12b95ef11fe283731e862e3953f27eeea8757.tar.xz
aoc-0cb12b95ef11fe283731e862e3953f27eeea8757.zip
Day 11 done.
Diffstat (limited to '2024/go/src')
-rw-r--r--2024/go/src/day01/main.go (renamed from 2024/go/src/day1/main.go)2
-rw-r--r--2024/go/src/day02/main.go (renamed from 2024/go/src/day2/main.go)4
-rw-r--r--2024/go/src/day03/main.go (renamed from 2024/go/src/day3/main.go)6
-rw-r--r--2024/go/src/day04/main.go (renamed from 2024/go/src/day4/main.go)4
-rw-r--r--2024/go/src/day05/main.go (renamed from 2024/go/src/day5/main.go)4
-rw-r--r--2024/go/src/day06/main.go (renamed from 2024/go/src/day6/main.go)4
-rw-r--r--2024/go/src/day07/main.go (renamed from 2024/go/src/day7/main.go)4
-rw-r--r--2024/go/src/day08/main.go (renamed from 2024/go/src/day8/main.go)4
-rw-r--r--2024/go/src/day09/main.go (renamed from 2024/go/src/day9/main.go)4
-rw-r--r--2024/go/src/day11/main.go107
10 files changed, 125 insertions, 18 deletions
diff --git a/2024/go/src/day1/main.go b/2024/go/src/day01/main.go
index 17cfa54..4e52825 100644
--- a/2024/go/src/day1/main.go
+++ b/2024/go/src/day01/main.go
@@ -65,7 +65,7 @@ func solve_part_two(data string) int {
func main() {
test_1, _ := os.ReadFile("../input/day1.test")
test_2, _ := os.ReadFile("../input/day1_2.test")
- prod, _ := os.ReadFile("../input/day_1.prod")
+ prod, _ := os.ReadFile("../input/day01.prod")
content_test_1 := string(test_1)
content_test_2 := string(test_2)
content_prod := string(prod)
diff --git a/2024/go/src/day2/main.go b/2024/go/src/day02/main.go
index b06bed4..2658198 100644
--- a/2024/go/src/day2/main.go
+++ b/2024/go/src/day02/main.go
@@ -89,8 +89,8 @@ func solve_part_two(data string) int {
}
func main() {
- test := FileRead("../input/day2.test")
- prod := FileRead("../input/day2.prod")
+ test := FileRead("../input/day02.test")
+ prod := FileRead("../input/day02.prod")
fmt.Println("Part_1 test: ", solve_part_one(test))
fmt.Println("Part_1 prod: ", solve_part_one(prod))
diff --git a/2024/go/src/day3/main.go b/2024/go/src/day03/main.go
index 661d7aa..11e9f47 100644
--- a/2024/go/src/day3/main.go
+++ b/2024/go/src/day03/main.go
@@ -63,9 +63,9 @@ func solve_part_two(data string) int {
}
func main() {
- test := FileRead("../input/day3.test")
- test_2 := FileRead("../input/day3_2.test")
- prod := FileRead("../input/day3.prod")
+ test := FileRead("../input/day03.test")
+ test_2 := FileRead("../input/day03_2.test")
+ prod := FileRead("../input/day03.prod")
// Define the regex pattern with capture groups
fmt.Println("Part_1 test: ", solve_part_one(test))
diff --git a/2024/go/src/day4/main.go b/2024/go/src/day04/main.go
index ec90ed1..cb33819 100644
--- a/2024/go/src/day4/main.go
+++ b/2024/go/src/day04/main.go
@@ -123,8 +123,8 @@ func solve_part_two(data string) int {
}
func main() {
- test := FileRead("../input/day4.test")
- prod := FileRead("../input/day4.prod")
+ test := FileRead("../input/day04.test")
+ prod := FileRead("../input/day04.prod")
fmt.Println("Part_1 test: ", solve_part_one(test))
fmt.Println("Part_1 prod: ", solve_part_one(prod))
diff --git a/2024/go/src/day5/main.go b/2024/go/src/day05/main.go
index 65900e5..6250ed9 100644
--- a/2024/go/src/day5/main.go
+++ b/2024/go/src/day05/main.go
@@ -169,8 +169,8 @@ func solve_part_two(data string) int {
}
func main() {
- test := FileRead("../input/day5.test")
- prod := FileRead("../input/day5.prod")
+ test := FileRead("../input/day05.test")
+ prod := FileRead("../input/day05.prod")
fmt.Println("Part_1 test: ", solve_part_one(test))
fmt.Println("Part_1 prod: ", solve_part_one(prod))
diff --git a/2024/go/src/day6/main.go b/2024/go/src/day06/main.go
index fd629e6..10c1042 100644
--- a/2024/go/src/day6/main.go
+++ b/2024/go/src/day06/main.go
@@ -179,8 +179,8 @@ func solve_part_two(data string) int {
}
func main() {
- test := FileRead("../input/day6.test")
- prod := FileRead("../input/day6.prod")
+ test := FileRead("../input/day06.test")
+ prod := FileRead("../input/day06.prod")
fmt.Println("Part_1 test: ", solve_part_one(test))
fmt.Println("Part_1 prod: ", solve_part_one(prod))
fmt.Println("Part_2 test: ", solve_part_two(test))
diff --git a/2024/go/src/day7/main.go b/2024/go/src/day07/main.go
index 413086c..06c7438 100644
--- a/2024/go/src/day7/main.go
+++ b/2024/go/src/day07/main.go
@@ -181,8 +181,8 @@ func solve_part_two(data string) int64 {
}
func main() {
- test := FileRead("../input/day7.test")
- prod := FileRead("../input/day7.prod")
+ test := FileRead("../input/day07.test")
+ prod := FileRead("../input/day07.prod")
fmt.Println("Part_1 test: ", solve_part_one(test))
fmt.Println("Part_1 prod: ", solve_part_one(prod))
fmt.Println("Part_2 test: ", solve_part_two(test))
diff --git a/2024/go/src/day8/main.go b/2024/go/src/day08/main.go
index e801340..d3bce0c 100644
--- a/2024/go/src/day8/main.go
+++ b/2024/go/src/day08/main.go
@@ -130,8 +130,8 @@ func solve_part_two(data string) int {
}
func main() {
- test := FileRead("../input/day8.test")
- prod := FileRead("../input/day8.prod")
+ test := FileRead("../input/day08.test")
+ prod := FileRead("../input/day08.prod")
fmt.Println("Part_1 test: ", solve_part_one(test))
fmt.Println("Part_1 prod: ", solve_part_one(prod))
fmt.Println("Part_2 test: ", solve_part_two(test))
diff --git a/2024/go/src/day9/main.go b/2024/go/src/day09/main.go
index 0a9b51b..db2d99a 100644
--- a/2024/go/src/day9/main.go
+++ b/2024/go/src/day09/main.go
@@ -160,8 +160,8 @@ func solve_part_two(data string) int64 {
}
func main() {
- test := FileRead("../input/day9.test")
- prod := FileRead("../input/day9.prod")
+ test := FileRead("../input/day09.test")
+ prod := FileRead("../input/day09.prod")
fmt.Println("Part_1 test: ", solve_part_one(test))
fmt.Println("Part_1 prod: ", solve_part_one(prod))
fmt.Println("Part_2 test: ", solve_part_two(test))
diff --git a/2024/go/src/day11/main.go b/2024/go/src/day11/main.go
new file mode 100644
index 0000000..afe54c9
--- /dev/null
+++ b/2024/go/src/day11/main.go
@@ -0,0 +1,107 @@
+package main
+
+import (
+ "fmt"
+ "math"
+ "os"
+ "strconv"
+ "strings"
+)
+
+func FileRead(path string) string {
+ file, err := os.ReadFile(path)
+ if err != nil {
+ fmt.Println("Couldn't Read file: ", err)
+ }
+ return string(file)
+}
+
+func parseInput(data string) []int {
+ var stones []int
+ for _, x := range strings.Split(data, " ") {
+ x := strings.TrimRight(x, "\n")
+ stone, _ := strconv.Atoi(x)
+ stones = append(stones, stone)
+ }
+ return stones
+}
+
+func insert(slice []int, index int, value int) []int {
+ if index < 0 || index > len(slice) {
+ return slice // Or handle the error as you prefer
+ }
+ return append(slice[:index], append([]int{value}, slice[index:]...)...)
+}
+
+func getNumDigits(digit int) int {
+ cnt := 0
+ for digit != 0 {
+ digit /= 10
+ cnt++
+ }
+ return cnt
+}
+
+func splitNumber(num int) (int, int) {
+ digits := getNumDigits(num)
+ divisor := int(math.Pow10(digits / 2))
+ left := num / divisor
+ right := num % divisor
+ return left, right
+}
+
+func isEvenDigits(digit int) bool {
+ return getNumDigits(digit)%2 == 0
+}
+
+func processStone(cache *map[[2]int]int, stone, blinks int) int {
+ result := 0
+ if blinks == 0 {
+ return 1
+ } else {
+ _, exists := (*cache)[[2]int{stone, blinks}]
+ if !exists {
+ if stone == 0 {
+ result = processStone(cache, 1, blinks-1)
+ } else if isEvenDigits(stone) {
+ left, right := splitNumber(stone)
+ result += processStone(cache, left, blinks-1)
+ result += processStone(cache, right, blinks-1)
+ } else {
+ result = processStone(cache, stone*2024, blinks-1)
+ }
+ (*cache)[[2]int{stone, blinks}] = result
+ }
+ return (*cache)[[2]int{stone, blinks}]
+ }
+}
+func processStones(stones []int, blinks int) int {
+ cache := make(map[[2]int]int)
+ ans := 0
+ n := len(stones)
+ for j := 0; j < n; j++ {
+ ans += processStone(&cache, stones[j], blinks)
+ }
+ return ans
+}
+
+func solve_part_one(data string) int {
+ stones := parseInput(data)
+ ans := processStones(stones, 25)
+ return ans
+}
+
+func solve_part_two(data string) int {
+ stones := parseInput(data)
+ ans := processStones(stones, 75)
+ return ans
+}
+
+func main() {
+ test := FileRead("../input/day11.test")
+ prod := FileRead("../input/day11.prod")
+ fmt.Println("Part_1 test: ", solve_part_one(test))
+ fmt.Println("Part_1 prod: ", solve_part_one(prod))
+ fmt.Println("Part_2 test: ", solve_part_two(test))
+ fmt.Println("Part_2 prod: ", solve_part_two(prod))
+}