diff --git a/y2025/resources/5_input.txt b/y2025/resources/5_input.txt new file mode 100644 index 0000000..039d571 --- /dev/null +++ b/y2025/resources/5_input.txt @@ -0,0 +1,1177 @@ +79225938624159-79772919561224 +445994870830027-449475105431654 +485052355932434-489723347156062 +252033180861215-252511696149831 +455027942886900-455027942886900 +390923392404945-391369358684202 +111589773767805-118743888275326 +440390990825652-440663571836987 +436713593570041-437153387734809 +71552614839182-72248109759130 +75562993535351-75777039646971 +202271210408543-206274751599943 +174836883092812-180073977980028 +516752870130348-518587513963800 +223078965120104-228545028738318 +438996036819994-439417909158596 +75562993535351-76365170391821 +151193210118987-157105755166663 +79772919561224-79981244100552 +96759532330786-98579687302472 +78755790555282-79225938624159 +413395659982149-413395659982149 +252961912959367-253636969000871 +440145272934342-440390990825652 +292632881149683-297095102370780 +5439446452415-8476082394860 +27740466262204-29785184292050 +91308964822097-96759532330784 +352924241057590-354499519431240 +260138981910960-260557265444664 +259961539016687-260138981910960 +373590767911263-376365600546733 +514274082785193-516010739140991 +534016913115199-540445990696521 +438477741007747-438625201619520 +252705478080896-252961912959367 +81529807435668-87525980647065 +274903492707570-277690616085252 +357524899188118-358875034429848 +25055251756195-26704088596914 +540445990696522-540445990696522 +126641042611452-126641042611452 +363389282691740-370081426037674 +223078965120103-223078965120103 +358643980680397-359836354030584 +273251196412736-276300727112958 +360304931887093-361532980687154 +54611041342437-57224634168756 +422927139058460-427888401588498 +555942054595955-559018047524858 +33541309838058-39074263190979 +356622813179758-358182833915101 +260138981910960-260802671527207 +390247982188757-390632116757234 +276570274308979-279441496270153 +132373993125976-136350174377622 +432689256585724-433045082549595 +515282338380611-517291623214868 +384960608828704-385471130381718 +141288346154379-148667235181744 +193715411452155-198037526958568 +442730917008354-450277066519305 +265694812858929-270838596219136 +544453658310498-552004299202057 +455027942886900-458367437363550 +390923392404945-391369358684202 +441128601849783-441662134512868 +478420204129418-481158065753227 +383977256209833-384405105282285 +304641651395981-310600767741398 +364944982731537-367415275977225 +383037049573035-383977256209833 +468311775561538-470995770448391 +81529807435668-86141768578819 +76580679130959-77183103581819 +72468870174805-73349647866598 +51945266971870-59698236253713 +41269089149346-41269089149346 +26388359454758-28538522238248 +72468870174805-73027431091794 +396168867879203-399887823491991 +518130406480785-520094113970530 +391248350131220-391369358684202 +151193210118987-159938826124943 +302239372542749-307326937043456 +463373574942020-470995770448391 +271693369738429-274140416172999 +359294204057144-360833032432674 +355737283619812-357058463446714 +385809253734370-386672304725548 +213727775852102-216828311641185 +512913756301730-514946536337279 +485052355932434-489723347156062 +122301489626806-126641042611452 +61073279838793-64601522636200 +289478169879820-289478169879820 +213727775852102-216828311641185 +107738463920939-107738463920939 +340684274251418-340684274251418 +323696253958580-330911444533497 +434238684817903-434751255465049 +285893461204740-289478169879820 +387603542541111-388094634062728 +387315520638657-388094634062728 +544453658310498-547225900584125 +391248350131220-391369358684202 +14138223877747-17205751061635 +520401561838165-522180393786716 +257292001338432-257999014714194 +384405105282285-384646125590025 +297095102370782-299108673243336 +312625254613715-320977475810592 +242995291745373-242995291745373 +232596112211004-238889664996400 +346289004667560-347859257126227 +494319600739047-494319600739047 +71730906496904-72468870174805 +354937175875507-356255684938529 +525917757855721-531722418711508 +405444920918505-407642614822359 +387888949860732-388363898955773 +387888949860732-388094634062728 +433045082549595-433458654165955 +76365170391821-76850399707072 +254985947817624-255772314079756 +168508801060493-168508801060493 +474930746035871-478420204129417 +493548713557-8476082394860 +559018047524858-559018047524858 +393195998519347-396168867879202 +335553280391128-340684274251417 +187819512743212-187819512743212 +102284928962805-107738463920938 +242995291745373-250482497824749 +254743374951296-254985947817624 +388947549331737-389441820942312 +373590767911263-381247681046110 +386165402242963-386961990037722 +173144135686138-174836883092811 +184466486183684-187819512743212 +524707566196329-529773882373859 +346289004667559-346289004667559 +413395659982149-420792440268852 +262801163197626-268539565121377 +134438472735028-140205385097386 +21973678985786-24167340388309 +504675185749547-508167792132876 +440869627037067-441531656440380 +165307828623093-168508801060492 +143639757889802-147894475709541 +78755790555282-79225938624159 +14138223877747-14138223877747 +278550141756410-280989120910301 +257292001338432-257437010542830 +382417022284888-383037049573035 +405444920918505-407642614822359 +20551130347159-22866841662034 +257292001338432-257437010542830 +352221290016534-353406793430300 +111589773767805-118743888275326 +353882376221457-355302743754497 +494319600739048-500132235482877 +206274751599945-208563447788717 +326108650535098-330911444533497 +64601522636201-69278000520467 +236896652986937-238889664996400 +76580679130959-76850399707072 +23559981379484-25727624448171 +75100216224333-75562993535351 +519175296031505-521134018156447 +256802625238664-257437010542830 +382535746223231-383340526298139 +41269089149347-49642182021355 +258513476853811-259076564266146 +257999014714194-258274397103704 +508167792132878-510252049970299 + +483969530684122 +134846534475894 +324241214092481 +244191528770542 +124507758892152 +76559339277532 +95889243666336 +21515935777259 +115339323569542 +136232130615684 +329432916979868 +5882445771325 +336843450910115 +158467907477388 +114288813866782 +548081571014923 +507536881101751 +1602547114782 +516167633022656 +73380041737416 +465576446609197 +83729040194730 +517345919605281 +481252268208569 +257056373429367 +546221674813606 +314211116404803 +156484152709521 +396534320538981 +65936008767184 +181825537789519 +247003020408113 +14307569526559 +144679215340716 +7185677396816 +346524951878936 +325667639903010 +324322053137166 +517673821103256 +133609351014751 +66708187938845 +328321984017255 +486520593554539 +268454562872729 +224637156497537 +543313587272160 +520444060582587 +28220506758897 +82738052957338 +308032121842232 +15356831834955 +302415925831627 +226195511828473 +306934185519545 +480053939971926 +538667059312545 +279807421453471 +79598805325091 +298149776136875 +201877559973578 +518688484310407 +318197816882328 +132766842422650 +10383965698474 +27692924727841 +434702504527118 +363517500960245 +106759358439183 +67357015927787 +357398168124745 +27430020565684 +256891762362185 +545734346470704 +508958161584669 +256831470930042 +543671596644688 +226613215914570 +365267169247370 +143877297437837 +353812949280019 +3895005289018 +405570199567921 +544846817875010 +418425393794310 +430665837011380 +102458724396620 +43770768000130 +136021892171152 +240246396459502 +477037985217113 +337328652973869 +481111160730227 +310508861676325 +144509323649075 +333387580033028 +143250601022636 +158267518145967 +34661237980711 +38528616677126 +526565972596028 +556222340139707 +278969115145675 +356137941858067 +145195723550206 +513789970058092 +242434218583591 +438486706664102 +548770245718373 +351862434936439 +495297857488712 +547148560152571 +34335024180235 +416658757520092 +368467766147937 +399302689052999 +67518331255299 +4019202025172 +488567676198819 +103976144643538 +556071358821241 +23891411421466 +525322930499935 +247770669638303 +151874628354158 +548665529786170 +116375577844876 +136506810380300 +154757447209221 +334776788778855 +159329832250887 +535141293776549 +275249592876833 +549744286732272 +72898113565889 +197216955312947 +226846021437832 +449416848195229 +237611491103432 +103346247930976 +207807126371939 +528657142787418 +571046711271 +557792911303366 +22619627827029 +150621659175039 +443527396465402 +396480056105212 +118045733488481 +389267424505955 +133901905495640 +438551255592745 +56979133405054 +365272492121712 +427881125009411 +177958517895805 +425157811786198 +480954817604208 +539474363220502 +266547301861654 +488039159707406 +358233743693465 +447639701430752 +185639217706592 +167208175884348 +295175513814538 +497240350759325 +246496187825975 +414047970388713 +25185980756065 +246245778519546 +362929601505053 +151235059844638 +520446031578988 +206030080072493 +151564953821399 +525194029618293 +369450524407589 +129396639012330 +275876665656323 +114117225945974 +385415130088548 +505848426150917 +257765422989778 +498798399431828 +59007860582157 +514260784362563 +468915172619545 +67352121900278 +146273824965592 +424779019280213 +323437587742519 +359454428505682 +83812736465162 +339898202729449 +396013522613740 +546037612798746 +536125986298003 +260361153705695 +240230844960021 +84085502858281 +324789179995334 +326754761514412 +223805530549562 +237146847097019 +186594584475058 +313499394372084 +104302567699651 +167489349794991 +258778069863877 +537227513237627 +95213251031246 +336850977369205 +367215012533810 +157013339681386 +475978347736936 +515946032452248 +545012685230167 +195391491161932 +111342533200762 +143749738584752 +513933638407437 +194899521506944 +36382828455799 +274164993468959 +25089318248308 +54443439212871 +340627699698822 +436497741711384 +184966775193719 +386249200343299 +314349429888231 +214888534550077 +379486467343968 +304963080280306 +21329885844734 +394317827059725 +175903028197701 +476463668595003 +64439112654339 +538171366580848 +42622556568583 +529849201933390 +7775396955587 +8360611567244 +242424473516216 +425104302837993 +299570849710439 +126169813691055 +495185603833603 +456278296220610 +191425394465359 +335997368993074 +313287347143828 +309426133169257 +293130784582998 +335374734770434 +159691925958258 +105993031055946 +376499006296856 +326160393279645 +147441679682264 +358456733306497 +395171835147976 +178084112197800 +466513737300590 +494955078214002 +93766390139486 +1080197280642 +355314625180389 +315093848180940 +112702927852697 +304245332831853 +149515693035145 +98077866816222 +111721679896057 +547382985558826 +440924245206304 +293137401658731 +189858382518659 +488004767827421 +535743369213340 +280863562187874 +126265304714963 +373772282963500 +527111047168547 +412522950543664 +354172374525121 +177940093269646 +133198374927723 +328208325811140 +374511079752324 +92433780081109 +414626765124316 +397241228479117 +364001889255381 +369906960506762 +151783270135262 +170750705400047 +3203783355516 +158012912534588 +416976871562171 +4375381809965 +116808296245294 +417314373280181 +469135069732508 +97420297479845 +87821757432808 +54394446570241 +14623955913456 +294216593461051 +43084297541170 +340494021386216 +360588896701388 +476827831980242 +248983311793489 +83921113556254 +443265846718327 +514348114434800 +177776687783072 +340232592358339 +397775490984331 +176982657631436 +2733443000125 +297577675780162 +90593131734446 +352970615366460 +3426743899713 +246173353803347 +535107215913105 +14594737273579 +509030668086068 +535674637243800 +17104806707765 +29532371959813 +238808089134047 +367356288981416 +441478593138103 +386626545665479 +341094938124573 +221129801778293 +110052627335468 +536649396631708 +323283290339183 +266465372536579 +82998221779092 +216708935607847 +422947638470867 +407579772457429 +224245164590380 +482678131169935 +272699398813841 +315013422698507 +538069879966894 +23255789303377 +35390960147875 +526288282828081 +415889570761231 +363841768689801 +85555025900010 +214839496947132 +549124463824506 +26924461050179 +26582591241389 +58082323590728 +329378453914543 +256868555299605 +50918159437233 +139804573757363 +278458399612091 +196410616977478 +53188414675342 +463886065368488 +220620334490470 +249553863404648 +206583880765639 +469002983902364 +7379487008746 +464634893742380 +253572459850670 +461511935193437 +84258211528148 +167751513053625 +457960992667463 +12574694083039 +145409778556459 +206262962655021 +415045536520316 +530893419182750 +180155884750788 +396553104179047 +307483045096659 +352225251943782 +458604371553255 +124371684266065 +275495716883970 +489021534538219 +325717068998637 +474923884788634 +46321416194636 +53809553308128 +47184072223373 +495365918563982 +436281074939529 +240423624822152 +91919719916407 +401078151082372 +243362623300803 +421657265732157 +545001600865263 +286830642156279 +153099100772483 +384200969357261 +138384683842929 +359641480171831 +225994477181592 +447188146176533 +158354958876421 +93418787219463 +42947419002715 +464980440538753 +475594901964866 +25430955456092 +232900766730810 +382581793156882 +545599446196832 +265142258611661 +79761264248491 +126118275186647 +159456150259477 +418508935712086 +456354788873768 +497128904608321 +178292911603523 +519029955037144 +142043551573774 +159056650960309 +245084489809551 +220199819550244 +519799765997056 +285990193328644 +280622260724175 +145471372109725 +309261579166411 +312319846923610 +136072246468211 +479279506457864 +297128739224106 +71372586536807 +48011116877175 +328597217715680 +385376644541741 +357685506654878 +487586361809575 +368969777978102 +477909389273307 +315515834973742 +456756398388003 +375096701985914 +366439721541026 +290797636198973 +63660287522212 +398070823658333 +105584823718003 +378088085133197 +303474129109902 +167375016090640 +320902207576787 +331540640286751 +427959766484667 +232698211623291 +478414083644492 +509827518467712 +22255576479438 +533866263465246 +338944642558679 +270189665649331 +304636764277785 +557062113390034 +355477690098162 +116606327683107 +383739232595420 +365664655663358 +223230776378807 +516135284490470 +193983329308152 +97165054235884 +427768969621038 +551718461205201 +28790463939255 +86969971124985 +357247894303719 +359269239212447 +174279963249525 +398185512576093 +206982870959748 +365944304489498 +237272730798646 +93668212156714 +25440033906280 +233197818950138 +519269479057762 +536457403326364 +159295728403582 +527928520346885 +500599597624136 +534976659497530 +535434475833834 +518303776798118 +420096694579271 +377501288662965 +226939870337501 +143685000975837 +76375182090976 +216368432550608 +424394214853791 +295948407320120 +16221340626338 +187776596495230 +466541914876486 +329653620056845 +30387147959890 +67651950361939 +37463715196794 +228242450944275 +76694574911018 +399043433709413 +470958935752568 +64481203215852 +49069477958994 +68514114637592 +214875324329857 +144508446789223 +338275991324538 +126323906828278 +475051872802319 +270460968315427 +277920909920086 +526881090454794 +174011088218004 +256806491463980 +228066384672592 +509832363134096 +155915081868821 +365293196957383 +29465737982747 +557735053236687 +325839150228369 +355297506016722 +28627978865000 +143982382537643 +68479417040280 +349340553274233 +202609370376508 +165502976930441 +447039508891605 +369893323992844 +73430406866069 +15778143381225 +207184834220621 +44355827308303 +288680228659485 +475648547887691 +124784434736168 +442993042622609 +133203202972607 +275928178759562 +499138650924781 +361122612863812 +233506518953662 +499753131604069 +315324011290606 +304094643266622 +6961197064426 +212207043154793 +247265937679279 +233021808277191 +296246260347904 +309617960852566 +317725018211381 +531244085841561 +102431250456517 +62115787464395 +303617114236759 +226497559746785 +54373523557075 +61599625521976 +519468631785677 +194637241721010 +82494298072170 +262937564549098 +527181874205634 +91533451338961 +42623497699099 +538874146809441 +258151733414885 +173623471580665 +314875968789773 +329389255853388 +169607935572146 +72620593184564 +46592282515546 +97782641229772 +456081986721724 +82147525786787 +30263438561683 +234287026278595 +296619564481696 +301516401568005 +359054688744269 +250628628599165 +517113758820394 +4856598037938 +178650792424154 +248562722288312 +233033860256464 +538772022247131 +164326342553328 +550343854949668 +360157023823769 +1803697288940 +4139409521558 +375957815341508 +112920260929310 +66574822935204 +62898818949285 +448126232201644 +203267906044629 +25127561812240 +306993490621537 +272368490968221 +58583345045064 +307570420230823 +521005005682681 +496569164006746 +167364294803209 +336740234064117 +250011710044489 +173927649656064 +21214849223624 +155047693029383 +365788530276941 +84686742981610 +41562968837517 +519123245958210 +545223282310866 +551856147116860 +3568177873238 +45182314995864 +374653755646870 +476984514643406 +147363072687684 +270835004458000 +137070781794557 +36487493917820 +327528227553610 +375423885360975 +178335107103962 +297728378740167 +461490959767418 +427972256361067 +263288523571949 +530666369819114 +432864042407375 +61347505177274 +387833629014600 +504447835968609 +232813626954897 +139068577742792 +161071422228044 +255696586938936 +312722202046362 +447426429365272 +266572142476009 +178145856260192 +534783027696494 +300960362793241 +22253337875323 +417551837111114 +270207762003517 +148438872224233 +25207797237573 +190904768850025 +416570736588329 +356239611309637 +426908122628713 +535131885265108 +92135671719027 +492493744957275 +34107221758520 +293097299371182 +286722048885489 +531575603231473 +394491833524300 +28958657533731 +66262825220072 +477908722836949 +515907423451483 +258682556346661 +58494159751536 +102618941361985 +496296646204996 +235699735991917 +252999061367931 +475544327112825 +398627388336384 +373369483778631 +443942272979090 +431700345117554 +98551855057802 +258141509527950 +468131639524608 +305667739994422 +529074007708754 +5433996995892 +447374280579752 +143328427212474 +442854184981197 +486373507111640 +158026508768433 +559035600712671 +245658488421511 +426505106474728 +517210578599628 +536886399834561 +133181695754500 +243190055516782 +44100169820085 +533069340236116 +2576773387598 +63370702051588 +270619157139047 +22719156110334 +458300796661398 +385260477534677 +358219875887338 +528291234443303 +386055801873205 +330590383129805 +400005565541506 +339652661530822 +363753546955840 +53798497709306 +395745899333004 +12813660463889 +510591307996218 +259051402893133 +303842965198320 +287875290471184 +424425993339438 +231617859374942 +431449045794595 +196946850882279 +287843491644802 +103130790266803 +339703691692853 +147997735422418 +36198175922710 +42724706286849 +455877804610941 +387797824521651 +35284838211976 +191105626749885 +475813775620685 +440511928132454 +75413717308806 +309551380325368 +455129251094598 +297964234612142 +20492108721380 +489080875566939 +288254690290919 +468002631409921 +195797228556832 +206530076968890 +47843574414090 +443276965363127 +145754631399248 +325655657717619 +488477480425089 +181614917906990 +541300136757641 +525917708491053 +76459113368445 +359765415500375 +253200263468554 +88669408642710 +268110002618670 +142463427282261 +339007609195248 +507245708094480 +168364347650724 +137935808178751 +220640201417000 +42640615459431 +223926652079500 +386650371662663 +306084521822111 +340148163129977 +19447311152225 +552343600374216 +282199244856959 +278700266920807 +207578071158674 +297628462534685 +78959904939554 +114965972740789 +48904590471980 +443335822541211 +5377873323069 +293657692555235 +532721868023316 +91634961308807 +66309579935597 +438582296375425 +367750739172580 +26059007562133 +215316331023675 +418753200645063 +168191204771992 +28271143822400 +82723847893415 +276609955236719 +5587367237445 +154748948746590 +343141077636919 +397253043203883 +269528085361621 +52569273267808 +1784630483602 +293332457764520 +465418830566226 +259923898296162 +468672750102118 +357364978201254 +136239537376212 +247576661337941 +486214617219118 +418944700198067 +389891232178666 +342426509401799 +265216471462061 +266946229916545 +390608819071508 +62683991552230 +208916523959165 +505124538859266 +197917389164686 +487197683372118 +275602622506350 +220212174568700 +287443110496364 +558378567416262 +226632988376411 +349284786332935 +406819983670704 +53817894562288 +139734150641470 +249526911232027 +145251006386217 +298228464319415 +76094038531447 +425083134330348 +374671243197967 +339112774679116 +304269942984181 +25994674453798 +167422347771715 +226275392254662 +465295279298423 +527846820982375 +557120761855068 +34691562941791 +365111833033794 +125184267874194 +156110285307803 +336944528404015 +327742760892993 +88142033831001 +122726957627630 +513410116454761 +411225386138675 +366754155214827 +400741371915853 +124339308548672 +398830059755914 +446611647956056 +338407133618954 +152717268595681 +114033705676349 +484542319558590 +393599666135150 +325468442200967 +166830597794835 +34062764171727 +112108488945249 +528523426224331 +224895569924662 +104410209131265 +346944333780107 +363858652470379 +506390192023755 +284063541095909 +480751804297958 +486358452093241 +424835072082171 +394857401601715 +274343917793566 +204608719741911 +470268886767181 +426972117505196 +357863271957764 +459186007641777 +396953698596250 +303964347368417 +497391235757859 +122958287901744 +528298007517825 +347319331039656 +56066570014582 +98346007673017 +476026266639962 +53588795383005 +118362083518747 +451125898238499 +497973357911290 +382627941481925 +61539671918503 +169332923613112 +407081695788058 +134146412827669 +366236842724572 +124301076903027 +354509799599427 +470730081291361 +315038813081682 +423126374041206 +562175975577227 +546155844299630 +172055115567500 +467979935802692 +477095960948691 +320287734547898 +517671686924416 +215330270196792 +44304803858588 +33874435811839 +33690166308501 +383547970564262 +361521559923460 +92212930860085 +419471330119113 +35091716240627 +325858018783643 +81962418291618 +250041659630052 +463593418093934 +396155055123252 +127406747768655 +129659273126033 +398857688725737 +304851311839439 +367230248335456 +215843172575172 +352773351151603 +365069262484863 +473050623221751 +307307192959242 +209803248493122 +273049794669286 +270633498407017 +125099654673982 +381163394756070 +275304476575387 +38410041523486 +250142010333023 +491399700800928 +513717466865705 +260343947860848 +309306888683545 +120042618766165 +21273028786202 +85653917497380 +68485675893536 +99279027972090 +126309282944030 +276940839813092 +56598869823346 +203457946950197 +173569818635104 +145189501665650 +207307193083270 +450888195298269 +538474123462493 +238002580549273 +537082966312831 +272423510362651 +153610318586730 +417989861029380 +286374187059498 +358433743942710 diff --git a/y2025/src/bin/d5.rs b/y2025/src/bin/d5.rs new file mode 100644 index 0000000..1c5f02b --- /dev/null +++ b/y2025/src/bin/d5.rs @@ -0,0 +1,27 @@ +use std::{fs, time::Instant}; + +use utils::time::get_elapsed_string; +use y2025::days::d5; + +fn main() { + let now = Instant::now(); + println!("Part 1:"); + part1(); + println!("Ran in {}", get_elapsed_string(now.elapsed())); + let now = Instant::now(); + println!("Part 2:"); + part2(); + println!("Ran in {}", get_elapsed_string(now.elapsed())); +} + +fn part1() { + let root = env!("CARGO_MANIFEST_DIR"); + let content = fs::read_to_string(format!("{root}/resources/5_input.txt")).unwrap(); + println!("{}", d5::process_part1(&content)); +} + +fn part2() { + let root = env!("CARGO_MANIFEST_DIR"); + let content = fs::read_to_string(format!("{root}/resources/5_input.txt")).unwrap(); + println!("{}", d5::process_part2(&content)); +} diff --git a/y2025/src/days/d5.rs b/y2025/src/days/d5.rs new file mode 100644 index 0000000..e0f97ff --- /dev/null +++ b/y2025/src/days/d5.rs @@ -0,0 +1,89 @@ +use itertools::Itertools; + +fn find_in_ranges(ranges: &[(i64, i64)], value: i64) -> Option<(i64, i64)> { + ranges + .iter() + .find(|(lower, upper)| *lower <= value && value <= *upper) + .copied() +} + +const DELIMITER: &str = "\n\n"; +pub fn process_part1(input: &str) -> i32 { + let pos = input.find(DELIMITER).unwrap(); + let (ranges, available) = input.split_at(pos); + let ranges = ranges + .lines() + .map(|line| line.split_once('-').unwrap()) + .map(|(lower, upper)| (lower.parse::().unwrap(), upper.parse::().unwrap())) + .collect_vec(); + let available = available + .lines() + .skip(2) + .map(|line| line.parse::().unwrap()) + .collect_vec(); + available + .iter() + .map(|ingredient| { + if find_in_ranges(&ranges, *ingredient).is_some() { + 1 + } else { + 0 + } + }) + .sum() +} + +pub fn process_part2(input: &str) -> i64 { + let pos = input.find(DELIMITER).unwrap(); + let (ranges, _available) = input.split_at(pos); + let mut ranges = ranges + .lines() + .map(|line| line.split_once('-').unwrap()) + .map(|(lower, upper)| (lower.parse::().unwrap(), upper.parse::().unwrap())) + .collect_vec(); + ranges.sort(); + let mut new_ranges: Vec<(i64, i64)> = Vec::new(); + new_ranges.push(ranges[0]); + for (lower, upper) in ranges.iter() { + let last_new_idx = new_ranges.len() - 1; + let (_last_lower, last_upper) = new_ranges[last_new_idx]; + if *lower <= last_upper + 1 && upper >= &last_upper { + new_ranges[last_new_idx].1 = *upper; + } else if *lower > last_upper + 1 { + new_ranges.push((*lower, *upper)); + } + } + new_ranges + .iter() + .map(|(lower, upper)| upper - lower + 1) + .sum() +} + +#[cfg(test)] +mod tests { + use super::*; + + const INPUT: &str = "3-5 +10-14 +16-20 +12-18 + +1 +5 +8 +11 +17 +32"; + + #[test] + fn part1() { + let result = process_part1(INPUT); + assert_eq!(result, 3); + } + + #[test] + fn part2() { + let result = process_part2(INPUT); + assert_eq!(result, 14); + } +} diff --git a/y2025/src/days/mod.rs b/y2025/src/days/mod.rs index 69d8311..5b5d285 100644 --- a/y2025/src/days/mod.rs +++ b/y2025/src/days/mod.rs @@ -5,3 +5,5 @@ pub mod d2; pub mod d3; pub mod d4; + +pub mod d5;