]> fbox.kageds.com Git - adventofcode.git/blob - 2023/go/day05/day05.go
902eb4367f2017e001af679b4674660cb673c398
[adventofcode.git] / 2023 / go / day05 / day05.go
1 package day05
2
3 import (
4
5 _ "regexp"
6 "strings"
7
8 "fmt"
9
10 "adventofcode2023/utils"
11
12 )
13
14 type Map struct {
15 dest_range_start int
16 src_range_start int
17 range_len int
18 }
19
20 type Almanac struct {
21 seed2soil []Map
22 soil2fert []Map
23 fert2water []Map
24 water2light []Map
25 light2temp []Map
26 temp2humid []Map
27 humid2loc []Map
28 }
29
30 type SeedMap struct {
31 seed int
32 range_len int
33 }
34
35 func Part1(input string) int {
36 seeds, almanac, _ := parseInput1(input)
37 fmt.Println(seeds)
38 fmt.Println(almanac)
39
40 minLoc := utils.MaxInt
41 for _, seed := range seeds {
42 soil := lookup_dest(seed, almanac.seed2soil)
43 fert := lookup_dest(soil, almanac.soil2fert)
44 water := lookup_dest(fert, almanac.fert2water)
45 light := lookup_dest(water, almanac.water2light)
46 temp := lookup_dest(light, almanac.light2temp)
47 humid := lookup_dest(temp, almanac.temp2humid)
48 loc := lookup_dest(humid, almanac.humid2loc)
49 if loc < minLoc {
50 minLoc = loc
51 }
52 fmt.Println(loc)
53 }
54
55 return minLoc
56 }
57
58 func Part2(input string) int {
59 seedsmap, almanac, _ := parseInput2(input)
60 fmt.Println(seedsmap)
61 fmt.Println(almanac)
62 minLocMap := Map{dest_range_start: utils.MaxInt}
63 for _, x := range almanac.humid2loc {
64 if x.dest_range_start< minLocMap.dest_range_start {
65 minLocMap = x
66 }
67 }
68 fmt.Println(minLocMap.dest_range_start)
69
70 for i:=minLocMap.src_range_start;i<minLocMap.src_range_start+minLocMap.range_len;i++ {
71 temp := lookup_src(i, almanac.temp2humid)
72 fmt.Println(temp)
73 }
74
75 // minSeedMap := SeedMap{}
76 // minLoc := utils.MaxInt
77 // for _, seedmap := range seedsmap {
78 // for _, i := range []int{seedmap.seed, seedmap.seed+seedmap.range_len} {
79 // soil := lookup_dest(i, almanac.seed2soil)
80 // fert := lookup_dest(soil, almanac.soil2fert)
81 // water := lookup_dest(fert, almanac.fert2water)
82 // light := lookup_dest(water, almanac.water2light)
83 // temp := lookup_dest(light, almanac.light2temp)
84 // humid := lookup_dest(temp, almanac.temp2humid)
85 // loc := lookup_dest(humid, almanac.humid2loc)
86 // if loc < minLoc {
87 // minSeedMap = seedmap
88 // minLoc = loc
89 // }
90 // }
91 // }
92 //
93 // fmt.Println(minSeedMap)
94 // minLoc = utils.MaxInt
95 // for i:=minSeedMap.seed;i<minSeedMap.seed+minSeedMap.range_len;i++ {
96 // soil := lookup_dest(i, almanac.seed2soil)
97 // fert := lookup_dest(soil, almanac.soil2fert)
98 // water := lookup_dest(fert, almanac.fert2water)
99 // light := lookup_dest(water, almanac.water2light)
100 // temp := lookup_dest(light, almanac.light2temp)
101 // humid := lookup_dest(temp, almanac.temp2humid)
102 // loc := lookup_dest(humid, almanac.humid2loc)
103 // if loc < minLoc {
104 // minLoc = loc
105 // }
106 // }
107 return -1
108 }
109
110 func lookup_dest(entity int, data []Map) int {
111 for _, dataMap := range data {
112 if entity >= dataMap.src_range_start && entity <= dataMap.src_range_start + dataMap.range_len {
113 return dataMap.dest_range_start + entity - dataMap.src_range_start
114 }
115 }
116 return entity
117 }
118
119 func lookup_src(entity int, data []Map) int {
120 for _, dataMap := range data {
121 if entity >= dataMap.dest_range_start && entity <= dataMap.dest_range_start + dataMap.range_len {
122 return dataMap.src_range_start + entity - dataMap.dest_range_start
123 }
124 }
125 return entity
126 }
127
128 func parseInput1(input string) ([]int, Almanac, error) {
129
130 var almanac Almanac
131 var seeds []int
132
133 lines := strings.Split(input, "\n")
134 seedLine := string(lines[0])
135 tokens := strings.Fields(seedLine)
136 for _, token := range tokens[1:] {
137 seeds = append(seeds, utils.MustAtoi(token))
138 }
139
140 blocks := strings.Split(input, "\n\n")
141 for i, block := range blocks {
142 lines := strings.Split(block, "\n")
143 switch i {
144 case 0:
145 continue
146 case 1:
147 almanac.seed2soil = getMap(lines[1:])
148 case 2:
149 almanac.soil2fert = getMap(lines[1:])
150 case 3:
151 almanac.fert2water = getMap(lines[1:])
152 case 4:
153 almanac.water2light = getMap(lines[1:])
154 case 5:
155 almanac.light2temp = getMap(lines[1:])
156 case 6:
157 almanac.temp2humid = getMap(lines[1:])
158 case 7:
159 almanac.humid2loc = getMap(lines[1:])
160 }
161 }
162 return seeds, almanac, nil
163 }
164
165 func parseInput2(input string) ([]SeedMap, Almanac, error) {
166
167 var almanac Almanac
168 var seeds []SeedMap
169
170 lines := strings.Split(input, "\n")
171 seedLine := string(lines[0])
172 tokens := strings.Fields(seedLine)
173 for i:=1;i<len(tokens);i=i+2 {
174 seedStart := utils.MustAtoi(tokens[i])
175 seedRange := utils.MustAtoi(tokens[i+1])
176 seeds = append(seeds, SeedMap{seedStart, seedRange})
177 }
178
179 blocks := strings.Split(input, "\n\n")
180 for i, block := range blocks {
181 lines := strings.Split(block, "\n")
182 switch i {
183 case 0:
184 continue
185 case 1:
186 almanac.seed2soil = getMap(lines[1:])
187 case 2:
188 almanac.soil2fert = getMap(lines[1:])
189 case 3:
190 almanac.fert2water = getMap(lines[1:])
191 case 4:
192 almanac.water2light = getMap(lines[1:])
193 case 5:
194 almanac.light2temp = getMap(lines[1:])
195 case 6:
196 almanac.temp2humid = getMap(lines[1:])
197 case 7:
198 almanac.humid2loc = getMap(lines[1:])
199 }
200 }
201 return seeds, almanac, nil
202 }
203
204 func getMap(input []string) []Map {
205 var out []Map
206 for _, line := range input {
207 tokens := strings.Fields(line)
208 out = append(out, Map{utils.MustAtoi(tokens[0]), utils.MustAtoi(tokens[1]),utils.MustAtoi(tokens[2])})
209 }
210 return out
211 }