)
type Map struct {
- dest_range_start int
- src_range_start int
- range_len int
+ dest_range_start uint64
+ src_range_start uint64
+ range_len uint64
}
type Almanac struct {
}
type SeedMap struct {
- seed int
- range_len int
+ seed uint64
+ range_len uint64
}
-func Part1(input string) int {
+func Part1(input string) uint64 {
seeds, almanac, _ := parseInput1(input)
fmt.Println(seeds)
fmt.Println(almanac)
- minLoc := utils.MaxInt
+ minLoc := uint64(utils.MaxInt)
for _, seed := range seeds {
soil := lookup_dest(seed, almanac.seed2soil)
fert := lookup_dest(soil, almanac.soil2fert)
func Part2(input string) int {
seedsmap, almanac, _ := parseInput2(input)
- fmt.Println(seedsmap)
- fmt.Println(almanac)
- minLocMap := Map{dest_range_start: utils.MaxInt}
- for _, x := range almanac.humid2loc {
- if x.dest_range_start< minLocMap.dest_range_start {
- minLocMap = x
- }
- }
- fmt.Println(minLocMap.dest_range_start)
- for i:=minLocMap.src_range_start;i<minLocMap.src_range_start+minLocMap.range_len;i++ {
- temp := lookup_src(i, almanac.temp2humid)
- fmt.Println(temp)
- }
-// minSeedMap := SeedMap{}
-// minLoc := utils.MaxInt
-// for _, seedmap := range seedsmap {
-// for _, i := range []int{seedmap.seed, seedmap.seed+seedmap.range_len} {
-// soil := lookup_dest(i, almanac.seed2soil)
-// fert := lookup_dest(soil, almanac.soil2fert)
-// water := lookup_dest(fert, almanac.fert2water)
-// light := lookup_dest(water, almanac.water2light)
-// temp := lookup_dest(light, almanac.light2temp)
-// humid := lookup_dest(temp, almanac.temp2humid)
-// loc := lookup_dest(humid, almanac.humid2loc)
-// if loc < minLoc {
-// minSeedMap = seedmap
-// minLoc = loc
-// }
-// }
-// }
+ minLoc := uint64(utils.MaxInt)
+ for _, seedmap := range seedsmap {
+ for i := seedmap.seed;i<seedmap.seed+seedmap.range_len;i++ {
+ soil := lookup_dest(i, almanac.seed2soil)
+ fert := lookup_dest(soil, almanac.soil2fert)
+ water := lookup_dest(fert, almanac.fert2water)
+ light := lookup_dest(water, almanac.water2light)
+ temp := lookup_dest(light, almanac.light2temp)
+ humid := lookup_dest(temp, almanac.temp2humid)
+ loc := lookup_dest(humid, almanac.humid2loc)
+ if loc < minLoc {
+ minLoc = loc
+ }
+ }
+ fmt.Println(minLoc)
+ }
//
// fmt.Println(minSeedMap)
// minLoc = utils.MaxInt
// minLoc = loc
// }
// }
- return -1
+ return int(minLoc)
}
-func lookup_dest(entity int, data []Map) int {
+func lookup_dest(entity uint64, data []Map) uint64 {
for _, dataMap := range data {
if entity >= dataMap.src_range_start && entity <= dataMap.src_range_start + dataMap.range_len {
return dataMap.dest_range_start + entity - dataMap.src_range_start
return entity
}
-func lookup_src(entity int, data []Map) int {
+func lookup_src(entity uint64, data []Map) uint64 {
for _, dataMap := range data {
if entity >= dataMap.dest_range_start && entity <= dataMap.dest_range_start + dataMap.range_len {
return dataMap.src_range_start + entity - dataMap.dest_range_start
return entity
}
-func parseInput1(input string) ([]int, Almanac, error) {
+func parseInput1(input string) ([]uint64, Almanac, error) {
var almanac Almanac
- var seeds []int
+ var seeds []uint64
lines := strings.Split(input, "\n")
seedLine := string(lines[0])
tokens := strings.Fields(seedLine)
for _, token := range tokens[1:] {
- seeds = append(seeds, utils.MustAtoi(token))
+ seeds = append(seeds, uint64(utils.MustAtoi(token)))
}
blocks := strings.Split(input, "\n\n")
seedLine := string(lines[0])
tokens := strings.Fields(seedLine)
for i:=1;i<len(tokens);i=i+2 {
- seedStart := utils.MustAtoi(tokens[i])
- seedRange := utils.MustAtoi(tokens[i+1])
+ seedStart := uint64(utils.MustAtoi(tokens[i]))
+ seedRange := uint64(utils.MustAtoi(tokens[i+1]))
seeds = append(seeds, SeedMap{seedStart, seedRange})
}
var out []Map
for _, line := range input {
tokens := strings.Fields(line)
- out = append(out, Map{utils.MustAtoi(tokens[0]), utils.MustAtoi(tokens[1]),utils.MustAtoi(tokens[2])})
+ out = append(out, Map{uint64(utils.MustAtoi(tokens[0])), uint64(utils.MustAtoi(tokens[1])),uint64(utils.MustAtoi(tokens[2]))})
}
return out
}
\ No newline at end of file
--- /dev/null
+package day06
+
+import (
+ "fmt"
+ "math"
+)
+
+type Input struct {
+ Time uint64
+ Distance uint64
+}
+func Part1(input string) int {
+ answer := 1.0
+ ins := parseInput1(input)
+ for _, in := range ins {
+ t1, t2, _ := solveQuadratic(1, float64(in.Time) * -1, float64(in.Distance))
+ fmt.Printf("t1: %v t2: %v ans: %v\n", t1, t2, (t1 - t2 + 1))
+ answer *= (t1 - t2 + 1)
+
+ }
+ return int(answer)
+}
+
+func Part2(input string) int {
+ answer := 1.0
+ ins := parseInput2(input)
+ for _, in := range ins {
+ t1, t2, _ := solveQuadratic(1, float64(in.Time) * -1, float64(in.Distance))
+ fmt.Printf("t1: %v t2: %v ans: %v\n", t1, t2, (t1 - t2 + 1))
+ answer *= (t1 - t2 + 1)
+
+ }
+ return int(answer)}
+
+func parseInput1(input string) []Input {
+ var in []Input
+ in = append(in, Input{46, 214})
+ in = append(in, Input{80, 1177})
+ in = append(in, Input{78, 1402})
+ in = append(in, Input{66, 1024})
+ return in
+}
+
+func parseInput2(input string) []Input {
+ var in []Input
+ in = append(in, Input{46807866, 214117714021024})
+ return in
+}
+
+func solveQuadratic(a, b, c float64) (float64, float64, error) {
+ // Calculate the discriminant
+ discriminant := b*b - 4*a*c
+
+ // Check if the discriminant is non-negative
+ if discriminant < 0 {
+ return 0, 0, fmt.Errorf("no real roots, discriminant is negative")
+ }
+
+ // Calculate the roots
+ root1 := (-b + math.Sqrt(discriminant)) / (2 * a)
+ root2 := (-b - math.Sqrt(discriminant)) / (2 * a)
+
+ if isWholeNumber(root1) { root1 = root1 - 1.0 }
+ if isWholeNumber(root2) { root2 = root2 + 1.0 }
+ return math.Floor(root1), math.Ceil(root2), nil
+}
+
+func isWholeNumber(x float64) bool {
+ rounded := math.Round(x)
+ return x == rounded
+}
\ No newline at end of file