diff options
| author | omagdy <omar.professional8777@gmail.com> | 2024-12-12 18:31:50 +0200 |
|---|---|---|
| committer | omagdy <omar.professional8777@gmail.com> | 2024-12-12 18:31:50 +0200 |
| commit | 0cb12b95ef11fe283731e862e3953f27eeea8757 (patch) | |
| tree | 66d54e44b821073ddf6381bf9b3d9d55b3d86c31 /2024/go | |
| parent | 93cc02c058f39d370472dfe7d667ae7a2f6396b3 (diff) | |
| download | aoc-0cb12b95ef11fe283731e862e3953f27eeea8757.tar.xz aoc-0cb12b95ef11fe283731e862e3953f27eeea8757.zip | |
Day 11 done.
Diffstat (limited to '2024/go')
| -rw-r--r-- | 2024/go/input/day01.prod (renamed from 2024/go/input/day1.prod) | 0 | ||||
| -rw-r--r-- | 2024/go/input/day01.test (renamed from 2024/go/input/day1.test) | 0 | ||||
| -rw-r--r-- | 2024/go/input/day01_2.test (renamed from 2024/go/input/day1_2.test) | 0 | ||||
| -rw-r--r-- | 2024/go/input/day02.prod (renamed from 2024/go/input/day2.prod) | 0 | ||||
| -rw-r--r-- | 2024/go/input/day02.test (renamed from 2024/go/input/day2.test) | 0 | ||||
| -rw-r--r-- | 2024/go/input/day03.prod (renamed from 2024/go/input/day3.prod) | 0 | ||||
| -rw-r--r-- | 2024/go/input/day03.test (renamed from 2024/go/input/day3.test) | 0 | ||||
| -rw-r--r-- | 2024/go/input/day03_2.test (renamed from 2024/go/input/day3_2.test) | 0 | ||||
| -rw-r--r-- | 2024/go/input/day04.prod (renamed from 2024/go/input/day4.prod) | 0 | ||||
| -rw-r--r-- | 2024/go/input/day04.test (renamed from 2024/go/input/day4.test) | 0 | ||||
| -rw-r--r-- | 2024/go/input/day05.prod (renamed from 2024/go/input/day5.prod) | 0 | ||||
| -rw-r--r-- | 2024/go/input/day05.test (renamed from 2024/go/input/day5.test) | 0 | ||||
| -rw-r--r-- | 2024/go/input/day06.prod (renamed from 2024/go/input/day6.prod) | 0 | ||||
| -rw-r--r-- | 2024/go/input/day06.test (renamed from 2024/go/input/day6.test) | 0 | ||||
| -rw-r--r-- | 2024/go/input/day07.prod (renamed from 2024/go/input/day7.prod) | 0 | ||||
| -rw-r--r-- | 2024/go/input/day07.test (renamed from 2024/go/input/day7.test) | 0 | ||||
| -rw-r--r-- | 2024/go/input/day08.prod (renamed from 2024/go/input/day8.prod) | 0 | ||||
| -rw-r--r-- | 2024/go/input/day08.test (renamed from 2024/go/input/day8.test) | 0 | ||||
| -rw-r--r-- | 2024/go/input/day09.prod (renamed from 2024/go/input/day9.prod) | 0 | ||||
| -rw-r--r-- | 2024/go/input/day09.test (renamed from 2024/go/input/day9.test) | 0 | ||||
| -rw-r--r-- | 2024/go/input/day11.prod | 1 | ||||
| -rw-r--r-- | 2024/go/input/day11.test | 1 | ||||
| -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.go | 107 |
32 files changed, 127 insertions, 18 deletions
diff --git a/2024/go/input/day1.prod b/2024/go/input/day01.prod index cb6af3c..cb6af3c 100644 --- a/2024/go/input/day1.prod +++ b/2024/go/input/day01.prod diff --git a/2024/go/input/day1.test b/2024/go/input/day01.test index b8af9ad..b8af9ad 100644 --- a/2024/go/input/day1.test +++ b/2024/go/input/day01.test diff --git a/2024/go/input/day1_2.test b/2024/go/input/day01_2.test index b8af9ad..b8af9ad 100644 --- a/2024/go/input/day1_2.test +++ b/2024/go/input/day01_2.test diff --git a/2024/go/input/day2.prod b/2024/go/input/day02.prod index 2fd095e..2fd095e 100644 --- a/2024/go/input/day2.prod +++ b/2024/go/input/day02.prod diff --git a/2024/go/input/day2.test b/2024/go/input/day02.test index b49c10d..b49c10d 100644 --- a/2024/go/input/day2.test +++ b/2024/go/input/day02.test diff --git a/2024/go/input/day3.prod b/2024/go/input/day03.prod index 1c0f071..1c0f071 100644 --- a/2024/go/input/day3.prod +++ b/2024/go/input/day03.prod diff --git a/2024/go/input/day3.test b/2024/go/input/day03.test index 6a7899d..6a7899d 100644 --- a/2024/go/input/day3.test +++ b/2024/go/input/day03.test diff --git a/2024/go/input/day3_2.test b/2024/go/input/day03_2.test index 30032cb..30032cb 100644 --- a/2024/go/input/day3_2.test +++ b/2024/go/input/day03_2.test diff --git a/2024/go/input/day4.prod b/2024/go/input/day04.prod index a096a8f..a096a8f 100644 --- a/2024/go/input/day4.prod +++ b/2024/go/input/day04.prod diff --git a/2024/go/input/day4.test b/2024/go/input/day04.test index 1f4eda2..1f4eda2 100644 --- a/2024/go/input/day4.test +++ b/2024/go/input/day04.test diff --git a/2024/go/input/day5.prod b/2024/go/input/day05.prod index 0f16ea5..0f16ea5 100644 --- a/2024/go/input/day5.prod +++ b/2024/go/input/day05.prod diff --git a/2024/go/input/day5.test b/2024/go/input/day05.test index 9d146d6..9d146d6 100644 --- a/2024/go/input/day5.test +++ b/2024/go/input/day05.test diff --git a/2024/go/input/day6.prod b/2024/go/input/day06.prod index fb9193b..fb9193b 100644 --- a/2024/go/input/day6.prod +++ b/2024/go/input/day06.prod diff --git a/2024/go/input/day6.test b/2024/go/input/day06.test index a4eb402..a4eb402 100644 --- a/2024/go/input/day6.test +++ b/2024/go/input/day06.test diff --git a/2024/go/input/day7.prod b/2024/go/input/day07.prod index 333492b..333492b 100644 --- a/2024/go/input/day7.prod +++ b/2024/go/input/day07.prod diff --git a/2024/go/input/day7.test b/2024/go/input/day07.test index fc6e099..fc6e099 100644 --- a/2024/go/input/day7.test +++ b/2024/go/input/day07.test diff --git a/2024/go/input/day8.prod b/2024/go/input/day08.prod index 1e7f2b1..1e7f2b1 100644 --- a/2024/go/input/day8.prod +++ b/2024/go/input/day08.prod diff --git a/2024/go/input/day8.test b/2024/go/input/day08.test index 78a1e91..78a1e91 100644 --- a/2024/go/input/day8.test +++ b/2024/go/input/day08.test diff --git a/2024/go/input/day9.prod b/2024/go/input/day09.prod index b632cf8..b632cf8 100644 --- a/2024/go/input/day9.prod +++ b/2024/go/input/day09.prod diff --git a/2024/go/input/day9.test b/2024/go/input/day09.test index f96c390..f96c390 100644 --- a/2024/go/input/day9.test +++ b/2024/go/input/day09.test diff --git a/2024/go/input/day11.prod b/2024/go/input/day11.prod new file mode 100644 index 0000000..e029d56 --- /dev/null +++ b/2024/go/input/day11.prod @@ -0,0 +1 @@ +5688 62084 2 3248809 179 79 0 172169 diff --git a/2024/go/input/day11.test b/2024/go/input/day11.test new file mode 100644 index 0000000..9b26c84 --- /dev/null +++ b/2024/go/input/day11.test @@ -0,0 +1 @@ +125 17 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)) +} |
