Terribly inefficient. But hey, it works!
parent
080ff61267
commit
5ba7e6e4e1
@ -0,0 +1,247 @@
|
||||
seeds: 487758422 524336848 2531594804 27107767 1343486056 124327551 1117929819 93097070 3305050822 442320425 2324984130 87604424 4216329536 45038934 1482842780 224610898 115202033 371332058 2845474954 192579859
|
||||
|
||||
seed-to-soil map:
|
||||
152560994 173671324 63296280
|
||||
22185606 1527272669 123700133
|
||||
1331635416 297391996 25501160
|
||||
2532562923 236967604 60424392
|
||||
145885739 854580877 6675255
|
||||
696074404 427174664 330582271
|
||||
0 1407203152 22185606
|
||||
1174684019 152310608 21360716
|
||||
2679050525 3516671293 482421092
|
||||
1227353908 322893156 104281508
|
||||
1077860077 757756935 96823942
|
||||
3161471617 3999092385 22763615
|
||||
1509447184 1650972802 82059456
|
||||
4170512486 2802241718 1263617
|
||||
1196044735 1495963496 31309173
|
||||
1357136576 0 152310608
|
||||
4171776103 2679050525 123191193
|
||||
1731875772 1733032258 319590386
|
||||
282432012 1001625264 405577888
|
||||
215857274 1429388758 66574738
|
||||
1026656675 2541783913 51203402
|
||||
1591506640 861256132 140369132
|
||||
688009900 2052622644 8064504
|
||||
3457346528 2803505335 713165958
|
||||
3184235232 4021856000 273111296
|
||||
2051466158 2060687148 481096765
|
||||
|
||||
soil-to-fertilizer map:
|
||||
2587123207 1612631011 14556918
|
||||
425896400 1627187929 180219453
|
||||
974395525 3228073255 181091940
|
||||
606115853 2482605187 15274968
|
||||
621390821 1843957593 329096619
|
||||
4269010275 3749182981 25957021
|
||||
2601680125 1807407382 36550211
|
||||
3749182981 3775140002 91697225
|
||||
3337986166 2411426158 71179029
|
||||
2306503017 631361705 276943999
|
||||
0 205465305 425896400
|
||||
950487440 181557220 23908085
|
||||
1155487465 1188132368 424498643
|
||||
1579986108 2497880155 726516909
|
||||
2583447016 3224397064 3676191
|
||||
3840880206 3866837227 428130069
|
||||
3099614220 2173054212 238371946
|
||||
2918057000 0 181557220
|
||||
2638230336 908305704 279826664
|
||||
|
||||
fertilizer-to-water map:
|
||||
0 226390191 111676682
|
||||
342717440 10141562 176981703
|
||||
3507713259 629378619 187481170
|
||||
3695194429 3739990160 60489319
|
||||
2747106431 4155961766 11528550
|
||||
2120906094 2661985654 77106422
|
||||
3983043532 1233406588 239832885
|
||||
3045388563 4287081612 7885684
|
||||
529840705 187123265 39266926
|
||||
2198012516 1102191084 16615097
|
||||
3053274247 4167490316 104130064
|
||||
2564366436 2756374717 129809025
|
||||
3331241613 816859789 87383675
|
||||
3418625288 3536806097 36187146
|
||||
1239632010 3393454292 143351805
|
||||
1147966039 1776147938 91665971
|
||||
1382983815 2230578660 82475007
|
||||
4222876417 1045170068 57021016
|
||||
3455914127 2313053667 4640764
|
||||
2835800762 3800479479 42590884
|
||||
4279897433 1473239473 15069863
|
||||
3780709534 2342720217 202333998
|
||||
1753297424 3902953503 253008263
|
||||
1465458822 1488309336 287838602
|
||||
3454812434 2588893134 1101693
|
||||
3287402694 2545054215 43838919
|
||||
2704024450 1002088087 43081981
|
||||
629378619 2589994827 71990827
|
||||
3189558071 904243464 97844623
|
||||
2214627613 2886183742 264407413
|
||||
2006305687 1118806181 114600407
|
||||
3460554891 1867813909 47158368
|
||||
3755683748 2317694431 25025786
|
||||
111676682 338066873 231040758
|
||||
519699143 0 10141562
|
||||
2479035026 3313735125 69870178
|
||||
2548905204 4271620380 15461232
|
||||
2775917622 3843070363 59883140
|
||||
3157404311 2198424900 32153760
|
||||
864513416 1914972277 283452623
|
||||
2758634981 2739092076 17282641
|
||||
701369446 3150591155 163143970
|
||||
2878391646 3572993243 166996917
|
||||
2694175461 3383605303 9848989
|
||||
|
||||
water-to-light map:
|
||||
1222332482 2306154207 322881400
|
||||
3721269109 3329751112 30895612
|
||||
4157109606 3191893422 137857690
|
||||
2602036554 3676681423 255279159
|
||||
2293973174 3078247260 113646162
|
||||
1208052724 2246358310 14279758
|
||||
1835200232 1597610395 302070784
|
||||
3118371905 1208052724 389557671
|
||||
2137271016 3519979265 156702158
|
||||
2501933666 1952285487 54586749
|
||||
3753874345 1899681179 52604308
|
||||
3806478653 3931960582 7636192
|
||||
3973340148 2006872236 24436917
|
||||
3814114845 2629035607 159225303
|
||||
3507929576 2031309153 213339533
|
||||
3752164721 2244648686 1709624
|
||||
2857315713 3939596774 261056192
|
||||
3997777065 3360646724 159332541
|
||||
2556520415 2260638068 45516139
|
||||
2407619336 4200652966 94314330
|
||||
1545213882 2788260910 289986350
|
||||
|
||||
light-to-temperature map:
|
||||
40645637 589707204 89929230
|
||||
2331703372 3634092968 247989827
|
||||
375013050 880330876 388603146
|
||||
959059361 861524497 18806379
|
||||
3081535248 2703807387 671456921
|
||||
2080450790 1678532701 100545991
|
||||
1520717011 1522300302 156232399
|
||||
3801827392 4285326304 9640992
|
||||
2834731556 1990942492 115059472
|
||||
2949791028 2566169187 71005535
|
||||
3020796563 4224587619 60738685
|
||||
4159346802 1855321998 135620494
|
||||
977865740 0 297257755
|
||||
3811468384 3375264308 157802817
|
||||
2304295289 1779078692 27408083
|
||||
3752992169 1806486775 48835223
|
||||
2579693199 3882082795 255038357
|
||||
130574867 328095764 236983298
|
||||
4081903724 3533067125 77443078
|
||||
367558165 310812857 7454885
|
||||
3969271201 3610510203 23582765
|
||||
4080320433 1520717011 1583291
|
||||
777171298 679636434 181888063
|
||||
2180996781 2106001964 56665843
|
||||
3992853966 4137121152 87466467
|
||||
0 1268934022 6189473
|
||||
30817615 318267742 9828022
|
||||
1676949410 2162667807 403501380
|
||||
763616196 297257755 13555102
|
||||
6189473 565079062 24628142
|
||||
2237662624 2637174722 66632665
|
||||
|
||||
temperature-to-humidity map:
|
||||
3854764317 3086190444 332386294
|
||||
2110554705 1096342109 65650849
|
||||
3236082645 1211923153 20175736
|
||||
846106827 1853452836 60731419
|
||||
596073066 1972015961 100470927
|
||||
1202254149 2647779239 280062599
|
||||
2176205554 2107199879 422980149
|
||||
2943801812 432921932 58618218
|
||||
1824616452 1161992958 3317671
|
||||
1201112206 2106057936 1141943
|
||||
1840640266 1631373972 178403432
|
||||
2767591984 62542954 155027747
|
||||
2743880612 491540150 8409669
|
||||
62542954 1273100182 24571446
|
||||
4208015516 3772661112 86951780
|
||||
3477752908 217570701 215351231
|
||||
2019043698 3681150105 91511007
|
||||
1482316748 4027597725 172205397
|
||||
766244356 4199803122 79862471
|
||||
950513678 665972626 23438579
|
||||
89279871 1232098889 41001293
|
||||
1654522145 1914184255 36130017
|
||||
3002420030 3660808941 20341164
|
||||
452765307 1525178112 98766078
|
||||
551531385 840194947 44541681
|
||||
1827934123 2072486888 12706143
|
||||
87114400 3859612892 2165471
|
||||
1091551468 3873351076 109560738
|
||||
2714852730 884736628 29027882
|
||||
906838246 1809777404 43675432
|
||||
760232399 1297671628 6011957
|
||||
696543993 3861778363 11572713
|
||||
3693104139 633914109 32058517
|
||||
1690652162 499949819 133964290
|
||||
151982853 3418576738 142433848
|
||||
2922619731 689411205 21182081
|
||||
2599185703 1165310629 46612524
|
||||
2752290281 4279665593 15301703
|
||||
3022761194 913764510 182577599
|
||||
2645798227 3561010586 69054503
|
||||
130281164 1950314272 21701689
|
||||
973952257 2530180028 117599211
|
||||
715546488 3982911814 44685911
|
||||
4187150611 2085193031 20864905
|
||||
3256258381 1303683585 221494527
|
||||
3725162656 710593286 129601661
|
||||
708116706 1623944190 7429782
|
||||
3205338793 3630065089 30743852
|
||||
294416701 2927841838 158348606
|
||||
|
||||
humidity-to-location map:
|
||||
3745579304 2724582328 81388084
|
||||
2201043082 981698567 150857305
|
||||
456470998 689872919 41258774
|
||||
2351900387 2312761976 47825019
|
||||
497729772 314502888 115122928
|
||||
4036836228 4279991461 14975835
|
||||
784121118 3255986437 5687937
|
||||
612852700 0 118278993
|
||||
3894168411 842107405 27168107
|
||||
3127730376 4061803810 218187651
|
||||
1230572305 1958697503 125808488
|
||||
304425981 163566931 106757079
|
||||
789809055 3790646012 241507252
|
||||
1777374448 1871672054 39148062
|
||||
1816522510 1504159194 367512860
|
||||
235721965 621168903 68704016
|
||||
4051812063 1480547431 14406303
|
||||
3826967388 1228960483 58471320
|
||||
411183060 118278993 45287938
|
||||
3921336518 869275512 103693352
|
||||
4025029870 2304659906 8102070
|
||||
2838210137 1132555872 96404611
|
||||
2934614748 1287431803 193115628
|
||||
1414367080 3422182046 363007368
|
||||
3345918027 1494953734 9205460
|
||||
2184035370 2805970412 17007712
|
||||
2631131158 2088210279 207078979
|
||||
1356380793 784121118 57986287
|
||||
2399725406 2493176576 231405752
|
||||
1031316307 3261674374 160507672
|
||||
44178878 429625816 191543087
|
||||
4195166765 3165556554 90429883
|
||||
4285596648 2295289258 9370648
|
||||
3403000874 2822978124 342578430
|
||||
1191823979 3785189414 5456598
|
||||
1197280577 2459884848 33291728
|
||||
4066218366 4032153264 29650546
|
||||
3355123487 1910820116 47877387
|
||||
3885438708 972968864 8729703
|
||||
0 270324010 44178878
|
||||
4095868912 2360586995 99297853
|
||||
4033131940 2084505991 3704288
|
@ -0,0 +1,141 @@
|
||||
const std = @import("std");
|
||||
|
||||
const Range = struct { destination: u64, source: u64, length: u64 };
|
||||
const Map = struct { from: []const u8, to: []const u8, ranges: std.ArrayList(Range) };
|
||||
|
||||
pub fn main() !void {
|
||||
const content = @embedFile("data.txt");
|
||||
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
||||
const allocator = gpa.allocator();
|
||||
|
||||
// split the file content on empty lines
|
||||
var sections = std.mem.split(u8, content, "\n\n");
|
||||
|
||||
// parse out the first line, collecting seeds into an ArrayList
|
||||
var seedSection = std.mem.split(u8, sections.next().?, " ");
|
||||
var seeds = std.ArrayList(u64).init(allocator);
|
||||
defer seeds.deinit();
|
||||
_ = seedSection.next();
|
||||
while (seedSection.next()) |s| {
|
||||
try seeds.append(try std.fmt.parseInt(u64, s, 10));
|
||||
}
|
||||
|
||||
var maps = std.ArrayList(Map).init(allocator);
|
||||
defer maps.deinit();
|
||||
|
||||
// iterate over each section, parse into Map structs, append them onto the maps ArrayList
|
||||
while (sections.next()) |s| {
|
||||
var lines = std.mem.split(u8, s, "\n");
|
||||
var firstLine = lines.next().?;
|
||||
var words = std.mem.split(u8, firstLine, " ");
|
||||
// grab the first "word" of the first line, and split it on -
|
||||
var parts = std.mem.split(u8, words.next().?, "-");
|
||||
const from = parts.next().?;
|
||||
_ = parts.next();
|
||||
const to = parts.next().?;
|
||||
|
||||
var ranges = std.ArrayList(Range).init(allocator);
|
||||
// TODO: do I need to deinit ranges... somewhere?
|
||||
while (lines.next()) |line| {
|
||||
if (line.len == 0) {
|
||||
continue;
|
||||
}
|
||||
var nums = std.mem.split(u8, line, " ");
|
||||
var destination = try std.fmt.parseInt(u64, nums.next().?, 10);
|
||||
var source = try std.fmt.parseInt(u64, nums.next().?, 10);
|
||||
var length = try std.fmt.parseInt(u64, nums.next().?, 10);
|
||||
const range = Range{ .destination = destination, .source = source, .length = length };
|
||||
try ranges.append(range);
|
||||
}
|
||||
const map = Map{ .from = from, .to = to, .ranges = ranges };
|
||||
try maps.append(map);
|
||||
}
|
||||
|
||||
var lowestLocation: ?u64 = null;
|
||||
for (seeds.items) |seed| {
|
||||
// loop starting from the "seed" map until we have a location
|
||||
var from: []const u8 = "seed";
|
||||
var val = seed;
|
||||
|
||||
while (!std.mem.eql(u8, from, "location")) {
|
||||
const map = findMap(from, maps).?;
|
||||
val = findNewValue(val, map);
|
||||
from = map.to;
|
||||
}
|
||||
if (lowestLocation) |l| {
|
||||
if (val < l) {
|
||||
lowestLocation = val;
|
||||
}
|
||||
} else {
|
||||
lowestLocation = val;
|
||||
}
|
||||
}
|
||||
|
||||
std.debug.print("Part 1 {?d}\n", .{lowestLocation});
|
||||
|
||||
// Part 2
|
||||
// Can we go backwards?
|
||||
var i: u64 = 0;
|
||||
outer: while (true) {
|
||||
var to: []const u8 = "location";
|
||||
var val = i;
|
||||
|
||||
while (!std.mem.eql(u8, to, "seed")) {
|
||||
const map = findMapReverse(to, maps).?;
|
||||
val = findNewValueReverse(val, map);
|
||||
to = map.from;
|
||||
}
|
||||
|
||||
var idx: u8 = 0;
|
||||
while (idx < seeds.items.len) : (idx += 2) {
|
||||
const lower = seeds.items[idx];
|
||||
const upper = lower + seeds.items[idx + 1];
|
||||
if (val >= lower and val < upper) {
|
||||
break :outer;
|
||||
}
|
||||
}
|
||||
i += 1;
|
||||
}
|
||||
|
||||
std.debug.print("Part 2 {?d}\n", .{i});
|
||||
}
|
||||
|
||||
// given the "from" type, find the map that we should follow
|
||||
fn findMap(from: []const u8, maps: std.ArrayList(Map)) ?Map {
|
||||
for (maps.items) |map| {
|
||||
if (std.mem.eql(u8, map.from, from)) {
|
||||
return map;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
fn findNewValue(val: u64, map: Map) u64 {
|
||||
for (map.ranges.items) |r| {
|
||||
if (val >= r.source and val < r.source + r.length) {
|
||||
return r.destination + val - r.source;
|
||||
}
|
||||
}
|
||||
// if no range fits, return the original value
|
||||
return val;
|
||||
}
|
||||
|
||||
// given the "to" type, find the map that we should follow
|
||||
fn findMapReverse(to: []const u8, maps: std.ArrayList(Map)) ?Map {
|
||||
for (maps.items) |map| {
|
||||
if (std.mem.eql(u8, map.to, to)) {
|
||||
return map;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
fn findNewValueReverse(val: u64, map: Map) u64 {
|
||||
for (map.ranges.items) |r| {
|
||||
if (val >= r.destination and val < r.destination + r.length) {
|
||||
return r.source + val - r.destination;
|
||||
}
|
||||
}
|
||||
// if no range fits, return the original value
|
||||
return val;
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
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
|
Loading…
Reference in New Issue