[ADD] main: Added day 11 solution
This commit is contained in:
parent
a7d722cf7f
commit
969e1cc5f9
3 changed files with 160 additions and 0 deletions
1
11/input.txt
Normal file
1
11/input.txt
Normal file
|
|
@ -0,0 +1 @@
|
|||
112 1110 163902 0 7656027 83039 9 74
|
||||
158
11/main.go
Normal file
158
11/main.go
Normal file
|
|
@ -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)
|
||||
}
|
||||
1
11/sample.txt
Normal file
1
11/sample.txt
Normal file
|
|
@ -0,0 +1 @@
|
|||
125 17
|
||||
Loading…
Reference in a new issue