Day 5: Print Queue
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
Go
Using a map to store u|v relations. Part 2 sorting with a custom compare function worked very nicely
spoiler
func main() { file, _ := os.Open("input.txt") defer file.Close() scanner := bufio.NewScanner(file) mapPages := make(map[string][]string) rulesSection := true middleSumOk := 0 middleSumNotOk := 0 for scanner.Scan() { line := scanner.Text() if line == "" { rulesSection = false continue } if rulesSection { parts := strings.Split(line, "|") u, v := parts[0], parts[1] mapPages[u] = append(mapPages[u], v) } else { update := strings.Split(line, ",") isOk := true for i := 1; i < len(update); i++ { u, v := update[i-1], update[i] if !slices.Contains(mapPages[u], v) { isOk = false break } } middlePos := len(update) / 2 if isOk { middlePage, _ := strconv.Atoi(update[middlePos]) middleSumOk += middlePage } else { slices.SortFunc(update, func(u, v string) int { if slices.Contains(mapPages[u], v) { return -1 } else if slices.Contains(mapPages[v], u) { return 1 } return 0 }) middlePage, _ := strconv.Atoi(update[middlePos]) middleSumNotOk += middlePage } } } fmt.Println("Part 1:", middleSumOk) fmt.Println("Part 2:", middleSumNotOk) }