You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
1.6 KiB
81 lines
1.6 KiB
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"io"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
type day05 struct{}
|
|
|
|
type seedmap struct {
|
|
original int64
|
|
previous int64
|
|
current int64
|
|
}
|
|
|
|
func readseeds(line string) []seedmap {
|
|
seeds := make([]seedmap, 0, 10)
|
|
scanner := bufio.NewScanner(strings.NewReader(line))
|
|
scanner.Split(bufio.ScanWords)
|
|
|
|
for scanner.Scan() {
|
|
val, _ := strconv.ParseInt(scanner.Text(), 10, 64)
|
|
seeds = append(seeds, seedmap{original: val, current: val, previous: val})
|
|
}
|
|
|
|
return seeds
|
|
}
|
|
|
|
func updateseeds(line string, seeds []seedmap) []seedmap {
|
|
input := strings.SplitN(line, " ", 3)
|
|
dst, _ := strconv.ParseInt(input[0], 10, 64)
|
|
src, _ := strconv.ParseInt(input[1], 10, 64)
|
|
rng, _ := strconv.ParseInt(input[2], 10, 64)
|
|
|
|
for i, seed := range seeds {
|
|
if seed.current >= src && seed.current <= src+rng && seed.current == seed.previous {
|
|
seeds[i].current = seed.current + (dst - src)
|
|
}
|
|
}
|
|
return seeds
|
|
}
|
|
|
|
func minint64(x, y int64) int64 {
|
|
if x > y {
|
|
return y
|
|
}
|
|
return x
|
|
}
|
|
|
|
func (d day05) solve1(r io.Reader) string {
|
|
scanner := bufio.NewScanner(r)
|
|
|
|
scanner.Scan()
|
|
_, seedline, _ := strings.Cut(scanner.Text(), ": ")
|
|
seeds := readseeds(seedline)
|
|
|
|
for scanner.Scan() {
|
|
line := scanner.Text()
|
|
if strings.HasSuffix(line, "map:") || line == "" {
|
|
for i := range seeds {
|
|
seeds[i].previous = seeds[i].current
|
|
}
|
|
continue
|
|
}
|
|
seeds = updateseeds(scanner.Text(), seeds)
|
|
}
|
|
|
|
min := minint64(seeds[0].current, seeds[1].current)
|
|
for i := 2; i < len(seeds); i++ {
|
|
min = minint64(min, seeds[i].current)
|
|
}
|
|
|
|
return fmt.Sprintf("%d", min)
|
|
}
|
|
|
|
func (d day05) solve2(r io.Reader) string {
|
|
return "incomplete"
|
|
}
|
|
|