[ADD] main: Added day 5 solution

This commit is contained in:
Mika 2024-12-06 17:55:37 +01:00
parent 4a969fa3be
commit a5e32e9995
3 changed files with 1563 additions and 0 deletions

1368
05/input.txt Normal file

File diff suppressed because it is too large Load diff

167
05/main.go Normal file
View file

@ -0,0 +1,167 @@
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
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 Rule struct {
definition int
limiter int
}
type structuredInput struct {
rules []Rule
updates [][]int
}
func TransformInput(lines []string) structuredInput {
var nums []string
var num1 int
var num2 int
var result structuredInput = structuredInput{}
var i = 0
for ; lines[i] != ""; i++ {
nums = strings.Split(lines[i], "|")
num1, _ = strconv.Atoi(nums[0])
num2, _ = strconv.Atoi(nums[1])
result.rules = append(result.rules, Rule{num1, num2})
}
i++
var c = 0
for ; i < len(lines); i++ {
result.updates = append(result.updates, make([]int, 0))
nums = strings.Split(lines[i], ",")
for _, num := range nums {
num1, _ = strconv.Atoi(num)
result.updates[c] = append(result.updates[c], num1)
}
c++
}
return result
}
func IsCorrect(rules []Rule, update []int) bool {
for i, page := range update {
for _, rule := range rules {
if rule.definition != page {
continue
}
for j := 0; j < i; j++ {
if update[j] == rule.limiter {
return false
}
}
}
}
return true
}
func Part1(input structuredInput) int {
var result = 0
for _, update := range input.updates {
if IsCorrect(input.rules, update) {
result += update[len(update)/2]
}
}
return result
}
func CorrectUpdate(rules []Rule, update []int) []int {
var result []int = make([]int, len(update))
copy(result, update)
var IsCorrect = false
var temp = 0
for !IsCorrect {
IsCorrect = true
for i, page := range result {
for _, rule := range rules {
if rule.definition != page {
continue
}
for j := 0; j < i; j++ {
if result[j] == rule.limiter {
temp = result[j]
result[j] = result[i]
result[i] = temp
IsCorrect = false
break
}
}
if !IsCorrect {
break
}
}
if !IsCorrect {
break
}
}
}
return result
}
func Part2(input structuredInput) int {
var result = 0
for _, update := range input.updates {
if IsCorrect(input.rules, update) {
continue
}
result += CorrectUpdate(input.rules, update)[len(update)/2]
}
return result
}
func main() {
input, err := LoadInput(FILE_PATH)
if err != nil {
fmt.Println("Error loading input:", err)
return
}
structuredInput := TransformInput(input)
fmt.Println("Structured Input:", structuredInput)
fmt.Println("Solution Part 1: ", Part1(structuredInput))
fmt.Println("Solution Part 2: ", Part2(structuredInput))
}

28
05/sample.txt Normal file
View file

@ -0,0 +1,28 @@
47|53
97|13
97|61
97|47
75|29
61|13
75|53
29|13
97|29
53|29
61|53
97|53
61|29
47|13
75|47
97|75
47|61
75|61
47|29
75|13
53|13
75,47,61,53,29
97,61,53,29,13
75,29,13
75,97,47,61,53
61,13,29
97,13,75,29,47