diff --git a/11/input.txt b/11/input.txt new file mode 100644 index 0000000..cceb3f6 --- /dev/null +++ b/11/input.txt @@ -0,0 +1 @@ +112 1110 163902 0 7656027 83039 9 74 \ No newline at end of file diff --git a/11/main.go b/11/main.go new file mode 100644 index 0000000..22eb5c5 --- /dev/null +++ b/11/main.go @@ -0,0 +1,158 @@ +package main + +import ( + "bufio" + "fmt" + "os" + "slices" + "strconv" + "strings" + "time" +) + +const FILE_PATH = "./input.txt" + +//const FILE_PATH = "./sample.txt" + +func LoadInput(filename string) ([]string, error) { + file, err := os.Open(filename) + if err != nil { + return nil, err + } + defer file.Close() + + var lines []string + scanner := bufio.NewScanner(file) + for scanner.Scan() { + lines = append(lines, scanner.Text()) + } + + if err := scanner.Err(); err != nil { + return nil, err + } + + return lines, nil +} + +type structuredInput = []int + +type Stone struct { + number int + count int +} + +func TransformInput(lines []string) structuredInput { + var result = make([]int, 0) + var numbs = strings.Split(lines[0], " ") + var temp int + + for _, numb := range numbs { + temp, _ = strconv.Atoi(numb) + result = append(result, temp) + } + + return result +} + +func CreateStones(input []int) []Stone { + var result = make([]Stone, 0) + var temp Stone + + for _, numb := range input { + temp = Stone{numb, 1} + result = append(result, temp) + } + + return result +} + +func CombineStones(stones []Stone) []Stone { + for i := 0; i < len(stones)-1; i++ { + for j := len(stones) - 1; j > i; j-- { + if stones[i].number == stones[j].number { + stones[i].count += stones[j].count + stones = slices.Delete(stones, j, j+1) + } + } + } + return stones +} + +func GenerateNextStep(stones []Stone) []Stone { + var result = make([]Stone, 0) + var temp string + var numb int + for _, stone := range stones { + if stone.number == 0 { + result = append(result, Stone{1, stone.count}) + continue + } + temp = strconv.Itoa(stone.number) + if len(temp)%2 == 0 { + numb, _ = strconv.Atoi(temp[:len(temp)/2]) + result = append(result, Stone{numb, stone.count}) + numb, _ = strconv.Atoi(temp[len(temp)/2:]) + result = append(result, Stone{numb, stone.count}) + continue + } + + result = append(result, Stone{stone.number * 2024, stone.count}) + } + + return result +} + +func Part1(input structuredInput) int { + var result = 0 + + var stones = CreateStones(input) + + for i := 0; i < 25; i++ { + stones = GenerateNextStep(stones) + stones = CombineStones(stones) + } + for i := 0; i < len(stones); i++ { + result += stones[i].count + } + + return result +} + +func Part2(input structuredInput) int { + var result = 0 + + var stones = CreateStones(input) + + for i := 0; i < 75; i++ { + stones = GenerateNextStep(stones) + stones = CombineStones(stones) + } + for i := 0; i < len(stones); i++ { + result += stones[i].count + } + + return result +} + +func main() { + var start time.Time + var elapsed time.Duration = 0 + input, err := LoadInput(FILE_PATH) + if err != nil { + fmt.Println("Error loading input:", err) + return + } + + structuredInput := TransformInput(input) + fmt.Println("Structured Input:", structuredInput) + + start = time.Now() + fmt.Println("Solution Part 1: ", Part1(structuredInput)) + elapsed = time.Since(start) + fmt.Printf("Part 1 took %s\n", elapsed) + + start = time.Now() + fmt.Println("Solution Part 2: ", Part2(structuredInput)) + elapsed = time.Since(start) + fmt.Printf("Part 2 took %s\n", elapsed) +} diff --git a/11/sample.txt b/11/sample.txt new file mode 100644 index 0000000..528f9d5 --- /dev/null +++ b/11/sample.txt @@ -0,0 +1 @@ +125 17 \ No newline at end of file