2023 - Day 05
This commit is contained in:
parent
76e36d43c1
commit
a5c515f64a
207
2023/input/05/input
Normal file
207
2023/input/05/input
Normal file
|
@ -0,0 +1,207 @@
|
|||
seeds: 104847962 3583832 1212568077 114894281 3890048781 333451605 1520059863 217361990 310308287 12785610 3492562455 292968049 1901414562 516150861 2474299950 152867148 3394639029 59690410 862612782 176128197
|
||||
|
||||
seed-to-soil map:
|
||||
2023441036 2044296880 396074363
|
||||
2419515399 3839972576 454994720
|
||||
274688417 699823315 258919718
|
||||
533608135 0 431744151
|
||||
965352286 431744151 161125324
|
||||
3391658630 2936663910 903308666
|
||||
200749950 1177785526 73938467
|
||||
2874510119 1440389999 315892137
|
||||
1916089471 2440371243 20593195
|
||||
0 977035576 200749950
|
||||
1936682666 1957538510 86758370
|
||||
1440389999 2902130623 34533287
|
||||
1126477610 592869475 106953840
|
||||
3190402256 1756282136 201256374
|
||||
1474923286 2460964438 441166185
|
||||
1233431450 958743033 18292543
|
||||
|
||||
soil-to-fertilizer map:
|
||||
1479837493 1486696129 480988794
|
||||
3637384566 3730606485 267472485
|
||||
70483107 174821741 921411492
|
||||
3586173142 3071290434 51211424
|
||||
1960826287 1166716340 319979789
|
||||
3952751562 3398939385 283772589
|
||||
0 1096233233 70483107
|
||||
1166716340 1967684923 313121153
|
||||
3904857051 3682711974 47894511
|
||||
2902018973 3122501858 276437527
|
||||
991894599 0 174821741
|
||||
3416901681 2902018973 169271461
|
||||
3178456500 3998078970 238445181
|
||||
|
||||
fertilizer-to-water map:
|
||||
4274676882 2765984054 20290414
|
||||
3642266392 2324011621 382224743
|
||||
3159410287 4157769177 137198119
|
||||
3437898965 2786274468 204367427
|
||||
2136710407 1497332580 94233249
|
||||
4121681656 2706236364 59747690
|
||||
2362529584 1912615374 411396247
|
||||
4181429346 3961317447 93247536
|
||||
270199336 152334204 473273308
|
||||
1977000445 3853228854 108088593
|
||||
2085089038 1304420652 51621369
|
||||
1407624846 2990641895 345516575
|
||||
908901118 638701782 307729932
|
||||
3296608406 1356042021 141290559
|
||||
743472644 625607512 13094270
|
||||
2230943656 3721642926 131585928
|
||||
0 946431714 270199336
|
||||
2773925831 3336158470 385484456
|
||||
4024491135 1815424853 97190521
|
||||
756566914 0 152334204
|
||||
1304420652 4054564983 103204194
|
||||
1753141421 1591565829 223859024
|
||||
|
||||
water-to-light map:
|
||||
139728365 0 27290780
|
||||
4161521920 2345099742 65970280
|
||||
3549264451 2411070022 15588060
|
||||
846553766 4012820620 62155872
|
||||
3276913175 3215861697 30588309
|
||||
7256118 139495191 27523954
|
||||
3653026602 3908255344 104565276
|
||||
2007806695 3246450006 21131889
|
||||
426542603 2677155019 292403006
|
||||
3265259672 4167732422 11653503
|
||||
2959802238 3267581895 77570040
|
||||
2766290955 2562319792 114835227
|
||||
779480399 3352881787 3460872
|
||||
718945609 995514267 33385697
|
||||
908709638 1675494216 164534584
|
||||
1547970680 1643941067 31553149
|
||||
1579523829 2009572806 335526936
|
||||
782941271 2969558025 63612495
|
||||
752331306 465171569 27149093
|
||||
237284175 1454682639 189258428
|
||||
3757591878 3724399189 59699158
|
||||
2881126182 3784098347 78676056
|
||||
1520219770 2426658082 27750910
|
||||
3564852511 1366508548 88174091
|
||||
2383999106 3681454004 42945185
|
||||
4287237444 3345151935 7729852
|
||||
2242562254 3649815914 31638090
|
||||
3307501484 753751300 241762967
|
||||
34780072 27290780 104948293
|
||||
2028938584 3033170520 182691177
|
||||
3037372278 237284175 227887394
|
||||
3817291036 3356342659 5821939
|
||||
0 132239073 7256118
|
||||
1360895538 1266240382 51601463
|
||||
3823112975 492320662 230498145
|
||||
2274200344 1840028800 109798762
|
||||
4053611120 2454408992 107910800
|
||||
2426944291 1317841845 48666703
|
||||
1073244222 3362164598 287651316
|
||||
1457977942 1203998554 62241828
|
||||
2591192365 1028899964 175098590
|
||||
1412497001 3862774403 45480941
|
||||
2475610994 4179385925 115581371
|
||||
4227492200 1949827562 59745244
|
||||
1915050765 4074976492 92755930
|
||||
2211629761 722818807 30932493
|
||||
|
||||
light-to-temperature map:
|
||||
3741602262 2758947303 142653736
|
||||
628739598 2901601039 50811783
|
||||
1842260329 1084521599 145122645
|
||||
2990409993 3493390513 390865485
|
||||
4190333929 4159289690 83510514
|
||||
984282519 2952412822 202948629
|
||||
1826968660 3155361451 15291669
|
||||
1329953386 2288178120 328046945
|
||||
830513455 3304469747 74190775
|
||||
1187231148 2616225065 142722238
|
||||
2705943734 836690664 247830935
|
||||
3381275478 1332397059 281233458
|
||||
679551381 605080109 150962074
|
||||
1987382974 756042183 44013157
|
||||
4159289690 4263923057 31044239
|
||||
1772730322 3250231409 54238338
|
||||
2549609472 2131843858 156334262
|
||||
1658000331 3378660522 114729991
|
||||
298584178 195831363 330155420
|
||||
3662508936 525986783 79093326
|
||||
4273844443 4242800204 21122853
|
||||
2953774669 800055340 36635324
|
||||
2031396131 1613630517 518213341
|
||||
265644560 162891745 32939618
|
||||
162891745 1229644244 102752815
|
||||
904704230 3170653120 79578289
|
||||
|
||||
temperature-to-humidity map:
|
||||
671484955 1144907174 532089323
|
||||
1414132335 1960778188 125717021
|
||||
2631474761 2586973888 1058655511
|
||||
1991131055 744338927 221864400
|
||||
2212995455 192320896 28611061
|
||||
192320896 2186552402 224875394
|
||||
2241895588 966203327 169532208
|
||||
1744764149 431490014 67442815
|
||||
1812206964 2106058626 80493776
|
||||
516655377 1135735535 9171639
|
||||
1559412773 1775426812 185351376
|
||||
2622156499 2577655626 9318262
|
||||
1203574278 220931957 210558057
|
||||
3690130272 4094120212 156346211
|
||||
3946017132 3645629399 348950164
|
||||
525827016 598680988 145657939
|
||||
1892700740 1676996497 98430315
|
||||
3846476483 3994579563 99540649
|
||||
2577655626 4250466423 44500873
|
||||
1539849356 2086495209 19563417
|
||||
2241606516 598391916 289072
|
||||
417196290 498932829 99459087
|
||||
|
||||
humidity-to-location map:
|
||||
547577859 2546258172 54451455
|
||||
2564186976 3913248498 28610653
|
||||
2460249359 129990669 103937617
|
||||
257798579 3257354132 21143365
|
||||
511274864 3365252234 24536388
|
||||
412475023 3389788622 98799841
|
||||
2843712442 3615348771 251219053
|
||||
0 2984989380 24111266
|
||||
1074541266 4051128852 126947592
|
||||
3109497668 265707418 9056683
|
||||
3268495430 1450483293 18654108
|
||||
1298820860 954974424 392849235
|
||||
1691670095 1469137401 93027519
|
||||
3886041222 2131196811 39611681
|
||||
2797706800 1347823659 46005642
|
||||
3767841776 233928286 19835810
|
||||
743957513 253764096 11943322
|
||||
4068806743 3941859151 109269701
|
||||
2754107115 1910801576 16288912
|
||||
1223331059 2244121482 75489801
|
||||
3118554351 1393829301 56653992
|
||||
3094931495 3009100646 14566173
|
||||
3991994741 893524279 61450145
|
||||
692486724 2192650693 51470789
|
||||
1008564686 2952439802 32549578
|
||||
535811252 3603582164 11766607
|
||||
1784697614 2698363640 44335967
|
||||
755900835 2353038285 193219887
|
||||
278941944 1777268497 133533079
|
||||
3925652903 3488588463 66341838
|
||||
3558101581 2742699607 209740195
|
||||
949120722 3305808270 59443964
|
||||
2624116446 0 129990669
|
||||
1939852817 274764101 520396542
|
||||
3175208343 2037909724 93287087
|
||||
3287149538 2600709627 97654013
|
||||
650681177 1562164920 41805547
|
||||
3787677586 795160643 98363636
|
||||
1829033581 1927090488 110819236
|
||||
4053444886 3897886641 15361857
|
||||
1201488858 2170808492 21842201
|
||||
3384803551 1603970467 173298030
|
||||
2770396027 3278497497 27310773
|
||||
1041114264 2319611283 33427002
|
||||
602029314 3554930301 48651863
|
||||
2592797629 3866567824 31318817
|
||||
24111266 3023666819 233687313
|
33
2023/input/05/test-1
Normal file
33
2023/input/05/test-1
Normal file
|
@ -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
|
223
2023/src/bin/day05.rs
Normal file
223
2023/src/bin/day05.rs
Normal file
|
@ -0,0 +1,223 @@
|
|||
#![feature(iter_map_windows)]
|
||||
#![feature(test)]
|
||||
use std::{
|
||||
cmp::max,
|
||||
collections::VecDeque,
|
||||
ops::{Add, BitAnd, BitOr},
|
||||
};
|
||||
|
||||
use anyhow::Result;
|
||||
use aoc::Solver;
|
||||
|
||||
// -- Runners --
|
||||
fn main() -> Result<()> {
|
||||
Day::solve()
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn part1_test1() -> Result<()> {
|
||||
Day::test(Day::part1, "test-1", 35)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn part1_solution() -> Result<()> {
|
||||
Day::test(Day::part1, "input", 88151870)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn part1_test2() -> Result<()> {
|
||||
Day::test(Day::part2, "test-1", 46)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn part2_solution() -> Result<()> {
|
||||
Day::test(Day::part2, "input", 2008785)
|
||||
}
|
||||
|
||||
// Benchmarks
|
||||
extern crate test;
|
||||
#[bench]
|
||||
#[ignore]
|
||||
fn part1_bench(b: &mut test::Bencher) {
|
||||
Day::benchmark(Day::part1, b)
|
||||
}
|
||||
#[bench]
|
||||
#[ignore]
|
||||
fn part2_bench(b: &mut test::Bencher) {
|
||||
Day::benchmark(Day::part2, b)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
struct Range {
|
||||
start: isize,
|
||||
length: isize,
|
||||
}
|
||||
|
||||
impl Range {
|
||||
pub fn new(start: isize, length: isize) -> Self {
|
||||
Self { start, length }
|
||||
}
|
||||
|
||||
pub fn end(&self) -> isize {
|
||||
self.start + self.length
|
||||
}
|
||||
|
||||
pub fn offset(&self, offset: isize) -> Self {
|
||||
Self {
|
||||
start: self.start + offset,
|
||||
length: self.length,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn overlap(&self, rhs: &Self) -> Option<Self> {
|
||||
let start = max(self.start, rhs.start);
|
||||
let end = std::cmp::min(self.end(), rhs.end());
|
||||
|
||||
if end > start {
|
||||
Some(Range {
|
||||
start,
|
||||
length: end - start,
|
||||
})
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
pub fn exclude(&self, rhs: &Self) -> VecDeque<Self> {
|
||||
if let Some(overlap) = self.overlap(rhs) {
|
||||
if rhs.start <= self.start && rhs.end() >= self.end() {
|
||||
vec![].into()
|
||||
} else if rhs.start <= self.start {
|
||||
let start = rhs.end();
|
||||
let length = self.end() - start;
|
||||
|
||||
vec![Range::new(start, length)].into()
|
||||
} else if rhs.end() >= self.end() {
|
||||
let start = self.start;
|
||||
let length = rhs.start - start;
|
||||
|
||||
vec![Range::new(start, length)].into()
|
||||
} else {
|
||||
let a = Range::new(self.start, overlap.start - self.start);
|
||||
let b = Range::new(overlap.end(), self.end() - overlap.end());
|
||||
|
||||
vec![a, b].into()
|
||||
}
|
||||
} else {
|
||||
vec![*self].into()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// -- Solution --
|
||||
pub struct Day;
|
||||
impl aoc::Solver for Day {
|
||||
type Output1 = isize;
|
||||
type Output2 = isize;
|
||||
|
||||
fn day() -> u8 {
|
||||
5
|
||||
}
|
||||
|
||||
fn part1(input: &str) -> Self::Output1 {
|
||||
let mut split = input.split("\n\n");
|
||||
let mut seeds: Vec<_> = split
|
||||
.next()
|
||||
.unwrap()
|
||||
.split_once(": ")
|
||||
.unwrap()
|
||||
.1
|
||||
.split_whitespace()
|
||||
.map(|seed| seed.parse::<isize>().unwrap())
|
||||
.collect();
|
||||
|
||||
for _ in 0..7 {
|
||||
let map = split
|
||||
.next()
|
||||
.unwrap()
|
||||
.lines()
|
||||
.skip(1)
|
||||
.map(|line| {
|
||||
let mut split = line.splitn(3, ' ');
|
||||
(
|
||||
split.next().unwrap().parse::<isize>().unwrap(),
|
||||
split.next().unwrap().parse::<isize>().unwrap(),
|
||||
split.next().unwrap().parse::<isize>().unwrap(),
|
||||
)
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
seeds = seeds
|
||||
.into_iter()
|
||||
.map(|mut seed| {
|
||||
for mapping in map.iter() {
|
||||
if seed >= mapping.1 && seed < (mapping.1 + mapping.2) {
|
||||
seed = seed - mapping.1 + mapping.0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
seed
|
||||
})
|
||||
.collect();
|
||||
}
|
||||
|
||||
*seeds.iter().min().unwrap()
|
||||
}
|
||||
|
||||
fn part2(input: &str) -> Self::Output2 {
|
||||
let mut split = input.split("\n\n");
|
||||
let mut seeds: VecDeque<_> = split
|
||||
.next()
|
||||
.unwrap()
|
||||
.split_once(": ")
|
||||
.unwrap()
|
||||
.1
|
||||
.split_whitespace()
|
||||
.map(|seed| seed.parse::<isize>().unwrap())
|
||||
.map_windows(|range: &[isize; 2]| Range::new(range[0], range[1]))
|
||||
.step_by(2)
|
||||
.collect();
|
||||
|
||||
for _ in 0..7 {
|
||||
let map = split
|
||||
.next()
|
||||
.unwrap()
|
||||
.lines()
|
||||
.skip(1)
|
||||
.map(|line| {
|
||||
let mut split = line.splitn(3, ' ');
|
||||
let remap = split.next().unwrap().parse::<isize>().unwrap();
|
||||
let start = split.next().unwrap().parse::<isize>().unwrap();
|
||||
let length = split.next().unwrap().parse::<isize>().unwrap();
|
||||
|
||||
(Range::new(start, length), remap - start)
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
let mut result = VecDeque::new();
|
||||
|
||||
'outer: while let Some(seed) = seeds.pop_front() {
|
||||
for mapping in map.iter() {
|
||||
if let Some(overlap) = seed.overlap(&mapping.0) {
|
||||
result.push_back(overlap.offset(mapping.1));
|
||||
seeds.append(&mut seed.exclude(&mapping.0));
|
||||
|
||||
continue 'outer;
|
||||
}
|
||||
}
|
||||
|
||||
result.push_back(seed);
|
||||
}
|
||||
|
||||
seeds = result;
|
||||
}
|
||||
|
||||
seeds.iter().map(|range| range.start).min().unwrap()
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user