add 2024/day5
This commit is contained in:
parent
e5f38abb8c
commit
b3eaa7e433
2 changed files with 115 additions and 5 deletions
110
2024/05/main.go
Normal file
110
2024/05/main.go
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"sort"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"aoc/helper"
|
||||||
|
)
|
||||||
|
|
||||||
|
type rules map[[2]int]struct{}
|
||||||
|
type updates []update
|
||||||
|
type update []int
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
order_rules, page_updates := getOrdersAndUpdate()
|
||||||
|
|
||||||
|
// part 1
|
||||||
|
sum := 0
|
||||||
|
for _, update := range page_updates {
|
||||||
|
if update.validateRules(order_rules) {
|
||||||
|
sum += update.getMiddleNumber()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Printf("Summed updates: %d\n", sum)
|
||||||
|
|
||||||
|
// part 2
|
||||||
|
sum = 0
|
||||||
|
for _, update := range page_updates {
|
||||||
|
if update.validateRules(order_rules) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
update.reorderByRules(order_rules)
|
||||||
|
if update.validateRules(order_rules) {
|
||||||
|
sum += update.getMiddleNumber()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Printf("Sum fixed updates: %d\n", sum)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u update) reorderByRules(r rules) update {
|
||||||
|
sort.Slice(
|
||||||
|
u,
|
||||||
|
func(i, j int) bool {
|
||||||
|
pair := [2]int{u[i], u[j]}
|
||||||
|
if _, exists := r[pair]; exists {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
pair = [2]int{u[j], u[i]}
|
||||||
|
if _, exists := r[pair]; exists {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
},
|
||||||
|
)
|
||||||
|
return u
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u update) validateRules(r rules) bool {
|
||||||
|
for i := 0; i < len(u)-1; i++ {
|
||||||
|
// check if a rule exists for current page pair (this + next)
|
||||||
|
pair := [2]int{u[i+1], u[i]}
|
||||||
|
if _, exists := r[pair]; exists {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u update) getMiddleNumber() int {
|
||||||
|
return u[len(u)/2]
|
||||||
|
}
|
||||||
|
|
||||||
|
func getOrdersAndUpdate() (rules, updates) {
|
||||||
|
data := helper.GetLines()
|
||||||
|
|
||||||
|
// parse rules
|
||||||
|
rules := rules{}
|
||||||
|
for data.Scan() {
|
||||||
|
line := data.Text()
|
||||||
|
|
||||||
|
if len(line) <= 1 {
|
||||||
|
// empty line, leave the rest for the update parser
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
parts := strings.Split(line, "|")
|
||||||
|
page := helper.ToInt(parts[0])
|
||||||
|
after := helper.ToInt(parts[1])
|
||||||
|
|
||||||
|
rules[[2]int{page, after}] = struct{}{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// parse updates
|
||||||
|
updates := updates{}
|
||||||
|
for data.Scan() {
|
||||||
|
line := data.Text()
|
||||||
|
parts := strings.Split(line, ",")
|
||||||
|
|
||||||
|
update := update{}
|
||||||
|
for _, part := range parts {
|
||||||
|
update = append(update, helper.ToInt(part))
|
||||||
|
}
|
||||||
|
|
||||||
|
updates = append(updates, update)
|
||||||
|
}
|
||||||
|
|
||||||
|
return rules, updates
|
||||||
|
}
|
|
@ -11,7 +11,7 @@ import (
|
||||||
|
|
||||||
const INPUT_FILE = "input"
|
const INPUT_FILE = "input"
|
||||||
|
|
||||||
func getLines() *bufio.Scanner {
|
func GetLines() *bufio.Scanner {
|
||||||
wd, err := os.Getwd()
|
wd, err := os.Getwd()
|
||||||
filePath := filepath.Join(wd, INPUT_FILE)
|
filePath := filepath.Join(wd, INPUT_FILE)
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ func getLines() *bufio.Scanner {
|
||||||
}
|
}
|
||||||
|
|
||||||
func ReadLinesTwoIntSlices() (list_a []int, list_b []int) {
|
func ReadLinesTwoIntSlices() (list_a []int, list_b []int) {
|
||||||
scanner := getLines()
|
scanner := GetLines()
|
||||||
for scanner.Scan() {
|
for scanner.Scan() {
|
||||||
parts := strings.Fields(scanner.Text())
|
parts := strings.Fields(scanner.Text())
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ func ReadLinesTwoIntSlices() (list_a []int, list_b []int) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func ReadLinesToIntSlices() (lines [][]int) {
|
func ReadLinesToIntSlices() (lines [][]int) {
|
||||||
scanner := getLines()
|
scanner := GetLines()
|
||||||
for scanner.Scan() {
|
for scanner.Scan() {
|
||||||
string_line := strings.Fields(scanner.Text())
|
string_line := strings.Fields(scanner.Text())
|
||||||
int_line := make([]int, len(string_line))
|
int_line := make([]int, len(string_line))
|
||||||
|
@ -53,7 +53,7 @@ func ReadLinesToIntSlices() (lines [][]int) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func ReadLinesToStringSlices() (lines []string) {
|
func ReadLinesToStringSlices() (lines []string) {
|
||||||
scanner := getLines()
|
scanner := GetLines()
|
||||||
for scanner.Scan() {
|
for scanner.Scan() {
|
||||||
lines = append(lines, scanner.Text())
|
lines = append(lines, scanner.Text())
|
||||||
}
|
}
|
||||||
|
@ -62,7 +62,7 @@ func ReadLinesToStringSlices() (lines []string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func ReadLinesToString() (line string) {
|
func ReadLinesToString() (line string) {
|
||||||
scanner := getLines()
|
scanner := GetLines()
|
||||||
for scanner.Scan() {
|
for scanner.Scan() {
|
||||||
line += scanner.Text()
|
line += scanner.Text()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue