1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
|
const std = @import("std");
pub fn main() !void {
try std.fmt.format(std.io.getStdOut().writer(), "day5 pt1: {}\n", .{try solve_pt1(std.heap.page_allocator, puzzle_input)});
}
fn solve_pt1(a: std.mem.Allocator, input: []const u8) !u64 {
var groups = std.mem.split(u8, input, "\n\n");
const seeds_str = groups.first();
var seedToks = std.mem.tokenize(u8, seeds_str, " ");
_ = seedToks.next() orelse return error.NoSeeds; // ignore "seeds:"
var seeds = std.ArrayList(u64).init(a);
defer seeds.deinit();
while (seedToks.next()) |seedTok| {
try seeds.append(try std.fmt.parseInt(u64, seedTok, 10));
}
// now parse the maps...
var maps = std.ArrayList(Map).init(a);
defer {
for (maps.items) |*map| map.deinit();
maps.deinit();
}
while (groups.next()) |group| {
const m = try Map.parse(a, group);
try maps.append(m);
}
// and now check the seeds
var min: u64 = std.math.maxInt(u64);
for (seeds.items) |seed| {
var location = seed;
for (maps.items) |map| {
location = map.apply(location);
}
min = @min(min, location);
}
return min;
}
const Map = struct {
entries: std.ArrayList(MapEntry),
fn parse(a: std.mem.Allocator, input: []const u8) !Map {
var entries = std.ArrayList(MapEntry).init(a);
errdefer entries.deinit();
var toks = std.mem.split(u8, input, "\n");
_ = toks.first(); // discard the title.
while (toks.next()) |tok| {
const me = try MapEntry.parse(tok);
try entries.append(me);
}
return .{
.entries = entries,
};
}
fn deinit(self: *Map) void {
self.entries.deinit();
}
fn apply(self: Map, in: u64) u64 {
for (self.entries.items) |entry| {
if (entry.apply(in)) |out| return out;
} else {
return in;
}
}
};
const MapEntry = struct {
dest_start: u64,
source_start: u64,
range_len: u64,
fn parse(input: []const u8) !MapEntry {
var toks = std.mem.tokenize(u8, input, " ");
return .{
.dest_start = try std.fmt.parseInt(u64, (toks.next() orelse return error.NoDest), 10),
.source_start = try std.fmt.parseInt(u64, (toks.next() orelse return error.NoSource), 10),
.range_len = try std.fmt.parseInt(u64, (toks.next() orelse return error.NoRange), 10),
};
}
fn apply(self: MapEntry, in: u64) ?u64 {
if (in >= self.source_start and in < (self.source_start + self.range_len)) {
const diff = in - self.source_start;
return self.dest_start + diff;
}
return null;
}
};
test "pt1" {
try std.testing.expectEqual(@as(u64, 35), try solve_pt1(std.testing.allocator, test_input));
}
const test_input =
\\seeds: 79 14 55 13
\\
\\seed-to-soil map:
\\50 98 2
\\52 50 48
\\
\\soil-to-fertilizer map:
\\0 15 37
\\37 52 2
\\39 0 15
\\
\\fertilizer-to-water map:
\\49 53 8
\\0 11 42
\\42 0 7
\\57 7 4
\\
\\water-to-light map:
\\88 18 7
\\18 25 70
\\
\\light-to-temperature map:
\\45 77 23
\\81 45 19
\\68 64 13
\\
\\temperature-to-humidity map:
\\0 69 1
\\1 0 69
\\
\\humidity-to-location map:
\\60 56 37
\\56 93 4
;
const puzzle_input =
\\seeds: 202517468 131640971 1553776977 241828580 1435322022 100369067 2019100043 153706556 460203450 84630899 3766866638 114261107 1809826083 153144153 2797169753 177517156 2494032210 235157184 856311572 542740109
\\
\\seed-to-soil map:
\\1393363309 644938450 159685707
\\2025282601 1844060172 19312202
\\1233103806 1026919253 32871092
\\1086566452 1933428941 86530991
\\1265974898 0 21589659
\\1357621124 1636167265 35742185
\\2343571960 2665606060 81121142
\\1585337376 809179011 202497192
\\3151050390 3039622538 54531851
\\2059837853 804624157 4554854
\\169037772 124717914 59280146
\\228317918 183998060 248114943
\\2646529073 2343571960 51673623
\\1173097443 1360585007 60006363
\\2000660015 1203115155 24622586
\\1059486394 1176035097 27080058
\\3129081851 4185259485 17367169
\\3599437884 3098755759 211817367
\\2810085327 3883695720 116314513
\\2424693102 4015066563 32329632
\\3398847262 2507128214 141172870
\\1787834568 432113003 212825447
\\1553049016 1603878905 32288360
\\3111414816 4202626654 17667035
\\4015961437 3493485543 279005859
\\3584381554 4000010233 15056330
\\609280127 1840486939 3573233
\\0 1603418622 460283
\\3302297495 3310573126 79244791
\\3811255251 4047396195 137863290
\\3381542286 2648301084 17304976
\\3280255848 3389817917 22041647
\\840113387 21589659 103128255
\\3949118541 3816852824 66842896
\\3205582241 4220293689 74673607
\\657286135 1420591370 182827252
\\1287564557 1863372374 70056567
\\460283 1671909450 168577489
\\2926399840 2746727202 103388997
\\3146449020 3094154389 4601370
\\943241642 1059790345 116244752
\\476432861 1227737741 132847266
\\612853360 2019959932 44432775
\\2698202696 2395245583 111882631
\\3029788837 3411859564 81625979
\\2044594803 1011676203 15243050
\\2457022734 2850116199 189506339
\\3540020132 3772491402 44361422
\\
\\soil-to-fertilizer map:
\\1845319553 827629590 305617985
\\3122295925 2644420892 346256096
\\1459294850 681645131 145984459
\\1609507353 0 58999651
\\255693782 1322254706 15503402
\\1136906676 1310560683 7032394
\\609209731 1833691163 45329504
\\271197184 2213414186 148369535
\\3483324631 2990676988 343929863
\\3943098203 3619829050 148418709
\\2945015193 3803447520 177280732
\\504622935 1337758108 104586796
\\2644420892 3334606851 81771815
\\2909815432 3768247759 35199761
\\3468873015 4096571961 14451616
\\3827254494 3980728252 115843709
\\1044649784 1218303791 92256892
\\3468552021 4111023577 320994
\\1605279309 677417087 4228044
\\1668507004 58999651 176812549
\\978403972 1317593077 4661629
\\212737043 1879020667 42956739
\\916089003 1655081947 62314969
\\0 1442344904 212737043
\\1228536146 2361783721 230758704
\\419566719 1133247575 85056216
\\1143939070 1717396916 84597076
\\2726192707 4111344571 183622725
\\983065601 2151830003 61584183
\\2150937538 235812200 441604887
\\884391832 1801993992 31697171
\\654539235 1921977406 229852597
\\4091516912 3416378666 203450384
\\
\\fertilizer-to-water map:
\\2549847515 3576009818 718957478
\\0 241538153 477666033
\\2425421388 2487425840 6333278
\\2431754666 2369332991 118092849
\\4172623904 3453666426 122343392
\\2050888028 0 241538153
\\2369332991 2493759118 56088397
\\477666033 719204186 1573221995
\\3268804993 2587418451 866247975
\\4135052968 2549847515 37570936
\\
\\water-to-light map:
\\0 614660468 46162263
\\992982309 3320291957 519425172
\\2148695908 4242883656 34662742
\\2183358650 992982309 1749887545
\\622053693 575891430 38769038
\\1973119806 3839717129 175576102
\\3950667093 3281596434 38695523
\\46162263 0 575891430
\\1512407481 4015293231 227590425
\\1739997906 3048474534 233121900
\\3933246195 4277546398 17420898
\\3989362616 2742869854 305604680
\\
\\light-to-temperature map:
\\3926915598 4278168812 16798484
\\1868013910 2147559018 140836186
\\750719301 1001446770 132766166
\\0 591148217 159571084
\\2757723179 3756680674 111319765
\\3526572182 1656447494 400343416
\\159571084 0 569934147
\\2869042944 3868000439 358532427
\\2008850096 3039560686 189896094
\\2649579616 3734175051 22505623
\\2270874649 2588070691 164667420
\\4008144721 2752738111 286822575
\\2435542069 2374033144 214037547
\\2672085239 2288395204 85637940
\\3450693140 2056790910 18639649
\\3469332789 3452574549 57239393
\\883485467 750719301 250727469
\\3943714082 3509813942 64430639
\\3227575371 3229456780 223117769
\\1708083440 3574244581 159930470
\\2198746190 2075430559 72128459
\\729505231 569934147 21214070
\\1656447494 4226532866 51635946
\\
\\temperature-to-humidity map:
\\2530950430 2986195732 64296956
\\3097031068 3050492688 225336526
\\2595247386 2262922844 63415061
\\394235114 386308291 573314459
\\159338027 199058685 71729011
\\2107189180 2969998741 16196991
\\231067038 0 22309581
\\266735072 959622750 109765613
\\1941982137 2514902112 165207043
\\3525862760 2680109155 81512917
\\3809165514 2049071587 78022870
\\3887188384 2459869958 55032154
\\61551861 270787696 97786166
\\4083271930 3575006611 18595319
\\993228240 162831557 10548461
\\967549573 173380018 25678667
\\376500685 368573862 17734429
\\2877832272 3856947724 19626311
\\3607375677 4093177459 201789837
\\2519444451 4007134226 11505979
\\2658662447 4082384303 10793156
\\3322367594 3945539199 61595027
\\253376619 149473104 13358453
\\0 87921243 61551861
\\2961202681 2127094457 135828387
\\3942220538 3468929261 33142375
\\2669455603 2761622072 208376669
\\4197950728 3371912693 97016568
\\4101867249 3275829214 96083479
\\2446763340 1976390476 72681111
\\2313231287 2326337905 133532053
\\2897458583 4018640205 63744098
\\2123386171 3667102608 189845116
\\1003776701 22309581 65611662
\\3975362913 3593601930 73500678
\\4048863591 1941982137 34408339
\\3452927785 3502071636 72934975
\\3383962621 3876574035 68965164
\\
\\humidity-to-location map:
\\0 853712401 14149303
\\2655090225 1087300934 303915897
\\2027272660 3174210041 18998832
\\1525779414 1936221923 38337972
\\4147713982 3193208873 142508118
\\2959006122 2143904256 380930882
\\1087300934 1765319513 65896883
\\1352738345 4121926227 173041069
\\1290854129 4060042011 61884216
\\3931908769 4005664051 54377960
\\4091732209 2524835138 55981773
\\653782902 95274560 214078802
\\477505648 85866717 9407843
\\2632545935 1543458967 22544290
\\123251703 309353362 97540905
\\3762564408 1974559895 169344361
\\3487433944 3409639319 23582322
\\318179985 430129950 159325663
\\1216931801 3335716991 12046317
\\1153197817 2580816911 63733984
\\14149303 406894267 23235683
\\2206646140 3433221641 320894268
\\3986286729 1566003257 105445480
\\37384986 0 85866717
\\2112775364 1671448737 93870776
\\2046271492 3107706169 66503872
\\3511016266 3754115909 251548142
\\1228978118 3347763308 61876011
\\1564117386 2644550895 463155274
\\3339937004 1391216831 147496940
\\486913491 589455613 166869411
\\4290222100 1538713771 4745196
\\220792608 756325024 97387377
\\2527540408 1831216396 105005527
;
|