advent-of-code

Perserverance, or the lack thereof

git clone git://git.shimmy1996.com/advent-of-code.git
commit 040054052d4ae34c19d6d0cabfd515183af4a918
parent 555bb9e26b22625289fd09e6d6797d1965796a63
Author: Shimmy Xu <shimmy.xu@shimmy1996.com>
Date:   Wed, 15 Dec 2021 20:32:08 -0600

Add 2021 day 15

Diffstat:
A2021/day15/input.txt | 100+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A2021/day15/main.rs | 85+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 185 insertions(+), 0 deletions(-)
diff --git a/2021/day15/input.txt b/2021/day15/input.txt
@@ -0,0 +1,100 @@
+1947696975698896797929459993778378493663187915544561834986191836269969899167858897819699793994718987
+2311559817927999719999597987189844226139358211239975663924921992997751999137989799783998666847189117
+1398783175891937833687888598786896125883638881619291974159998891739786137969443961276399292284679298
+1799975998227669996115794797677699798175616958417287499395295199789322764647852198997299659859389619
+1739612118291539157254493162397155936981318995862379954635661973979239239969788818966686499766387398
+8719671599693942744933141579913498448999942189769767769727796927818765883586697625896957338688939595
+2796178218968711997834882837787524726852995959861184787996936352849434128388663893131285789869867179
+1317915348335592621751989478997918859522948897849669839469818925318165648989686591857953378291512297
+1917441697892979356516974994728598567293861181628838749943997155596868516192997995698976986999929371
+5849994149999983668899666755471964957888827868382391818789668871178857186118299899984319718818547999
+1858939984861235938958973189492499494194992452675713688286627988991934848921897684964578219133166893
+5776439827541299259274198171669552698119771981281496128578196275168739222452299429369829811861496499
+2931776597359576234168169379956899871919758688721864948334918341821841299995494661199995762869156991
+6289867119753899419197123896818739991327589369298748196458376848925564912321896787819694349929839298
+4997387711789873575455786193986389228961185892227229979178939244544847921296114415997191878689531627
+8897817989689288875783994178238956724749794811386839271317691993557997889383197977991247644713122658
+4813729998926163799795829927989966987647443825496186775588779436794595939819685969483895629779978994
+9982381691182111249924694648195956274292964886651799679999461587916412391111914863298296939289519326
+5518779882172129996799352736999989891351661978589977619474626595989979213281881181713962999638878749
+1169143672568917918812189529673989891989319993181689616698876527476668229991785129399132957998293929
+8932884767249667994824929985962599999446812717991922884965499769331385285883628677818991391979189591
+9766631975919747512817886897999329888498273594543699991277687617365818493923416969949395683731666999
+8689137997791238716357751996996932188896498564645962891656899188187886182198598949352147972939995981
+8756667515181197779916113191699889768119499489778999982987198759665998771867182286475992682119989186
+1124649829964624878299998991719216999531459818697398785544979997925391161972892999638319187263219291
+9857974935269921914969318391941987992868999696658881799996369929596587999955211159959539834844838938
+8919518179891539221114534928929998682984285713324169997579726187396989931396888199971975911197624343
+4198999483679799381891316193673681916999839397617888964187992886961894398798991629876949216948895886
+5192399967381999671189871735251138975778284959494189952999787338796649318699917846183585656874323596
+1893214972385815928898851749895568669919679168894679448588489979936994294173766495171795996837279798
+9925899897867776945988571695929419298879759819616189897989928981743763471116989379923999917866996988
+7898189849949524777471266525684394299191312497519521975217389687694742133287697195338979526643967962
+9615449115351624536799387998728899998781678539998641999545933534719891695719449897555887893629515822
+9967782543998623985849896599999912897986696167296354329331689299784671929929891989669362197688839989
+5967639211387841157996617492973348185229739299894428482889691838688742476486859868197983598966921825
+7374376999914646846159231981424471219993689182736894895911492781597795948896794286911974218168959688
+1996777211988193895413595213285949489968378779163387495998169499286948679138897132957778196186286879
+8581565398788646998527126155638497989663368989725257857989562264976191159879979912849223699948128541
+3599998922796929171999367932718549618454129935893613989956288834954647823429868649722282528769635169
+7965999579595347289122479263497282984879518915648699638853761299869992425182816839951699576669738439
+9497259397977683444889684985994631953896491966492184959179295719881915997916955981999124439848439919
+9299184895781751297379927729227697885499115954722224199369169378989721498692828999492272998762926182
+8899918997997499371887274979645481998679657997985273876598799769168969117892198614388378987917797485
+8888639479899578581818994935127972889989716962616949248999484633993729811567929469229125921919195922
+7412341947369985616487775891156912797213858175119775714813182782982441694221615772849179626271163979
+9713899969178972587129996911977194578919896659891975573995285858147979997544523995539599519929954373
+6977915961998959699139171198789946179721929991498551491999847478148232944999225846274848263749871969
+7938429293718924342299994228859372817167111995691968294347997689992799383971648733721911178997296112
+4718179195943598268197379998915778236975725765789985337768493125897931769569919116211139648687775539
+3187169444859797746988567791165913976863864173975559773797411998489129397742123295741349118153954252
+7743878683798777186899638785767783728999499991925419611637897819688137142944978799988422939887928872
+9529716867483494769988271913447999618299718513193799548497329269976619887381213997945835119595149998
+2119493423877341197391997989889828599881299199687322299193292396969114657449424183489412798998565996
+8579268797199219755999277788599798198959989783926929897378971367634898793216982158621495661631646996
+6381377477933896299924477362838647438119824946992939998353564984136993615423299987581558191799979519
+4284948959891866211159982231989583128991667559619912479935821379597939998881793996672694751391685419
+4271997567779892129695961889679529797699955298935611991393116929614329958133458557617126128737171975
+8924279138787698771271599787383219399699878481218367439786486976729865875688999719974592891991931129
+1968313888382783239491539891982969692611188184727363995581992416578489789999971887191895686866497961
+6819682575973959978791722829899225893892198376185283982796625566898698248986788471994875177797286633
+9987848869957999874963198739178572141271729926886697898157378897595998111491814996359777978135591911
+8295753397299818884346189266465389842998289999978131417948287838948683275626697995786722885399714179
+4159299297938377379499928398939358928119118498912227718798934986766315252625281777796575691241789157
+1932549925919993995995496562798279994659989319749888713254969999598989919674989394958732958676463995
+6516929358966191219219718536486198329523591968994882597281891198716816782728643297736984985991896791
+9667699479375153511788876976916698889981985289355894998232798185556258115791517819499535167998448779
+9182754699279987498847431286924977916798615881612933679988992599196459295988799917959819289939917357
+5995185897223987369289994168735877289928918688486816695794378882617846797889119245831139989861169777
+1919558599869961567591499919154298592898477398927649419859979599192511731998289569649669193569113849
+4999946839545648998489891966649619198219798999999999914187151712276975396157763411169696498869957861
+6289689397891392984985354697412929547898138862874899381561546592941246854928176476491796951999414774
+5652838889814579419859281827997499845991343981287281999299378517918618996719949696298312496439778619
+8398927129969385788911967691575591249119819485637541256534779912896664397798858922684487117588796791
+7861849932949588973793868992958969291986221198819918596158567837435458346119946219376154498731588755
+5493124289928195795516937184978949534987929879334213189453569461199679943999281876599997919794497891
+9999289438489936768495687178923887113991426158815881798943621849679698865918385748747549198896945196
+8329769676578863628791881283699954598381987222212959979488618852587529197619153796962699927717484239
+9487296468769179278286959945169598513174655785739971473592952723691273674755969691937916991393346952
+9411683765427277541128978945948779185769211693899298899969219797928988898587784915491518858848763988
+4174999933693277496789136899128898432995597886796394298149458879355336792996641869734917699868828977
+7828853373677139558387437918519944911824751833725979758971928474562189579766917561341888751644883128
+9944957631796893189549142471959197819965859979874371592689845268979576141939919872799592796897681978
+9129399759399864944997496561649469416722711829816839618967922198998944196191923796976124876598894711
+1984651621989673719839789412249992689133656682689896115183298557783399663916359928184233859817826192
+6747491896529965195479995582499576938291218158711891822699394479117975866839111928819987139962917979
+5862897881242992991697478793791189884133668915997495392975899615191727919733914659972679523966971891
+9989177777898175191124159959961821565185996187981771651916828189728186341115886299299282716795193914
+8594917468798751791997499796918998296468668394472199718429631939161593978764875719457714959199328597
+9971699893896568665199714839127299338839719637246871923899217816181864923749857618999197894993549475
+7453732369719421164219599913199692119997885891788498915336679921979737838398149748219899989951721172
+7795419181929159189156763936827178722398947294962661194194817349313848552459846299611933617899175511
+6452998586858979994398825783449369926689988998317949118939599699399391489738115999949299784992548996
+9558149995645639945478899819374918258599745978774328799577491834828698297964697221963783152673619218
+1898846289739195946913361269877398668671669969831811232867623929582214121581877169678689911847611953
+3389866271533776219379932895441898985239319472749732617688685138778937439175211298981167699614418877
+5981952512941958193593448279411963515259361829919999916618896939551988188889799945993187694576962655
+3381463186971948918531839533939811191699291588588992929191728587528918737888497916279526579853921937
+2947186951912279898383973859526182194614259992831699857959715873216595149977719857546897969994566694
+6599943861781981529974889474584753289169598547791967988964158798291811168499239339947159893217981248
+9881729689387519626589799227787849951152391998437917592378789299389591999991829988849718719962682192
diff --git a/2021/day15/main.rs b/2021/day15/main.rs
@@ -0,0 +1,85 @@
+fn main() {
+    let input = std::fs::read_to_string("input.txt")
+        .unwrap()
+        .trim()
+        .split('\n')
+        .map(|s| {
+            s.chars()
+                .map(|c| c.to_digit(10).unwrap())
+                .collect::<Vec<u32>>()
+        })
+        .collect::<Vec<Vec<u32>>>();
+    // 652
+    println!("Part 1: {}", part_1(&input));
+    // 2938
+    println!("Part 2: {}", part_1(&enlarge_map(&input)));
+}
+
+fn enlarge_map(risk: &Vec<Vec<u32>>) -> Vec<Vec<u32>> {
+    fn increase_risk(r: u32, inc: u32) -> u32 {
+        let mut r = r + inc;
+        while r > 9 {
+            r -= 9;
+        }
+        r
+    }
+
+    let x_max = risk.len();
+    let y_max = risk[0].len();
+    let mut risk = risk.clone();
+    for x in 0..x_max {
+        for inc in 1..5 {
+            for y in 0..y_max {
+                let new_risk = increase_risk(risk[x][y], inc);
+                risk[x].push(new_risk);
+            }
+        }
+    }
+    for inc in 1..5 {
+        for x in 0..x_max {
+            risk.push(risk[x].iter().map(|&r| increase_risk(r, inc)).collect());
+        }
+    }
+
+    risk
+}
+
+fn part_1(risk: &Vec<Vec<u32>>) -> u32 {
+    let x_max = risk.len();
+    let y_max = risk[0].len();
+
+    let mut cost = vec![vec![None; y_max]; x_max];
+    cost[0][0] = Some(0);
+    loop {
+        let mut updated = false;
+        for x in 0..x_max {
+            for y in 0..y_max {
+                for (dx, dy) in [(1, 0), (0, 1), (-1, 0), (0, -1)] {
+                    if ((x as i32) + dx >= 0 && (x as i32) + dx < x_max as i32)
+                        && ((y as i32) + dy >= 0 && (y as i32) + dy < y_max as i32)
+                    {
+                        match (
+                            cost[(x as i32 + dx) as usize][(y as i32 + dy) as usize],
+                            cost[x][y],
+                        ) {
+                            (Some(sub_cost), Some(old_cost)) => {
+                                if sub_cost + risk[x][y] < old_cost {
+                                    cost[x][y] = Some(sub_cost + risk[x][y]);
+                                    updated = true;
+                                }
+                            }
+                            (Some(sub_cost), None) => {
+                                cost[x][y] = Some(sub_cost + risk[x][y]);
+                                updated = true;
+                            }
+                            _ => (),
+                        }
+                    }
+                }
+            }
+        }
+        if !updated {
+            return cost[x_max - 1][y_max - 1].unwrap();
+        }
+    }
+}