diff --git a/day5/main.go b/day5/main.go index c04858c..cf3cd12 100644 --- a/day5/main.go +++ b/day5/main.go @@ -14,7 +14,7 @@ func main() { inputFile := os.Args[1] part1, part2 := solution(inputFile) - fmt.Printf("(%s) Part 1: %d\n(%s) Part 2: %d\n:", inputFile, part1, inputFile, part2) + fmt.Printf("(%s) Part 1: %d\n(%s) Part 2: %d\n", inputFile, part1, inputFile, part2) } type Rule struct { @@ -86,12 +86,63 @@ func solution(inputFile string) (int, int) { if validUpdate { validSum += updatePages[len(updatePages)/2] + } else { + invalidSum += reorderedMid(updatePages, rules) } } - return validSum, invalidSum } +func reorderedMid(pages []int, rules []Rule) int { + corrected := false + for !corrected { + for i := 0; i < len(pages); i++ { + for j := 1; j < len(pages); j++ { + if i == j { + continue + } + if i < j { + valid := isValid(rules, pages[i], pages[j]) + if !valid { + pages[i], pages[j] = pages[j], pages[i] + } + } else { + valid := isValid(rules, pages[j], pages[i]) + if !valid { + pages[i], pages[j] = pages[j], pages[i] + } + } + } + } + + corrected = wasCorrected(pages, rules) + } + fmt.Printf("Corrected %v\n", pages) + return pages[len(pages)/2] +} + +func wasCorrected(pages []int, rules []Rule) bool { + for i := 0; i < len(pages); i++ { + for j := 1; j < len(pages); j++ { + if i == j { + continue + } + if i < j { + valid := isValid(rules, pages[i], pages[j]) + if !valid { + return false + } + } else { + valid := isValid(rules, pages[j], pages[i]) + if !valid { + return false + } + } + } + } + return true +} + func isValid(rules []Rule, left, right int) bool { for _, rule := range rules { if rule.Left == right && rule.Right == left {