From 3afbdd0736fc965f2c6ee7016005d1760965a448 Mon Sep 17 00:00:00 2001 From: omagdy Date: Mon, 2 Dec 2024 19:30:22 +0200 Subject: Day 2 done. --- 2024/go/src/day1/main.go | 77 +++++++++++++++++++++++++++++++++++++ 2024/go/src/day2/main.go | 99 ++++++++++++++++++++++++++++++++++++++++++++++++ 2024/go/src/main.go | 77 ------------------------------------- 3 files changed, 176 insertions(+), 77 deletions(-) create mode 100644 2024/go/src/day1/main.go create mode 100644 2024/go/src/day2/main.go delete mode 100644 2024/go/src/main.go (limited to '2024/go/src') diff --git a/2024/go/src/day1/main.go b/2024/go/src/day1/main.go new file mode 100644 index 0000000..cde4b79 --- /dev/null +++ b/2024/go/src/day1/main.go @@ -0,0 +1,77 @@ +package main + +import ( + "fmt" + "os" + "sort" + "strconv" + "strings" +) + +func AbsInt(x int) int { + if x < 0 { + return -x + } + return x +} + +func solve_part_one(data string) int { + var list_1 []int + var list_2 []int + + ans := 0 + for _, line := range strings.Split(data, "\n") { + if len(line) > 0 { + elements := strings.Split(line, " ") + ele1, _ := strconv.Atoi(elements[0]) + ele2, _ := strconv.Atoi(elements[1]) + list_1 = append(list_1, ele1) + list_2 = append(list_2, ele2) + } + } + sort.Ints(list_1) + sort.Ints(list_2) + for i := range len(list_1) { + ans += AbsInt(list_1[i] - list_2[i]) + } + return ans +} + +func solve_part_two(data string) int { + var list_1 []int + var list_2 []int + + ans := 0 + for _, line := range strings.Split(data, "\n") { + if len(line) > 0 { + elements := strings.Split(line, " ") + ele1, _ := strconv.Atoi(elements[0]) + ele2, _ := strconv.Atoi(elements[1]) + list_1 = append(list_1, ele1) + list_2 = append(list_2, ele2) + } + } + counts := make(map[int]int) + + for _, num := range list_2 { + counts[num]++ + } + for i := range len(list_1) { + ans += list_1[i] * counts[list_1[i]] + } + return ans +} + +func main() { + test_1, _ := os.ReadFile("../input/day_1.test") + test_2, _ := os.ReadFile("../input/day_1_2.test") + prod, _ := os.ReadFile("../input/day_1.prod") + content_test_1 := string(test_1) + content_test_2 := string(test_2) + content_prod := string(prod) + + fmt.Println("Part_1 test: ", solve_part_one(content_test_1)) + fmt.Println("Part_1 prod: ", solve_part_one(content_prod)) + fmt.Println("Part_2 test: ", solve_part_two(content_test_2)) + fmt.Println("Part_2 prod: ", solve_part_two(content_prod)) +} diff --git a/2024/go/src/day2/main.go b/2024/go/src/day2/main.go new file mode 100644 index 0000000..6caad61 --- /dev/null +++ b/2024/go/src/day2/main.go @@ -0,0 +1,99 @@ +package main + +import ( + "fmt" + "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 reports [][]int + for _, line := range strings.Split(data, "\n") { + var report []int + if len(line) > 0 { + elements := strings.Split(line, " ") + for _, ele := range elements { + e, err := strconv.Atoi(ele) + if err != nil { + fmt.Println("Couldn't parse string to int ", err) + } + report = append(report, e) + } + reports = append(reports, report) + } + } + return reports +} + +func isSafe(report []int) bool { + increasing := report[0] < report[1] + flag := true + for i := range len(report) - 1 { + if increasing { + diff := report[i+1] - report[i] + if report[i] >= report[i+1] || diff > 3 || diff < 1 { + flag = false + break + } + } else { + diff := report[i] - report[i+1] + if report[i] <= report[i+1] || diff > 3 || diff < 1 { + flag = false + break + } + } + } + return flag +} + +func solve_part_one(data string) int { + reports := parseInput(data) + cnt := 0 + for _, report := range reports { + if isSafe(report) { + cnt += 1 + } + } + return cnt +} + +func solve_part_two(data string) int { + reports := parseInput(data) + cnt := 0 + for _, report := range reports { + if isSafe(report) { + cnt += 1 + } else { + for i := range len(report) { + reportTmp := make([]int, len(report)) + copy(reportTmp, report) + newReport := append(reportTmp[:i], reportTmp[i+1:]...) + if isSafe(newReport) { + cnt += 1 + break + } + } + } + } + return cnt +} + +func main() { + test := FileRead("../input/day_2.test") + prod := FileRead("../input/day_2.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)) +} diff --git a/2024/go/src/main.go b/2024/go/src/main.go deleted file mode 100644 index cde4b79..0000000 --- a/2024/go/src/main.go +++ /dev/null @@ -1,77 +0,0 @@ -package main - -import ( - "fmt" - "os" - "sort" - "strconv" - "strings" -) - -func AbsInt(x int) int { - if x < 0 { - return -x - } - return x -} - -func solve_part_one(data string) int { - var list_1 []int - var list_2 []int - - ans := 0 - for _, line := range strings.Split(data, "\n") { - if len(line) > 0 { - elements := strings.Split(line, " ") - ele1, _ := strconv.Atoi(elements[0]) - ele2, _ := strconv.Atoi(elements[1]) - list_1 = append(list_1, ele1) - list_2 = append(list_2, ele2) - } - } - sort.Ints(list_1) - sort.Ints(list_2) - for i := range len(list_1) { - ans += AbsInt(list_1[i] - list_2[i]) - } - return ans -} - -func solve_part_two(data string) int { - var list_1 []int - var list_2 []int - - ans := 0 - for _, line := range strings.Split(data, "\n") { - if len(line) > 0 { - elements := strings.Split(line, " ") - ele1, _ := strconv.Atoi(elements[0]) - ele2, _ := strconv.Atoi(elements[1]) - list_1 = append(list_1, ele1) - list_2 = append(list_2, ele2) - } - } - counts := make(map[int]int) - - for _, num := range list_2 { - counts[num]++ - } - for i := range len(list_1) { - ans += list_1[i] * counts[list_1[i]] - } - return ans -} - -func main() { - test_1, _ := os.ReadFile("../input/day_1.test") - test_2, _ := os.ReadFile("../input/day_1_2.test") - prod, _ := os.ReadFile("../input/day_1.prod") - content_test_1 := string(test_1) - content_test_2 := string(test_2) - content_prod := string(prod) - - fmt.Println("Part_1 test: ", solve_part_one(content_test_1)) - fmt.Println("Part_1 prod: ", solve_part_one(content_prod)) - fmt.Println("Part_2 test: ", solve_part_two(content_test_2)) - fmt.Println("Part_2 prod: ", solve_part_two(content_prod)) -} -- cgit v1.2.3