From 7e4021e32dd938a9e21fb84e46218709917fac85 Mon Sep 17 00:00:00 2001 From: Lea Date: Tue, 5 Dec 2023 22:39:08 +0100 Subject: [PATCH] day 5 --- Cargo.lock | 8 ++ day_5/input.txt | 283 +++++++++++++++++++++++++++++++++++++++ day_5/part_1/Cargo.toml | 8 ++ day_5/part_1/src/main.rs | 49 +++++++ day_5/part_2/Cargo.toml | 8 ++ day_5/part_2/src/main.rs | 125 +++++++++++++++++ 6 files changed, 481 insertions(+) create mode 100644 day_5/input.txt create mode 100644 day_5/part_1/Cargo.toml create mode 100644 day_5/part_1/src/main.rs create mode 100644 day_5/part_2/Cargo.toml create mode 100644 day_5/part_2/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index d7a8f62..214cf77 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -46,6 +46,14 @@ version = "0.1.0" name = "day_4-2" version = "0.1.0" +[[package]] +name = "day_5-1" +version = "0.1.0" + +[[package]] +name = "day_5-2" +version = "0.1.0" + [[package]] name = "memchr" version = "2.6.4" diff --git a/day_5/input.txt b/day_5/input.txt new file mode 100644 index 0000000..5481256 --- /dev/null +++ b/day_5/input.txt @@ -0,0 +1,283 @@ +seeds: 515785082 87905039 2104518691 503149843 720333403 385234193 1357904101 283386167 93533455 128569683 2844655470 24994629 3934515023 67327818 2655687716 8403417 3120497449 107756881 4055128129 9498708 + +seed-to-soil map: +2025334497 3876763368 16729580 +1877945250 2032519622 95086460 +0 679167893 381174930 +717319608 469672599 20842400 +1677700339 1823837909 22353530 +634816620 1372848321 73458998 +2756794066 2812828157 182758452 +3324095721 3392359690 456362171 +969898963 32396659 196640650 +1973031710 2127606082 52302787 +4095486882 3893492948 33982348 +381174930 591894131 9141137 +3247991211 2466896352 76104510 +1645303680 0 32396659 +3023330013 4070306098 224661198 +2329063131 1900645524 131874098 +2042064077 3115509825 242853312 +969753308 1446307319 145655 +4214866116 3035408645 80101180 +589310441 1846191439 28201780 +4129469230 2811864212 963945 +510217282 1276450763 79093159 +2989333460 3358363137 33996553 +3780457892 2179908869 286987483 +738162008 229037309 231591300 +2460937229 3927475296 26993487 +1205326488 1547352475 237698559 +2487930716 2543000862 268863350 +4170255211 3998614525 21910631 +1543924548 490514999 101379132 +1443025047 1446452974 100899501 +2939552518 4020525156 49780942 +2284917389 3954468783 44145742 +617512221 1355543922 17304399 +4067445375 3848721861 28041507 +1166539613 1785051034 38786875 +708275618 460628609 9043990 +390316067 1156549548 119901215 +4192165842 1877945250 22700274 +4130433175 2995586609 39822036 +1700053869 601035268 78132625 +1778186494 1060342823 96206725 + +soil-to-fertilizer map: +0 2341619969 92369762 +1167455233 3617741643 38094704 +1499102298 1681004272 234557927 +3376581938 2517836559 179214694 +2914723756 619913619 149410902 +161434282 0 41510814 +3649464352 3314750891 40779782 +2317356783 1915562199 186244783 +713485962 950249988 47781849 +421834722 1125088099 56442466 +2507552861 3655836347 34407787 +3565617524 2433989731 83846828 +2678581348 103843947 189846804 +995696604 565539077 54374542 +410018942 2894022626 11815780 +938203483 303511643 57493121 +586429700 998031837 127056262 +3064134658 1533041508 147962764 +2219062401 2305658720 35961249 +2050866563 393391944 168195838 +3803001923 4143671264 151296032 +814953468 2101806982 123250015 +1050071146 1508839376 17695066 +2629883889 1526534442 6507066 +92369762 3199390767 69064520 +3212097422 3355530673 164484516 +4049139793 3803001923 245827503 +2541960648 3549487250 55536061 +2255023650 41510814 62333133 +478277188 842097476 108152512 +213047569 2697051253 196971373 +3954297955 4048829426 48488938 +4002786893 4097318364 46352900 +1733660225 1181530565 317206338 +2649109287 3520015189 29472061 +2636390955 3605023311 12718332 +2503601566 561587782 3951295 +202945096 1498736903 10102473 +1140539167 2278742654 26916066 +3555796632 293690751 9820892 +1205549937 2905838406 293552361 +1067766212 769324521 72772955 +2597496709 361004764 32387180 +761267811 2225056997 53685657 +2868428152 3268455287 46295604 + +fertilizer-to-water map: +152178464 250673346 55422 +152233886 237175480 13497866 +3154188384 1047083609 4715554 +3582007164 1051799163 5818075 +3259979115 2494521724 322028049 +402907232 308602731 62253347 +4236473989 2233392950 58493307 +2707774309 1208011821 30397527 +3587825239 2917624950 58473157 +896622971 631491687 63460153 +465160579 250728768 57873963 +165731752 0 237175480 +2439165 370856078 149739299 +3074181106 3899730566 80007278 +3059559654 1999627040 14621452 +1312214893 3041353489 50783396 +960083124 694951840 352131769 +2680544515 1972397246 27229794 +631491687 1238409348 57882415 +3646298396 3092136885 387540126 +2592786348 2014248492 87758167 +1513392872 3479677011 420053555 +2509534881 1681896910 83251467 +0 520595377 2439165 +2738171836 1352203735 287691765 +1362998289 1057617238 150394583 +3158903938 2816549773 101075177 +4033838522 2291886257 202635467 +1933446427 1296291763 55911972 +689374102 1765148377 207248869 +2152304019 1639895500 42001410 +1989358399 2135702712 97690238 +3025863601 2102006659 33696053 +2087048637 2976098107 65255382 +2194305429 3979737844 315229452 + +water-to-light map: +2953662638 2442860750 178173989 +1541545030 2734817557 190358536 +754320741 167246313 76339023 +1856345147 4205331132 89636164 +4252036650 1935658232 42930646 +155447228 526835738 21442665 +854896092 243585336 283250402 +1353462278 548278403 77281269 +3280902948 2925176093 9989800 +1430743547 1124319386 47116063 +3675997643 3263466919 126502268 +3189943537 3895004042 77007091 +3439702455 2103030459 136553424 +1836535231 2083220543 19809916 +1207650119 1274680470 145812159 +2726058004 2958658296 227604634 +3131836627 4078001241 58106910 +3290892748 4136108151 65420425 +1138146494 74127343 49701217 +320969084 0 74127343 +3356313173 4038105259 39895982 +2313549351 2239583883 7585248 +3908092261 2247169131 195691619 +205670012 625559672 115299072 +830659764 1100083058 24236328 +3424990872 3972011133 14711583 +80982326 1171435449 74464902 +3576255879 1835916468 99741764 +176889893 1245900351 28780119 +395096427 740858744 359224314 +2533259155 1541545030 192798849 +3396209155 2706035840 28781717 +1945981311 4201528576 3802556 +0 123828560 23615345 +3802499911 3789411692 105592350 +1949783867 3986722716 51382543 +2509766752 2935165893 23492403 +4167035549 2621034739 85001101 +23615345 1420492629 57366981 +3266950628 3249514599 13952320 +1731903566 1978588878 104631665 +2211976762 1734343879 101572589 +2001166410 3578601340 210810352 +2321134599 3389969187 188632153 +1187847711 147443905 19802408 +4103783880 3186262930 63251669 + +light-to-temperature map: +70532163 2072528772 6548798 +4144686847 1559382043 150280449 +54527625 2056524234 16004538 +3807793247 2758133633 336893600 +650952420 859025504 83666107 +1904509744 3183659444 2786814 +780330456 3472688125 531542959 +77080961 54527625 154573827 +2350216539 1865381176 99600417 +3084022977 1715376404 150004772 +2107664798 4058224014 213619824 +1773073526 793980359 19333216 +231654788 2452888407 305245226 +3781460885 2030191872 26332362 +2939630982 2331937347 79772249 +560023472 1070561556 50945056 +2478552333 1313852724 245529319 +3234027749 526405562 267574797 +536900014 4271843838 23123458 +1873309968 1709662492 5713912 +1879023880 2427402543 25485864 +2724081652 2116388017 215549330 +1922425580 2079077570 37310447 +734618527 813313575 45711929 +1702870875 971426988 70202651 +3019403231 3186446258 64619746 +3767451847 4044214976 14009038 +3575105735 1121506612 192346112 +1959736027 3324759354 147928771 +1792406742 2411709596 15692947 +1808099689 1964981593 65210279 +1907296558 3095027233 15129022 +1311873415 209101452 317304110 +2449816956 942691611 28735377 +610968528 4004231084 39983892 +2321284622 1041629639 28931917 +3501602546 3110156255 73503189 +1629177525 3251066004 73693350 + +temperature-to-humidity map: +2698939019 1899653215 333343198 +636293562 2781983613 635230295 +3050376312 0 239799964 +92201313 2779048878 2934735 +3290176276 2660814640 25026650 +2134083411 2489247727 2136257 +3851297241 3604655691 314442217 +1483568567 866597732 152309188 +333293267 1018906920 303000295 +0 2685841290 1438147 +1635877755 2687279437 53836876 +3032282217 2471153632 18094095 +26400590 1558914368 65800723 +1271523857 1346869658 212044710 +2136219668 239799964 524786786 +2661006454 2741116313 37932565 +1859145287 1624715091 274938124 +1689714631 2491383984 169430656 +1438147 1321907215 24962443 +3315202926 764586750 102010982 +95136048 2232996413 238157219 +3604655691 3919097908 90929169 +3695584860 4010027077 155712381 + +humidity-to-location map: +2245504116 1166524785 164267337 +2409771453 1729601904 604997365 +120247692 2545941209 34587342 +3116311219 3036964896 76986730 +1512620570 0 147162638 +3512343576 4259469787 35497509 +1169583301 1336067922 123578155 +3921210971 3312190478 126745070 +2181345242 2427978815 64158874 +0 1459646077 120247692 +4223038352 3474502707 71928944 +779681654 1579893769 149708135 +3894412843 3962661335 26798128 +1659783208 1330792122 5275800 +500368604 393220323 51352254 +3686138511 3754387003 208274332 +632498588 2492137689 53803520 +1135055763 147162638 34527538 +686302108 2334599269 93379546 +551720858 2731943364 80777730 +306544451 181690176 42409340 +4115726396 3237074496 75115982 +3547841085 4014859186 138297426 +3080744060 3438935548 35567159 +1293161456 2812721094 202047724 +929389789 960858811 205665974 +4190842378 3113951626 32195974 +1736823657 516337226 444521585 +154835034 224099516 151709417 +3036964896 3614528274 43779164 +1495209180 375808933 17411390 +1665059008 444572577 71764649 +348953791 2580528551 151414813 +3299611124 3546431651 68096623 +3421416680 3146147600 90926896 +4047956041 3989459463 25399723 +3367707747 3700678070 53708933 +4073355764 3658307438 42370632 +3193297949 4153156612 106313175 diff --git a/day_5/part_1/Cargo.toml b/day_5/part_1/Cargo.toml new file mode 100644 index 0000000..ded2099 --- /dev/null +++ b/day_5/part_1/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "day_5-1" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/day_5/part_1/src/main.rs b/day_5/part_1/src/main.rs new file mode 100644 index 0000000..97535d0 --- /dev/null +++ b/day_5/part_1/src/main.rs @@ -0,0 +1,49 @@ +fn main() { + let input = include_str!("../../input.txt").trim_end(); + let mut segments: Vec<&str> = input.split("\n\n").collect::>(); + let mut numbers: Vec = segments + .remove(0) + .replace("seeds: ", "") + .split(" ") + .map(|num| num.parse::().unwrap()) + .collect(); + + for segment in segments { + let mut new_numbers: Vec = Vec::new(); + let mut lines = segment.trim().lines(); + lines.next(); // Remove first line + + for line in lines { + let values = line + .split(" ") + .map(|num| num.parse::().unwrap()) + .collect::>(); + + let dest_start = values[0]; + let source_start = values[1]; + let range_len = values[2]; + + let mut to_delete: Vec = Vec::new(); + for i in 0..numbers.len() { + let num = numbers[i]; + + if num >= source_start && num < source_start + range_len { + new_numbers.push(dest_start + (num - source_start)); + to_delete.push(i); + } + } + + to_delete.sort_by(|a, b| b.cmp(a)); + for i in to_delete { + numbers.remove(i); + } + } + + for num in new_numbers { + numbers.push(num); + } + } + + numbers.sort(); + println!("Result: {}", numbers.first().unwrap()); +} diff --git a/day_5/part_2/Cargo.toml b/day_5/part_2/Cargo.toml new file mode 100644 index 0000000..8e378f1 --- /dev/null +++ b/day_5/part_2/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "day_5-2" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/day_5/part_2/src/main.rs b/day_5/part_2/src/main.rs new file mode 100644 index 0000000..f46e436 --- /dev/null +++ b/day_5/part_2/src/main.rs @@ -0,0 +1,125 @@ +#[derive(Copy, Clone, Debug)] +struct Pair { + first: i64, + last: i64, +} + +impl Pair { + fn increment(&self, difference: i64) -> Pair { + Pair { + first: self.first + difference, + last: self.last + difference, + } + } + + fn is_same(&self, other: &Pair) -> bool { + self.first == other.first && self.last == other.last + } +} + +fn main() { + let input = include_str!("../../input.txt").trim_end(); + let mut segments: Vec<&str> = input.split("\n\n").collect::>(); + let mut numbers: Vec = Vec::new(); + let mut input_numbers: Vec = segments + .remove(0) + .replace("seeds: ", "") + .split(" ") + .map(|num| num.parse::().unwrap()) + .collect(); + + while !input_numbers.is_empty() { + let first = input_numbers.remove(0); + let last = first + input_numbers.remove(0) - 1; + + numbers.push(Pair { + first: first, + last: last, + }); + } + + for segment in segments { + let mut new_numbers: Vec = Vec::new(); + let mut lines = segment.trim().lines(); + lines.next(); + + for line in lines { + let values = line + .split(" ") + .map(|num| num.parse::().unwrap()) + .collect::>(); + + let dest_start = values[0]; + let source_start = values[1]; + let range_len = values[2]; + let source_end = source_start + range_len - 1; + + for item in numbers.clone() { + // Item is not in range + if (item.first < source_start && item.last < source_start) || (item.first > source_end && item.last > source_end) { + continue; + } + + // Item is completely within range + if item.first >= source_start && item.last <= source_end { + new_numbers.push(item.increment(dest_start - source_start)); + numbers.retain(|i| !i.is_same(&item)); + continue; + } + + // Item is overflowing to the left + if item.first < source_start && item.last <= source_end { + new_numbers.push(Pair { + first: source_start, + last: item.last, + }.increment(dest_start - source_start)); + numbers.push(Pair { + first: item.first, + last: source_start - 1, + }); + numbers.retain(|i| !i.is_same(&item)); + continue; + } + + // Item is overflowing to the right + if item.first >= source_start && item.last > source_end { + new_numbers.push(Pair { + first: item.first, + last: source_end, + }.increment(dest_start - source_start)); + numbers.push(Pair { + first: source_end + 1, + last: item.last, + }); + numbers.retain(|i| !i.is_same(&item)); + continue; + } + + // Item is overflowing on both sides + if source_start > item.first && source_end < item.last { + new_numbers.push(Pair { + first: source_start, + last: source_end, + }.increment(dest_start - source_start)); + numbers.push(Pair { + first: item.first, + last: source_start - 1, + }); + numbers.push(Pair { + first: source_end + 1, + last: item.last, + }); + numbers.retain(|i| !i.is_same(&item)); + continue; + } + } + } + + for num in &new_numbers { + numbers.push(*num); + } + } + + numbers.sort_by(|a, b| a.first.cmp(&b.first)); + println!("Result: {}", &numbers[0].first); +}