solve year 2023 day 05
This commit is contained in:
parent
180faf92bb
commit
46165b1acb
190
input/year2023/day05.txt
Normal file
190
input/year2023/day05.txt
Normal file
@ -0,0 +1,190 @@
|
||||
seeds: 2906961955 52237479 1600322402 372221628 2347782594 164705568 541904540 89745770 126821306 192539923 3411274151 496169308 919015581 8667739 654599767 160781040 3945616935 85197451 999146581 344584779
|
||||
|
||||
seed-to-soil map:
|
||||
2328388605 1716277852 240111965
|
||||
3183744888 3056742994 1057221520
|
||||
0 1574488136 141789716
|
||||
886579086 0 430196980
|
||||
141789716 2525350732 49125971
|
||||
881053613 1956389817 5525473
|
||||
3131936012 3013025394 43717600
|
||||
629464378 1322898901 251589235
|
||||
2568500570 1961915290 563435442
|
||||
190915687 2574476703 438548691
|
||||
3175653612 4113964514 8091276
|
||||
1435686684 430196980 892701921
|
||||
1316776066 4122055790 118910618
|
||||
|
||||
soil-to-fertilizer map:
|
||||
0 847324382 159395290
|
||||
1690371026 1633839702 81823607
|
||||
1942873068 561308539 283153025
|
||||
702170285 347687930 213620609
|
||||
477747447 1412279682 221560020
|
||||
1284811016 1006719672 253212372
|
||||
2226026093 170678435 177009495
|
||||
3187826244 2792977617 352243190
|
||||
4225283470 3206651416 69683826
|
||||
2970405965 3691658787 56026212
|
||||
1538023388 1259932044 152347638
|
||||
1772194633 0 170678435
|
||||
3540069434 3376298700 315360087
|
||||
159395290 2084683431 318352157
|
||||
915790894 1715663309 369020122
|
||||
2792977617 4117538948 177428348
|
||||
3026432177 3145220807 61430609
|
||||
699307467 844461564 2862818
|
||||
3855429521 3747684999 21637270
|
||||
3877066791 3769322269 348216679
|
||||
3087862786 3276335242 99963458
|
||||
|
||||
fertilizer-to-water map:
|
||||
1957494254 3160765597 68123328
|
||||
3668612865 2055686861 40068724
|
||||
435525860 0 215171709
|
||||
417459051 715121035 18066809
|
||||
3249874551 2634587998 121218972
|
||||
3537356195 3926770979 26944785
|
||||
409490069 215171709 7968982
|
||||
3247878798 2456653359 1995753
|
||||
152557237 570466650 62164110
|
||||
0 223140691 152557237
|
||||
3740494262 3322870672 151571624
|
||||
4127559328 2467180030 146770000
|
||||
2244919185 2003747275 51939586
|
||||
1782523793 2281682898 174970461
|
||||
829840892 2458649112 8530918
|
||||
3415930152 2819793210 9616809
|
||||
3451260386 2162555289 86095809
|
||||
650697569 632630760 82490275
|
||||
1725834205 787129181 30553919
|
||||
2298219434 2095755585 66799704
|
||||
4274329328 2613950030 20637968
|
||||
2025617582 4242693061 52274235
|
||||
3564300980 2248651098 31671137
|
||||
2296858771 2280322235 1360663
|
||||
3162226157 4125227747 85652641
|
||||
1564565599 1911070479 92676796
|
||||
3892065886 3691277537 235493442
|
||||
3371093523 1848297376 44836629
|
||||
1187663862 1437436130 376901737
|
||||
1689179378 2755806970 36654827
|
||||
2077891817 1238471779 167027368
|
||||
2365019138 2792461797 27331413
|
||||
2678412296 3953715764 63025182
|
||||
2741437478 817683100 420788679
|
||||
2461577055 3474442296 216835241
|
||||
787129181 3228888925 21340999
|
||||
3595972117 3250229924 72640748
|
||||
838371810 2829410019 331355578
|
||||
3425546961 4085967450 25713425
|
||||
1657242395 1405499147 31936983
|
||||
3708681589 4210880388 31812673
|
||||
1756388124 4111680875 13546872
|
||||
1169727388 1893134005 17936474
|
||||
2392350551 4016740946 69226504
|
||||
808470180 1826926664 21370712
|
||||
218943670 379920251 190546399
|
||||
214721347 375697928 4222323
|
||||
1769934996 1814337867 12588797
|
||||
|
||||
water-to-light map:
|
||||
3411019791 3038265544 83843899
|
||||
1902872961 1862724448 39203216
|
||||
3968365807 2753393749 138464731
|
||||
1729762115 1614300400 173110846
|
||||
3494863690 3122109443 473502117
|
||||
423365393 445887946 9248183
|
||||
2869853730 3595611560 11542547
|
||||
910597576 2054510840 169422772
|
||||
609563085 2589844190 163549559
|
||||
2522382340 1299215911 3599854
|
||||
2525982194 609563085 139503131
|
||||
131438599 455136129 141314541
|
||||
4106830538 3607154107 188136758
|
||||
2106420951 2290083024 299761166
|
||||
2406182117 966254850 82053377
|
||||
1157660094 1302815765 172746664
|
||||
97774358 248386611 33664241
|
||||
432613576 282050852 163837094
|
||||
2835557666 1794281538 34296064
|
||||
1953837775 2043524684 10986156
|
||||
1964823931 1901927664 141597020
|
||||
2881396277 749066216 217188634
|
||||
3404149499 1787411246 6870292
|
||||
1330406758 3795290865 240494284
|
||||
773112644 4035785149 137484932
|
||||
3282452284 4173270081 121697215
|
||||
2665485325 3001382926 36882618
|
||||
272753140 97774358 150612253
|
||||
0 38271406 59502952
|
||||
3098584911 1115348538 183867373
|
||||
1570901042 2938014447 31884700
|
||||
1942076177 1602538802 11761598
|
||||
2488235494 1828577602 34146846
|
||||
1080020348 2969899147 31483779
|
||||
1602785742 1475562429 126976373
|
||||
1111504127 2891858480 46155967
|
||||
2768517355 1048308227 67040311
|
||||
59502952 0 38271406
|
||||
2702367943 2223933612 66149412
|
||||
|
||||
light-to-temperature map:
|
||||
2325040309 318068442 41526915
|
||||
3863810956 4139509244 32531846
|
||||
3695021342 4093645836 45863408
|
||||
3176344157 3053768010 518677185
|
||||
2214303174 207331307 110737135
|
||||
1166404663 0 207331307
|
||||
3896342802 3761428671 206212717
|
||||
216675148 359595357 47363132
|
||||
4102555519 3967641388 126004448
|
||||
264038280 406958489 888098871
|
||||
4228559967 3572445195 66407329
|
||||
1152137151 1295057360 14267512
|
||||
3053768010 3638852524 122576147
|
||||
1373735970 1526000020 840567204
|
||||
0 1309324872 216675148
|
||||
3740884750 4172041090 122926206
|
||||
|
||||
temperature-to-humidity map:
|
||||
0 1391213880 85308204
|
||||
3458067104 3613119976 31521054
|
||||
1325453299 1240145095 151068785
|
||||
4139914424 3458067104 155052872
|
||||
1271510819 1186202615 53942480
|
||||
85308204 0 1186202615
|
||||
3489588158 3644641030 650326266
|
||||
|
||||
humidity-to-location map:
|
||||
167312469 2495357077 210182350
|
||||
1429747769 3808500825 68802537
|
||||
2550869359 1829966489 80945905
|
||||
1243007130 3610450429 186740639
|
||||
1735537822 990200552 68491638
|
||||
2426758858 2125855270 111895863
|
||||
1637338839 2027656287 98198983
|
||||
3109292740 3306673452 735862
|
||||
3647611593 2386885260 96257179
|
||||
3910495658 3919394548 32743716
|
||||
3860612665 3289982755 16690697
|
||||
3743868772 1910912394 116743893
|
||||
1498550306 2705539427 138788533
|
||||
0 1662654020 167312469
|
||||
2631815264 512723076 477477476
|
||||
836912419 1370893553 291760467
|
||||
2271993218 3307409314 154765640
|
||||
4136363029 3910495658 8898890
|
||||
377494819 3797191068 11309757
|
||||
1804029460 1058692190 209661300
|
||||
836150842 3517760656 761577
|
||||
3110028602 3518522233 91928196
|
||||
2538654721 2483142439 12214638
|
||||
687016715 2237751133 149134127
|
||||
3201956798 2844327960 445654795
|
||||
1128672886 1268353490 102540063
|
||||
2057482281 0 214510937
|
||||
388804576 214510937 298212139
|
||||
1231212949 3505966475 11794181
|
||||
2013690760 3462174954 43791521
|
||||
3943239374 3952138264 193123655
|
@ -24,4 +24,5 @@ pub mod year2023 {
|
||||
pub mod day02;
|
||||
pub mod day03;
|
||||
pub mod day04;
|
||||
pub mod day05;
|
||||
}
|
||||
|
@ -99,5 +99,6 @@ fn year2023() -> Vec<Solution> {
|
||||
solution!(year2023, day02),
|
||||
solution!(year2023, day03),
|
||||
solution!(year2023, day04),
|
||||
solution!(year2023, day05),
|
||||
]
|
||||
}
|
||||
|
155
src/year2023/day05.rs
Normal file
155
src/year2023/day05.rs
Normal file
@ -0,0 +1,155 @@
|
||||
use crate::util::parse::ParseExt;
|
||||
|
||||
#[derive(Debug)]
|
||||
struct Map {
|
||||
tuples: Vec<(usize, usize, usize)>,
|
||||
}
|
||||
|
||||
impl Map {
|
||||
// We divide the seed range up into smaller seed ranges:
|
||||
// 1) seed range before map range
|
||||
// 2) seed range after map range
|
||||
// 3) seed range in map range
|
||||
// for the seed range inside the map range we map it and it to the result array
|
||||
// the before and after seed ranges will be saved for the next map where. apply again
|
||||
// rinse and repeat until the ranges are empty
|
||||
fn calc_range(&self, mut ranges: Vec<(usize, usize)>) -> Vec<(usize, usize)> {
|
||||
let mut mapped = vec![];
|
||||
for (dest, source, l) in &self.tuples {
|
||||
let mut todo = vec![];
|
||||
|
||||
while let Some((range_start, range_end)) = ranges.pop() {
|
||||
let before_range = (range_start, range_end.min(*source));
|
||||
if before_range.1 > before_range.0 {
|
||||
todo.push(before_range);
|
||||
}
|
||||
let after_range = ((*source + l).max(range_start), range_end);
|
||||
if after_range.1 > after_range.0 {
|
||||
todo.push(after_range);
|
||||
}
|
||||
let between_range = (range_start.max(*source), (*source + *l).min(range_end));
|
||||
if between_range.1 > between_range.0 {
|
||||
mapped.push((
|
||||
between_range.0 - source + dest,
|
||||
between_range.1 - source + dest,
|
||||
));
|
||||
}
|
||||
}
|
||||
ranges = todo;
|
||||
}
|
||||
mapped.extend(ranges);
|
||||
mapped
|
||||
}
|
||||
}
|
||||
|
||||
fn parse(input: &str) -> (Vec<usize>, Vec<Map>) {
|
||||
let mut chunks = input.split("\n\n");
|
||||
let seeds = chunks
|
||||
.next()
|
||||
.unwrap()
|
||||
.u32s()
|
||||
.map(|v| v as usize)
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
let maps = chunks
|
||||
.map(|chunk| Map {
|
||||
tuples: chunk
|
||||
.lines()
|
||||
.enumerate()
|
||||
.filter_map(|(idx, line)| {
|
||||
if idx == 0 {
|
||||
return None;
|
||||
}
|
||||
let mut nums = line.u32s();
|
||||
Some((
|
||||
nums.next()? as usize,
|
||||
nums.next()? as usize,
|
||||
nums.next()? as usize,
|
||||
))
|
||||
})
|
||||
.collect(),
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
(seeds, maps)
|
||||
}
|
||||
|
||||
pub fn part1(input: &str) -> impl std::fmt::Display {
|
||||
let (mut seeds, maps) = parse(input);
|
||||
|
||||
for seed in seeds.iter_mut() {
|
||||
for map in &maps {
|
||||
for (dest, source, l) in &map.tuples {
|
||||
// if seed is within range map it in-place else leave it
|
||||
if *seed >= *source && *seed < *source + *l {
|
||||
*seed = *seed + *dest - *source;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
seeds.sort();
|
||||
seeds[0]
|
||||
}
|
||||
|
||||
pub fn part2(input: &str) -> impl std::fmt::Display {
|
||||
let (seeds, maps) = parse(input);
|
||||
let seeds = seeds.chunks(2).map(|v| (v[0], v[1]));
|
||||
|
||||
let mut res = seeds
|
||||
.map(|(start, end)| {
|
||||
let mut ranges = maps
|
||||
.iter()
|
||||
.fold(vec![(start, start + end)], |acc, map| map.calc_range(acc));
|
||||
ranges.sort();
|
||||
// We want the lowest, so take lower end of range
|
||||
ranges[0].0
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
res.sort();
|
||||
res[0]
|
||||
}
|
||||
|
||||
static TEST_INPUT: &str = "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";
|
||||
|
||||
#[test]
|
||||
fn test_part1() {
|
||||
assert_eq!("35", part1(TEST_INPUT).to_string())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_part2() {
|
||||
assert_eq!("46", part2(TEST_INPUT).to_string())
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user