2025 Day 5 Complete!
This commit is contained in:
1183
2025/day05/input
Normal file
1183
2025/day05/input
Normal file
File diff suppressed because it is too large
Load Diff
111
2025/day05/main.go
Normal file
111
2025/day05/main.go
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
h "git.bullercodeworks.com/brian/adventofcode/helpers"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
inp := h.StdinToStringSlice()
|
||||||
|
part1(inp)
|
||||||
|
fmt.Println()
|
||||||
|
part2(inp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func part1(inp []string) {
|
||||||
|
var ret int
|
||||||
|
fresh, ing := parseDB(inp)
|
||||||
|
for i := range ing {
|
||||||
|
for j := range fresh {
|
||||||
|
if fresh[j].Contains(ing[i]) {
|
||||||
|
ret++
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println("# Part 1")
|
||||||
|
fmt.Println(ret)
|
||||||
|
}
|
||||||
|
|
||||||
|
func part2(inp []string) {
|
||||||
|
fresh, _ := parseDB(inp)
|
||||||
|
for {
|
||||||
|
var toDel []*Range
|
||||||
|
for i := 0; i < len(fresh)-1; i++ {
|
||||||
|
for j := i + 1; j < len(fresh); j++ {
|
||||||
|
if fresh[i].Overlaps(fresh[j]) {
|
||||||
|
fresh[i].Merge(fresh[j])
|
||||||
|
toDel = append(toDel, fresh[j])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(toDel) > 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(toDel) == 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
for i := range toDel {
|
||||||
|
for j := 0; j < len(fresh); j++ {
|
||||||
|
if fresh[j] == toDel[i] {
|
||||||
|
fresh = append(fresh[:j], fresh[j+1:]...)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// At this point, all ranges in 'fresh' should be non-overlapping
|
||||||
|
var ret int
|
||||||
|
for i := range fresh {
|
||||||
|
ret += fresh[i].Size()
|
||||||
|
}
|
||||||
|
fmt.Println("# Part 2")
|
||||||
|
fmt.Println(ret)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Range struct {
|
||||||
|
beg, end int
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewRange(inp string) *Range {
|
||||||
|
r := Range{}
|
||||||
|
fmt.Sscanf(inp, "%d-%d", &r.beg, &r.end)
|
||||||
|
return &r
|
||||||
|
}
|
||||||
|
func (r *Range) Contains(i int) bool { return r.beg <= i && i <= r.end }
|
||||||
|
func (r *Range) Overlaps(r2 *Range) bool {
|
||||||
|
return r.Contains(r2.beg) || r.Contains(r2.end) || r2.Contains(r.beg) || r2.Contains(r.end)
|
||||||
|
}
|
||||||
|
func (r *Range) Merge(r2 *Range) {
|
||||||
|
if !r.Overlaps(r2) {
|
||||||
|
fmt.Println("Panic! Tried to merge non-overlapping ranges")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
r.beg = h.Min(r.beg, r2.beg)
|
||||||
|
r.end = h.Max(r.end, r2.end)
|
||||||
|
}
|
||||||
|
func (r *Range) Size() int { return (r.end - r.beg) + 1 }
|
||||||
|
func (r Range) String() string { return fmt.Sprintf("%d to %d", r.beg, r.end) }
|
||||||
|
|
||||||
|
func parseDB(inp []string) ([]*Range, []int) {
|
||||||
|
var retRng []*Range
|
||||||
|
var retInt []int
|
||||||
|
inRanges := true
|
||||||
|
for i := range inp {
|
||||||
|
if inp[i] == "" {
|
||||||
|
inRanges = false
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if inRanges {
|
||||||
|
retRng = append(retRng, NewRange(inp[i]))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
var ri int
|
||||||
|
fmt.Sscanf(inp[i], "%d", &ri)
|
||||||
|
retInt = append(retInt, ri)
|
||||||
|
}
|
||||||
|
return retRng, retInt
|
||||||
|
}
|
||||||
114
2025/day05/problem
Normal file
114
2025/day05/problem
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
Advent of Code
|
||||||
|
br0xen [7](AoC++) 10*
|
||||||
|
|
||||||
|
--- Day 5: Cafeteria ---
|
||||||
|
|
||||||
|
As the forklifts break through the wall, the Elves are delighted to
|
||||||
|
discover that there was a cafeteria on the other side after all.
|
||||||
|
|
||||||
|
You can hear a commotion coming from the kitchen. "At this rate, we won't
|
||||||
|
have any time left to put the wreaths up in the dining hall!" Resolute in
|
||||||
|
your quest, you investigate.
|
||||||
|
|
||||||
|
"If only we hadn't switched to the new inventory management system right
|
||||||
|
before Christmas!" another Elf exclaims. You ask what's going on.
|
||||||
|
|
||||||
|
The Elves in the kitchen explain the situation: because of their
|
||||||
|
complicated new inventory management system, they can't figure out which
|
||||||
|
of their ingredients are fresh and which are spoiled. When you ask how it
|
||||||
|
works, they give you a copy of their database (your puzzle input).
|
||||||
|
|
||||||
|
The database operates on ingredient IDs. It consists of a list of fresh
|
||||||
|
ingredient ID ranges, a blank line, and a list of available ingredient
|
||||||
|
IDs. For example:
|
||||||
|
|
||||||
|
3-5
|
||||||
|
10-14
|
||||||
|
16-20
|
||||||
|
12-18
|
||||||
|
|
||||||
|
1
|
||||||
|
5
|
||||||
|
8
|
||||||
|
11
|
||||||
|
17
|
||||||
|
32
|
||||||
|
|
||||||
|
The fresh ID ranges are inclusive: the range 3-5 means that ingredient IDs
|
||||||
|
3, 4, and 5 are all fresh. The ranges can also overlap; an ingredient ID
|
||||||
|
is fresh if it is in any range.
|
||||||
|
|
||||||
|
The Elves are trying to determine which of the available ingredient IDs
|
||||||
|
are fresh. In this example, this is done as follows:
|
||||||
|
|
||||||
|
• Ingredient ID 1 is spoiled because it does not fall into any range.
|
||||||
|
• Ingredient ID 5 is fresh because it falls into range 3-5.
|
||||||
|
• Ingredient ID 8 is spoiled.
|
||||||
|
• Ingredient ID 11 is fresh because it falls into range 10-14.
|
||||||
|
• Ingredient ID 17 is fresh because it falls into range 16-20 as well as
|
||||||
|
range 12-18.
|
||||||
|
• Ingredient ID 32 is spoiled.
|
||||||
|
|
||||||
|
So, in this example, 3 of the available ingredient IDs are fresh.
|
||||||
|
|
||||||
|
Process the database file from the new inventory management system. How
|
||||||
|
many of the available ingredient IDs are fresh?
|
||||||
|
|
||||||
|
Your puzzle answer was 848.
|
||||||
|
|
||||||
|
--- Part Two ---
|
||||||
|
|
||||||
|
The Elves start bringing their spoiled inventory to the trash chute at the
|
||||||
|
back of the kitchen.
|
||||||
|
|
||||||
|
So that they can stop bugging you when they get new inventory, the Elves
|
||||||
|
would like to know all of the IDs that the fresh ingredient ID ranges
|
||||||
|
consider to be fresh. An ingredient ID is still considered fresh if it is
|
||||||
|
in any range.
|
||||||
|
|
||||||
|
Now, the second section of the database (the available ingredient IDs) is
|
||||||
|
irrelevant. Here are the fresh ingredient ID ranges from the above
|
||||||
|
example:
|
||||||
|
|
||||||
|
3-5
|
||||||
|
10-14
|
||||||
|
16-20
|
||||||
|
12-18
|
||||||
|
|
||||||
|
The ingredient IDs that these ranges consider to be fresh are 3, 4, 5, 10,
|
||||||
|
11, 12, 13, 14, 15, 16, 17, 18, 19, and 20. So, in this example, the fresh
|
||||||
|
ingredient ID ranges consider a total of 14 ingredient IDs to be fresh.
|
||||||
|
|
||||||
|
Process the database file again. How many ingredient IDs are considered to
|
||||||
|
be fresh according to the fresh ingredient ID ranges?
|
||||||
|
|
||||||
|
Your puzzle answer was 334714395325710.
|
||||||
|
|
||||||
|
Both parts of this puzzle are complete! They provide two gold stars: **
|
||||||
|
|
||||||
|
At this point, you should [16]return to your Advent calendar and try
|
||||||
|
another puzzle.
|
||||||
|
|
||||||
|
If you still want to see it, you can [17]get your puzzle input.
|
||||||
|
|
||||||
|
References
|
||||||
|
|
||||||
|
Visible links
|
||||||
|
1. https://adventofcode.com/
|
||||||
|
2. https://adventofcode.com/2025/about
|
||||||
|
3. https://adventofcode.com/2025/events
|
||||||
|
4. https://adventofcode.com/2025/shop
|
||||||
|
5. https://adventofcode.com/2025/settings
|
||||||
|
6. https://adventofcode.com/2025/auth/logout
|
||||||
|
7. Advent of Code Supporter
|
||||||
|
https://adventofcode.com/2025/support
|
||||||
|
8. https://adventofcode.com/2025
|
||||||
|
9. https://adventofcode.com/2025
|
||||||
|
10. https://adventofcode.com/2025/support
|
||||||
|
11. https://adventofcode.com/2025/sponsors
|
||||||
|
12. https://adventofcode.com/2025/leaderboard/private
|
||||||
|
13. https://adventofcode.com/2025/stats
|
||||||
|
14. https://adventofcode.com/2025/sponsors
|
||||||
|
15. https://adventofcode.com/2025/sponsors/redirect?url=https%3A%2F%2Fwww%2Eonechronos%2Ecom
|
||||||
|
16. https://adventofcode.com/2025
|
||||||
|
17. https://adventofcode.com/2025/day/5/input
|
||||||
11
2025/day05/testinput
Normal file
11
2025/day05/testinput
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
3-5
|
||||||
|
10-14
|
||||||
|
16-20
|
||||||
|
12-18
|
||||||
|
|
||||||
|
1
|
||||||
|
5
|
||||||
|
8
|
||||||
|
11
|
||||||
|
17
|
||||||
|
32
|
||||||
Reference in New Issue
Block a user