From 96bb39095158d5ef134318deb4e85690c69f185d Mon Sep 17 00:00:00 2001 From: Ishan Jain Date: Fri, 9 Dec 2022 18:25:45 +0530 Subject: [PATCH] Day 9 solution with a grid --- inputs/input.txt | 2099 ++++++++++++++++++++++++++++++++++++++++++--- inputs/sample.txt | 13 +- src/main.rs | 296 +++++-- 3 files changed, 2250 insertions(+), 158 deletions(-) diff --git a/inputs/input.txt b/inputs/input.txt index c400166..bbd1f5c 100644 --- a/inputs/input.txt +++ b/inputs/input.txt @@ -1,99 +1,2000 @@ -020110220332333020110144320304042020444223003535441353331002333431100300241023221210123003331021020 -002120010112022233203323334422340102033151553341235324543343233301202102130210343113312320222102020 -000000000301021002423224442341031145215244543444223314545524515335404222310244314423023331200102012 -011200302010212334422213334343335452314532352111122533515334412241512412033340322004232020212310011 -110111200102310120411101020333232255345143342245212323552344535253214434143032323213200301101020121 -122001020113011314043121413025543341512335111452355331355351515421515411500421204113413212021112302 -011210211003201420103123304513544114145311452334355144111521441452154223512022101102111221311323311 -011030200312240341224434214241313322323544154242345656634321531531424124544551344224331443202111303 -031023120224010220144244342511241334331166432443322363352643453525244443222142533014331212133113031 -331033331100013013431114214253543323143222523423236646456363626622312534521454454123324132323233200 -313320023430241044213221132131122135436564345625426422255326234363243521151144414344130023210131130 -002203011410101343345413454143416333665335233566235623536644652644522345535525153521230411343303211 -022030323311323124542521154345356626352343324652424464566645425223224521453553252234321033403323130 -331222243010032043452454232565665256426536435254566436633323343652534544214412242551144312310221231 -231133233004211422411531255443363333555345434532475762623642433466363266634413551244254134333243030 -020231113200002214145443133533534653326664654474363645366343345466265644554325342415122332200024311 -311032340032414323451542554464466352256347635357637447736577667463426532442564245132242343241314212 -210342413212232542421452232234546643373633347344743377376553465333423522425436534352355150302110320 -012302042023135125251364365232626547463576733637455663764376436734352545425434331543241124042312202 -304042410233125532432523224245663443763753734647533535565636563665334542556665554245524241400402122 -100324144335411111343624365526556753335435457754653754663647544353454443256623466532421524442220212 -004310002315421423634565264237567445665436743333467647547754434765353667542365233361541321530411122 -340100133133254351662534562377644656735477678648447854646765556636735646456562322345353223545130204 -223422234555541234336653556365464346366386775667444744567758637737757667635354324626442355153142402 -301202352352311332364654446567354376644665887886878854847858588356564773766244445222614543212440041 -121010254322255546522625235356663453785775455846758588786788567566653645763532436352663334521520342 -223123122512444365553626454767563488464886467858877655766685458675437556363673526236645213411512224 -003314511142456453664565476333555654845565878476575468776548666885476777366354622652365442341232330 -100434351354142623236353735657745766665557455465675844665578767675874476556574642555262344222545124 -310035122251134332246455666547787878577677667587668567788744875844888844364453536232254344234442004 -332355524421462334544344655646458867688886798865795569865997666688465755335745555656646243433122421 -212252432545222565265377376368574784887787696558698987968675547855656555445333366624445325141553342 -113535121253534442546646364347455675758878676575695576785998796454646647555637657565266546254424513 -023531155256556443573534665476784478579889966685965558767695667786588646763565366352565623135242132 -332235311465633455637577656876574774599858977857599877979855878694546488485435736564352255345534352 -423312331346353345545646578646466549968669789766955768696578957665488458568376747735452426221223133 -042131555255526335474354376567744577697576655686887997959968659596857774864465577464334245541411144 -314335533542324633457667677854784879668896688676989899996875778858675674784535777333543532331142411 -342431321343652634443346854886679789759856968779866777899677797959996774647753365556465426225312415 -443122331352464374355445874586585857875568898788666678776787986756859447544446666763365552244452322 -434332122456323647344556476668759666569568769987679766689798887678765548587477474536465533643451422 -012515214225433447464677777487776597697976998888987789798887796967785955887765466437333665342324523 -151212435544622335634548655777875966867886867777679699887698988956977857868655457465635544364542154 -425332155643342656676678888575989888788767888899689899798688796666757955465858667777362363434424542 -531532414223243445466348848575895777968779899997887798776667989655588765447757447347342252524115215 -155245334655555376575664568856876978978787888977789987998877778796686666588544843473375333466131323 -442223263655353573545578848875879796997899897789887987979686977788898887848487563664644353624212355 -532342436423523433743374566649565796978689677778887988977986779775985585775684847364464225436344143 -144131162643455446377457566657777998676869667898877798979888978868889578745676553337663625625354412 -212531125562654464546354657756555595879978788779777999979988869895856856488587466676673534564554215 -515521136425625643733788668547967896969879989899779977888986996776697776777887634766746536654352314 -533115456346557773554457648785576555967877979777897997977979879979889786544548474557775226255314122 -432554142445363766476368787846679896977899887779797978979969889696765986666844737665565256236231155 -125253442625345476646468778468579567787976888987879797899978977695756855477657433457362446432521533 -451335344244435635354545558745856999567779868887799878899867977959975677866558447464563253543641554 -412221312464362643575387865576575778679997969899879799897898997777656968646646747476434353234412443 -132123436534443354553586484485777568678779897878779989966877968659558598445764456573762542646254544 -024143156436353736354736885476858987768978898698789976987668878886568974574565737457544455543452243 -413135313643263775675578866878568599957868689889887898688888897699957964455656556464353643525222353 -151155234625524455454576866886566769799886776697778986968676996687578554546778475347663665445441542 -225335432336665664467554464786765996688599897886876679899878795577796866847588643664352344525425543 -231314414363454365656445447648785668665699968677877867679686575989979554888874435546345632362455211 -215225154624264466667536475884866766856799777898688869799678789658958655666655664763723652345235254 -035354151466424636347656474544888889966575676978876877797665689589954588444647355553546242434541533 -001253252266442433343367457848868577696576876956987767987878766766685545864636355333223636351531525 -432114153244234344474473336455665467595685659677769775776598955788485844764764774633253355345153344 -440231335123622442356777766866685464699576999777998779679677676798556674878735743562224245652132511 -321533313113424533355576556587855784598797699998756887876998858868457756543476743664332364153212141 -003415211213442534357575744467674686668987887956977567898997789587764784753377657636326255155213240 -224445525333436434526743474634674544887785577959758998579798555487687877644644777665225554533252422 -114025431113445462556535777346657775747764689775588768859877487468477864653336547436625221413353402 -444431445545324552322733365535555774656466544687955795855665775645668663457547655566226341423452434 -410445115125126462226236353755455888548674587788447578688475766447586446763443644432535242233435244 -124340412535436432636663557555763744747854587474866557668648548584743443577534342355356535325312231 -200313132541126432532542747437536486654767558545587875558487658465577773437664544545354413212211212 -101333454545223643623655465756576356785656755457885765456674785763465474656725224222541315314114031 -131233142323341366245232435554365765545574774767785475776848668453355554474332533326544433554514201 -321411402434455156645353526473756763444567846554465464446465455445745336435566265254512531525210112 -030131034355454454644464565464475577344753366858566476585577545346763733342656446563454444451042420 -123233024345514531322525463344645673755773347575544437475656346736346777342352464432215452454013411 -014322323421235432556233655455544546633674634474456664346664375533773475562242423541545331424443423 -103044012005453352356343445634325645434337637364655565435774676736733553262634342435541343244030000 -320224321434222311444445623462256346445463567453434633465443337646352226626622452524224345304403330 -212420324020443535541356556336654222753455556557453353546474577342535554563532343321131244211234443 -122201202000423112251512562424625443344753367744337643545467743645523543344535431154212330403302410 -302200224224202341324112146243633653523426575646533673677763345633345645554351214352331400423031333 -123001320330302415435532414224224226352235334353577574436324344226425624263133551342153034141032032 -213131040401103044255424155325562642646633364323565455323646566426224245451451423431324433130343033 -231211142003310021532152553311226325626362465244625533422332633634454451545253314415220400420413203 -312320130422410131322514243524545532465435666446335525623552365342455442353243151122403024303312021 -133332233112042420435241253424143243654366264342464546256332442465235435334432132240241304411322221 -333302213333240222002452421142454145262355663455246362444253326353144344554554324413300122011222021 -202310030210410440001115535553444131333333663342464256255352255253344353414423520402213424030101331 -020120023231001430421410113431542415212332151336254445313532121145524443121220343020012020230032230 -210023323121322121303302233233245321224455333332343322323215223451525532222223304043001030230132022 -002222021003231011234340303045243412535411232132142332533521354111141433134004443142111110122121100 -022122131333022231003311233440122445251415343142141523345254553214425533033042143220401300010213100 -122110132221332212341431023220242412121544355542132225542445544553234342030402442141111321103231211 -122021200131211021314010312001241211235253115315252213451111223452204220130001212341202130012001221 +D 2 +R 1 +L 2 +U 1 +R 2 +L 2 +R 2 +L 1 +R 1 +L 1 +R 2 +L 2 +R 1 +D 2 +U 1 +R 1 +L 2 +U 2 +R 2 +U 2 +R 2 +D 1 +L 1 +U 1 +R 2 +L 1 +D 1 +U 1 +L 1 +U 1 +D 2 +U 1 +R 2 +U 1 +L 1 +D 1 +L 1 +U 1 +R 1 +L 1 +U 2 +L 2 +D 2 +L 2 +R 2 +U 1 +R 1 +U 2 +D 2 +R 2 +L 1 +R 1 +D 1 +U 2 +R 1 +L 1 +U 2 +L 2 +U 1 +L 2 +U 1 +R 1 +L 1 +D 2 +U 2 +R 2 +D 1 +R 1 +U 2 +R 2 +L 2 +U 1 +L 1 +D 2 +R 2 +L 1 +R 1 +D 1 +R 1 +L 1 +D 2 +R 1 +U 1 +L 1 +R 1 +L 1 +D 2 +L 1 +U 1 +R 1 +D 1 +R 1 +D 1 +L 2 +U 1 +D 1 +R 2 +D 2 +R 2 +L 2 +U 2 +L 1 +U 1 +L 1 +R 1 +L 1 +U 2 +L 2 +U 2 +L 1 +U 1 +D 1 +U 3 +R 2 +D 2 +R 1 +U 2 +L 2 +D 1 +U 1 +R 2 +U 3 +D 1 +L 3 +U 2 +D 2 +R 1 +D 1 +L 1 +D 2 +L 2 +U 1 +L 2 +R 3 +U 3 +L 1 +U 3 +L 1 +D 1 +U 3 +R 1 +U 3 +D 2 +L 3 +R 3 +L 2 +U 1 +D 1 +U 1 +L 1 +D 1 +R 2 +U 3 +D 3 +L 3 +R 1 +U 3 +D 1 +U 3 +L 1 +D 3 +R 3 +U 2 +D 1 +R 2 +U 1 +R 3 +U 1 +D 1 +U 1 +L 1 +R 3 +U 2 +D 3 +U 2 +R 2 +L 1 +D 3 +R 3 +L 2 +U 1 +L 2 +U 2 +R 3 +U 3 +D 2 +U 2 +D 3 +R 1 +D 1 +R 3 +D 1 +L 3 +R 2 +D 1 +L 1 +D 1 +L 3 +D 1 +L 3 +D 2 +L 2 +D 2 +R 1 +U 2 +D 1 +U 3 +L 3 +D 1 +R 3 +L 2 +D 2 +U 2 +R 1 +U 2 +R 3 +L 1 +R 3 +L 1 +D 1 +U 2 +L 3 +U 3 +R 2 +L 1 +R 2 +U 4 +R 1 +U 2 +L 2 +D 3 +U 1 +L 2 +U 1 +L 2 +D 3 +U 1 +D 3 +U 1 +D 3 +L 2 +R 1 +L 3 +R 2 +U 2 +L 2 +D 3 +L 2 +U 3 +R 4 +L 3 +D 4 +L 3 +U 2 +L 2 +U 4 +R 2 +D 4 +R 1 +D 4 +U 4 +D 3 +R 2 +D 4 +U 1 +D 4 +U 4 +R 2 +D 3 +R 4 +D 2 +L 2 +R 4 +L 1 +D 2 +U 4 +R 4 +U 4 +L 4 +U 2 +D 3 +L 3 +U 3 +R 1 +L 2 +D 2 +L 3 +R 2 +U 3 +D 4 +L 1 +D 4 +U 3 +L 3 +U 4 +D 1 +U 2 +D 4 +L 4 +D 3 +R 3 +U 1 +L 4 +D 2 +R 4 +U 4 +L 4 +U 3 +L 4 +R 3 +D 3 +L 1 +U 2 +R 1 +U 2 +D 3 +U 4 +L 1 +D 2 +U 1 +D 1 +L 1 +D 1 +U 1 +D 3 +L 1 +D 4 +L 2 +R 3 +L 2 +R 4 +L 4 +U 2 +R 3 +L 2 +D 3 +L 2 +U 2 +R 3 +U 1 +D 3 +U 5 +D 4 +U 3 +L 1 +D 4 +U 3 +D 2 +L 1 +R 3 +U 5 +L 5 +R 1 +D 2 +R 2 +D 3 +L 4 +D 4 +U 2 +D 3 +R 5 +D 3 +U 2 +D 4 +L 1 +D 5 +R 2 +D 1 +U 2 +L 1 +R 5 +U 4 +L 5 +D 2 +U 4 +D 5 +U 4 +L 4 +U 3 +D 2 +L 2 +R 2 +D 1 +U 1 +R 5 +L 3 +R 4 +D 5 +R 5 +D 4 +L 1 +R 2 +U 3 +R 5 +D 5 +R 3 +D 1 +R 3 +D 2 +U 4 +D 1 +U 5 +L 1 +U 3 +L 3 +D 1 +R 3 +U 1 +L 3 +R 2 +L 4 +R 4 +U 1 +D 5 +R 2 +L 5 +R 5 +U 3 +D 1 +R 4 +D 5 +L 5 +R 4 +U 5 +R 4 +D 3 +R 4 +D 2 +R 2 +U 1 +D 2 +L 1 +R 1 +L 3 +D 3 +L 5 +D 4 +R 5 +D 2 +L 5 +U 3 +R 3 +L 5 +U 3 +L 5 +R 5 +L 2 +U 4 +D 2 +R 1 +L 5 +R 1 +U 5 +L 2 +R 2 +U 6 +L 6 +U 2 +R 5 +U 3 +R 2 +D 3 +U 3 +D 1 +L 1 +U 2 +R 5 +L 1 +R 5 +D 6 +R 4 +L 4 +U 1 +R 3 +D 5 +U 3 +L 6 +U 1 +D 6 +R 6 +L 4 +R 4 +U 6 +R 6 +U 3 +R 6 +U 2 +R 6 +U 4 +R 2 +L 5 +U 2 +D 6 +L 4 +U 5 +L 4 +R 6 +L 1 +R 3 +L 3 +D 1 +L 5 +D 1 +L 5 +R 2 +D 3 +L 1 +U 6 +R 6 +U 2 +L 3 +R 4 +U 6 +R 3 +L 4 +U 1 +R 1 +D 1 +L 4 +D 6 +U 1 +R 2 +L 6 +U 3 +R 1 +L 1 +D 3 +R 1 +U 4 +D 2 +L 1 +D 3 +R 2 +D 5 +L 3 +R 6 +U 4 +D 4 +L 4 +U 2 +D 2 +L 4 +D 6 +U 5 +D 5 +R 6 +D 1 +L 4 +R 2 +U 3 +D 5 +R 4 +U 6 +R 4 +U 6 +L 7 +U 6 +D 1 +U 2 +D 6 +R 4 +U 7 +D 2 +L 6 +R 2 +U 7 +R 7 +L 1 +U 2 +L 5 +R 4 +L 7 +R 3 +D 5 +U 7 +D 4 +L 6 +U 5 +L 4 +D 2 +U 2 +D 2 +U 5 +R 7 +D 3 +U 3 +D 6 +U 4 +D 2 +R 6 +L 5 +U 3 +R 1 +D 7 +R 7 +U 4 +R 7 +U 2 +R 1 +L 4 +U 6 +L 1 +D 1 +U 3 +R 7 +U 1 +R 3 +L 3 +R 2 +U 6 +L 6 +D 7 +L 7 +R 3 +U 5 +L 5 +D 4 +L 7 +R 5 +U 7 +D 5 +R 2 +U 2 +L 4 +U 4 +D 5 +L 6 +R 3 +D 4 +U 3 +D 6 +L 5 +U 1 +L 4 +R 2 +L 2 +U 7 +R 4 +U 4 +L 4 +D 1 +U 1 +D 3 +U 3 +D 3 +R 6 +L 5 +R 6 +D 1 +U 4 +L 5 +U 2 +D 6 +L 1 +U 5 +D 5 +R 5 +D 1 +L 4 +D 2 +U 1 +R 3 +U 3 +L 3 +D 5 +U 2 +R 4 +U 1 +D 8 +R 2 +U 4 +L 4 +D 8 +R 2 +U 6 +D 4 +R 5 +U 4 +R 2 +L 2 +U 4 +D 8 +R 7 +L 5 +R 5 +U 6 +R 6 +U 7 +D 2 +U 6 +D 1 +R 5 +U 1 +D 6 +R 7 +L 1 +R 1 +D 1 +R 3 +D 8 +R 1 +U 2 +L 4 +R 4 +L 6 +R 2 +U 7 +R 1 +L 3 +D 1 +L 3 +U 7 +R 8 +L 7 +D 1 +R 1 +L 7 +D 7 +U 5 +D 5 +L 1 +U 7 +D 7 +R 5 +D 5 +U 5 +R 6 +L 8 +R 6 +L 1 +R 3 +D 1 +L 2 +U 7 +R 5 +L 4 +U 3 +L 6 +U 6 +R 6 +L 4 +U 6 +R 5 +U 2 +R 7 +U 8 +R 5 +U 2 +R 4 +L 5 +R 1 +D 4 +L 8 +R 3 +L 2 +U 7 +R 4 +L 6 +R 5 +U 2 +L 3 +D 8 +R 8 +D 7 +L 4 +D 4 +R 6 +L 7 +U 8 +L 5 +R 4 +D 4 +R 8 +D 2 +L 7 +D 6 +U 3 +L 4 +R 6 +U 8 +L 2 +R 6 +L 7 +U 4 +L 3 +D 2 +R 8 +U 3 +D 2 +U 5 +R 7 +D 7 +L 6 +U 8 +D 6 +U 5 +D 6 +U 2 +L 7 +R 4 +L 9 +R 2 +U 3 +R 7 +U 6 +L 3 +U 8 +L 9 +U 5 +R 1 +L 5 +D 5 +R 8 +L 3 +U 1 +L 2 +D 5 +U 1 +D 8 +U 5 +D 7 +L 9 +U 6 +D 4 +R 5 +U 3 +L 1 +D 9 +R 4 +D 7 +U 2 +R 2 +D 4 +L 2 +U 9 +R 7 +U 1 +R 2 +D 7 +R 3 +D 6 +L 7 +U 5 +R 9 +U 4 +L 7 +R 5 +U 7 +L 4 +D 4 +R 9 +D 5 +L 5 +D 1 +R 2 +D 6 +L 8 +U 8 +L 6 +D 7 +L 5 +U 2 +L 3 +D 9 +U 8 +D 3 +L 8 +R 2 +D 7 +R 5 +D 3 +U 1 +R 3 +L 9 +U 3 +D 2 +L 4 +D 7 +R 8 +U 7 +D 5 +U 5 +R 7 +L 8 +D 7 +L 7 +D 8 +U 5 +R 9 +U 10 +R 5 +U 6 +R 7 +D 9 +L 2 +R 1 +D 2 +R 9 +L 4 +U 4 +R 5 +D 9 +U 4 +L 7 +D 9 +L 4 +D 4 +L 10 +U 9 +L 8 +R 10 +U 9 +L 10 +U 2 +R 8 +L 2 +D 6 +R 1 +D 1 +L 5 +U 2 +R 9 +U 2 +R 1 +U 1 +L 6 +D 1 +R 2 +D 10 +L 7 +R 2 +U 7 +D 4 +R 9 +L 7 +D 8 +U 5 +R 10 +L 10 +D 2 +U 2 +R 8 +U 9 +D 1 +R 2 +L 10 +U 5 +R 8 +L 7 +D 1 +R 7 +D 3 +U 8 +L 4 +D 3 +U 4 +R 5 +U 9 +R 10 +U 3 +R 10 +L 6 +R 5 +U 8 +D 9 +R 4 +U 9 +L 1 +U 7 +R 4 +U 2 +L 7 +D 9 +U 8 +L 7 +U 8 +L 3 +R 7 +D 7 +L 7 +D 6 +L 2 +D 5 +U 4 +R 8 +L 6 +R 7 +D 4 +U 10 +L 8 +R 10 +D 2 +R 1 +U 7 +L 5 +R 5 +L 10 +D 5 +R 10 +U 7 +L 7 +R 9 +D 2 +L 8 +R 11 +D 4 +R 6 +L 5 +R 8 +U 1 +L 6 +U 3 +L 1 +D 10 +L 9 +D 3 +U 10 +L 9 +U 8 +D 11 +U 11 +L 1 +R 2 +U 1 +L 3 +U 2 +D 1 +U 4 +R 6 +L 6 +R 7 +L 9 +R 8 +L 4 +D 11 +L 4 +U 10 +D 6 +L 10 +U 2 +R 3 +L 10 +D 5 +L 1 +D 2 +R 6 +U 2 +L 2 +U 9 +R 10 +L 4 +D 2 +R 10 +L 5 +U 2 +L 1 +D 6 +L 4 +U 5 +D 8 +U 11 +D 5 +U 10 +L 8 +R 5 +L 6 +R 5 +L 2 +R 7 +D 4 +L 9 +D 2 +R 11 +D 5 +U 6 +D 2 +L 4 +R 9 +L 2 +D 5 +R 2 +D 9 +R 8 +L 3 +U 8 +R 9 +D 8 +R 4 +D 5 +U 7 +D 7 +R 4 +D 10 +L 1 +D 5 +U 11 +L 11 +U 11 +L 10 +U 9 +L 6 +D 4 +R 6 +D 8 +U 6 +D 11 +R 2 +U 9 +L 6 +U 5 +R 10 +D 8 +L 9 +R 8 +D 6 +L 8 +D 12 +U 2 +R 1 +L 1 +U 1 +R 6 +D 3 +U 6 +D 5 +R 9 +L 12 +U 7 +R 6 +L 9 +U 1 +R 12 +D 11 +R 6 +U 11 +D 4 +L 2 +R 12 +U 5 +R 3 +U 11 +D 6 +U 9 +L 10 +U 2 +L 9 +U 9 +R 6 +L 12 +D 2 +U 10 +R 3 +U 12 +L 12 +R 4 +L 11 +D 1 +L 3 +D 11 +U 5 +D 1 +U 12 +L 12 +U 5 +R 8 +L 1 +D 1 +L 3 +U 1 +R 4 +D 4 +L 6 +R 11 +U 11 +D 2 +U 7 +L 3 +D 3 +R 10 +D 1 +U 8 +D 7 +U 6 +L 10 +R 3 +L 6 +D 10 +L 2 +U 6 +D 8 +R 2 +L 5 +U 1 +D 5 +U 10 +D 5 +L 7 +U 3 +R 6 +D 2 +U 5 +D 10 +L 5 +D 2 +R 9 +L 11 +D 3 +L 6 +R 11 +U 10 +L 12 +D 12 +U 8 +D 5 +R 1 +L 6 +D 11 +U 12 +R 11 +D 12 +L 5 +D 7 +R 10 +U 4 +L 1 +R 3 +U 9 +L 13 +U 8 +R 3 +D 4 +R 8 +D 3 +R 8 +D 13 +U 1 +R 12 +U 12 +L 8 +R 5 +D 1 +U 3 +R 9 +D 6 +U 11 +R 3 +D 12 +R 8 +L 6 +D 8 +U 6 +R 13 +L 10 +U 6 +R 5 +L 11 +U 9 +L 12 +R 8 +L 6 +R 3 +D 12 +L 9 +D 3 +U 5 +L 6 +R 7 +L 13 +D 4 +R 7 +U 5 +D 13 +R 4 +U 11 +D 8 +R 5 +D 5 +U 3 +L 6 +U 4 +R 8 +D 8 +U 9 +L 8 +U 2 +R 7 +L 2 +U 1 +D 12 +R 3 +L 2 +R 8 +D 4 +L 7 +R 8 +D 6 +U 10 +R 7 +L 9 +D 5 +R 12 +U 2 +R 10 +U 4 +L 13 +R 9 +L 12 +U 3 +R 10 +U 3 +L 8 +R 12 +U 8 +R 11 +U 5 +L 3 +D 10 +R 8 +D 4 +R 4 +U 9 +L 13 +U 5 +R 11 +L 12 +U 11 +D 9 +L 5 +R 13 +U 2 +L 1 +U 12 +R 13 +L 1 +R 2 +U 6 +R 12 +D 11 +L 8 +U 13 +L 14 +U 13 +L 3 +U 9 +L 10 +R 11 +D 6 +U 8 +D 11 +U 5 +L 11 +U 8 +L 3 +R 2 +D 11 +L 12 +U 14 +R 3 +D 1 +U 14 +R 7 +D 14 +R 4 +D 5 +L 13 +R 2 +L 13 +U 8 +L 7 +D 14 +L 2 +U 13 +D 2 +L 13 +D 13 +U 5 +L 12 +U 3 +L 6 +D 2 +U 3 +L 9 +D 14 +R 3 +L 1 +R 6 +D 3 +U 6 +D 9 +L 5 +D 11 +L 1 +D 11 +L 9 +D 8 +U 13 +D 4 +R 5 +D 14 +L 10 +U 14 +D 14 +R 1 +L 8 +U 5 +D 11 +U 8 +D 14 +L 4 +D 13 +U 13 +R 6 +U 11 +L 9 +U 6 +D 11 +R 11 +U 11 +D 14 +R 6 +L 13 +U 1 +R 11 +L 9 +R 11 +L 4 +R 14 +L 2 +D 14 +R 3 +U 9 +D 6 +U 12 +R 7 +U 9 +L 4 +D 9 +R 11 +L 9 +R 14 +L 12 +U 1 +L 10 +U 7 +R 13 +D 3 +R 8 +L 4 +R 4 +L 3 +U 1 +R 14 +D 4 +R 9 +U 3 +L 12 +U 11 +R 5 +U 4 +L 11 +D 14 +L 12 +R 7 +L 15 +R 14 +D 12 +U 10 +R 11 +D 9 +U 14 +R 5 +D 13 +L 14 +D 9 +U 1 +R 10 +U 15 +R 12 +D 13 +L 9 +R 9 +U 8 +R 2 +U 3 +R 3 +D 8 +U 14 +R 4 +L 7 +U 11 +D 6 +L 14 +D 6 +R 8 +U 8 +R 5 +L 13 +R 9 +D 6 +R 6 +L 9 +U 2 +R 13 +U 4 +D 9 +U 14 +R 15 +D 2 +R 6 +D 7 +L 3 +U 14 +D 5 +U 13 +R 8 +D 15 +U 3 +R 9 +D 10 +R 11 +U 12 +D 8 +R 3 +L 5 +D 15 +L 1 +U 6 +R 15 +D 1 +R 13 +D 1 +U 2 +R 15 +D 3 +L 4 +U 9 +D 1 +L 13 +R 11 +U 15 +R 5 +U 15 +R 13 +L 5 +U 2 +R 5 +D 11 +U 11 +L 12 +D 15 +R 11 +L 7 +D 2 +L 11 +D 2 +L 7 +U 7 +R 5 +D 8 +R 6 +L 10 +U 5 +R 3 +U 7 +R 1 +U 7 +L 5 +U 11 +R 14 +U 9 +D 8 +R 10 +L 9 +R 11 +U 6 +R 14 +U 16 +D 13 +U 16 +L 1 +D 2 +R 13 +D 11 +U 9 +R 4 +L 11 +U 2 +L 7 +R 2 +U 14 +L 11 +R 10 +L 1 +R 15 +U 9 +L 16 +R 11 +D 15 +U 10 +L 7 +R 9 +L 9 +D 16 +U 7 +D 10 +R 11 +L 3 +R 16 +L 6 +R 7 +L 7 +R 13 +L 5 +R 6 +D 15 +R 11 +D 7 +U 5 +D 11 +U 13 +R 13 +U 12 +D 10 +L 11 +D 10 +R 6 +U 10 +D 9 +U 1 +L 13 +U 13 +L 11 +U 15 +L 7 +R 2 +D 2 +U 9 +D 1 +L 15 +U 6 +D 3 +U 7 +D 6 +L 6 +U 14 +L 3 +U 16 +L 8 +D 8 +R 4 +D 1 +U 13 +L 4 +U 1 +R 15 +U 3 +D 6 +L 4 +D 12 +L 16 +D 7 +U 10 +L 3 +R 6 +L 12 +R 9 +D 1 +U 7 +L 14 +D 5 +U 15 +D 14 +L 5 +R 6 +D 4 +U 10 +L 17 +R 9 +D 1 +R 12 +U 17 +R 14 +U 4 +R 14 +U 2 +D 13 +R 6 +L 12 +D 10 +L 9 +D 17 +R 14 +D 12 +L 5 +D 17 +L 8 +U 16 +D 9 +U 7 +L 11 +R 13 +U 2 +D 15 +R 2 +L 5 +U 6 +L 5 +U 15 +D 13 +U 17 +R 17 +L 4 +U 17 +R 1 +D 16 +L 16 +R 7 +U 14 +L 3 +D 12 +L 2 +D 6 +R 10 +U 11 +R 8 +D 8 +U 3 +R 5 +U 12 +D 5 +U 14 +R 13 +U 12 +R 1 +U 4 +D 12 +L 6 +R 8 +D 9 +U 4 +D 16 +L 4 +D 7 +L 2 +U 13 +L 7 +D 16 +U 1 +D 14 +U 14 +L 10 +U 2 +D 11 +L 5 +D 14 +U 14 +L 11 +R 17 +D 3 +R 7 +D 6 +R 17 +D 4 +R 14 +L 7 +U 17 +L 6 +D 7 +L 9 +U 10 +L 4 +D 1 +L 17 +R 4 +D 13 +L 4 +D 9 +U 12 +L 6 +R 18 +L 8 +R 16 +L 14 +D 9 +L 18 +D 2 +U 4 +D 7 +R 8 +D 13 +L 17 +U 3 +D 10 +R 10 +L 13 +D 15 +L 14 +D 11 +R 7 +L 3 +R 17 +U 13 +R 14 +D 5 +L 12 +U 4 +R 17 +D 2 +U 7 +R 9 +U 16 +L 18 +D 13 +R 6 +D 8 +L 18 +D 7 +L 11 +R 9 +U 18 +L 10 +U 11 +D 10 +L 7 +D 9 +R 17 +L 4 +R 2 +U 1 +D 9 +U 16 +D 1 +U 5 +R 9 +U 13 +D 10 +U 10 +L 5 +D 1 +U 11 +L 3 +D 15 +U 2 +R 15 +D 1 +L 15 +R 16 +U 14 +L 9 +D 4 +R 15 +L 9 +U 6 +L 4 +R 13 +U 17 +D 6 +L 14 +D 18 +L 17 +D 2 +L 12 +D 11 +R 14 +U 3 +R 12 +L 9 +R 14 +L 16 +U 14 +L 9 +D 1 +L 7 +D 2 +R 2 +L 18 +D 3 +L 10 +D 15 +L 14 +U 11 +L 11 +D 3 +L 4 +R 14 +D 11 +R 8 +D 8 +L 2 +U 15 +L 15 +D 6 +U 1 +D 19 +U 5 +L 5 +U 17 +D 6 +R 5 +L 10 +R 19 +D 9 +R 12 +L 10 +R 1 +L 17 +U 14 +L 1 +D 1 +U 14 +D 14 +L 8 +D 10 +U 12 +L 18 +U 3 +D 17 +U 4 +L 13 +D 3 +R 16 +U 7 +R 19 +U 14 +D 7 +R 15 +L 19 +R 15 +U 11 +L 9 +U 15 +D 16 +U 3 +L 10 +U 1 +D 4 +U 13 +R 7 +U 15 +D 13 +R 18 +L 4 +U 11 +D 3 +L 14 +R 9 +L 8 +R 8 +U 10 +R 17 +L 16 +U 17 +D 15 +U 8 +D 5 +L 8 +R 9 +D 12 +L 2 +U 19 +L 11 +R 18 +D 14 +R 6 +D 4 +L 3 +D 15 +L 3 +R 1 +U 4 +L 6 +U 14 +L 18 +D 13 +R 12 +U 4 +L 12 +U 15 +L 15 +D 2 +L 13 +R 15 +L 3 +U 13 +R 6 +D 1 +U 12 +D 19 +U 10 +L 13 +D 9 +L 18 +U 3 +D 13 +U 2 +L 10 +D 18 +U 16 +D 9 +U 12 diff --git a/inputs/sample.txt b/inputs/sample.txt index 16d6fbd..9874df2 100644 --- a/inputs/sample.txt +++ b/inputs/sample.txt @@ -1,5 +1,8 @@ -30373 -25512 -65332 -33549 -35390 +R 4 +U 4 +L 3 +D 1 +R 4 +D 1 +L 5 +R 2 diff --git a/src/main.rs b/src/main.rs index 95326bf..82a5b4f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,7 @@ #![feature(byte_slice_trim_ascii)] #![feature(test)] +use std::time::Duration; + extern crate test; const INPUTS: [&[u8]; 2] = [ @@ -7,79 +9,265 @@ const INPUTS: [&[u8]; 2] = [ include_bytes!("../inputs/input.txt"), ]; -fn parse(input: &[u8]) -> [[u8; N]; M] { - let mut out = [[0; N]; M]; - input - .trim_ascii() - .split(|&c| c == b'\n') - .enumerate() - .for_each(|(i, line)| { - line.iter().enumerate().for_each(|(j, &v)| { - out[i][j] = v; - }) - }); +#[derive(Debug)] +enum Move { + R(usize), + L(usize), + U(usize), + D(usize), +} - out +type Knot = u16; + +const EMPTY: Knot = 0; +const POUND: Knot = 1 << 1; +const HEAD: Knot = 1 << 2; +const ONE: Knot = 1 << 3; +const TWO: Knot = 1 << 4; +const THREE: Knot = 1 << 5; +const FOUR: Knot = 1 << 6; +const FIVE: Knot = 1 << 7; +const SIX: Knot = 1 << 8; +const SEVEN: Knot = 1 << 9; +const EIGHT: Knot = 1 << 10; +const NINE: Knot = 1 << 11; + +#[inline] +const fn knot_from_idx(i: usize) -> Knot { + match i { + 0 => ONE, + 1 => TWO, + 2 => THREE, + 3 => FOUR, + 4 => FIVE, + 5 => SIX, + 6 => SEVEN, + 7 => EIGHT, + 8 => NINE, + _ => unreachable!(), + } +} + +#[inline] +fn contains_knot(k1: &Knot, k2: Knot) -> bool { + k1 & k2 > 0 +} + +fn set(grid: &mut [[Knot; GRIDX]; GRIDY], (ix, iy): (usize, usize), knot: Knot) { + match grid[iy][ix] { + EMPTY | POUND | HEAD => grid[iy][ix] = knot, + _ => grid[iy][ix] |= knot, + } +} + +fn unset(grid: &mut [[Knot; GRIDX]; GRIDY], (ix, iy): (usize, usize), knot: Knot) { + grid[iy][ix] &= !knot; +} + +fn parse(input: &[u8]) -> impl Iterator + '_ { + input.trim_ascii().split(|&c| c == b'\n').map(|line| { + let (a, b) = line.split_at(1); + + let b = b + .iter() + .skip(1) + .fold(0, |a, x| (a * 10) + (x - b'0') as usize); + + match &a { + [b'R'] => Move::R(b), + [b'L'] => Move::L(b), + [b'U'] => Move::U(b), + [b'D'] => Move::D(b), + + _ => unreachable!(), + } + }) } fn main() { - let output = parse::<5, 5>(INPUTS[0]); - let score = solution::<5, 5>(output); - println!("{}", score); - - let output = parse::<99, 99>(INPUTS[1]); - let score = solution::<99, 99>(output); - println!("{}", score); + for input in INPUTS.iter() { + let output = parse(input); + let score = solution(output); + println!("{}", score); + } } -fn solution(input: [[u8; N]; M]) -> usize { - let mut answer = 0; +const GRIDX: usize = 300; +const GRIDY: usize = 350; - for j in 0..N { - for i in 0..M { - let th = input[i][j]; +fn solution(input: impl Iterator) -> usize { + let mut grid = [[EMPTY; GRIDX]; GRIDY]; + let sx = 50; + let sy = 300; + grid[sy][sx] = HEAD | ONE | TWO | THREE | FOUR | FIVE | SIX | SEVEN | EIGHT | NINE; + let (mut sxh, mut syh) = (sx, sy); + let (mut sxt, mut syt) = (sx, sy); - let mut counts = [0, 0, 0, 0]; - for &v in input[i][0..j].iter().rev() { - counts[0] += 1; - if v >= th { - break; - } - } + let mut tmoves = [[false; GRIDX]; GRIDY]; - for &v in &input[i][j + 1..N] { - counts[1] += 1; - if v >= th { - break; - } - } + for mmove in input { + unset(&mut grid, (sxh, syh), HEAD); + let (steps, (dsxh, dsyh)): (usize, (i32, i32)) = match mmove { + Move::R(v) => (v, (1, 0)), + Move::L(v) => (v, (-1, 0)), + Move::U(v) => (v, (0, -1)), + Move::D(v) => (v, (0, 1)), + }; + for _ in 0..steps { + unset(&mut grid, (sxh, syh), HEAD); + sxh = (sxh as i32 + dsxh) as usize; + syh = (syh as i32 + dsyh) as usize; + set(&mut grid, (sxh, syh), HEAD); - for row in input[0..i].iter().rev() { - counts[2] += 1; - if row[j] >= th { - break; - } - } + (sxt, syt) = move_tail((sxh, syh), (sxt, syt), &mut grid, knot_from_idx(0)); - for row in &input[i + 1..M] { - counts[3] += 1; - if row[j] >= th { - break; - } - } - - answer = std::cmp::max(answer, counts[0] * counts[1] * counts[2] * counts[3]); + tmoves[syt][sxt] = true; } } + tmoves + .into_iter() + .flat_map(|c| c.into_iter().map(|a| a as usize)) + .sum() +} - answer +fn print_grid(grid: &[[Knot; GRIDX]; GRIDY]) { + print!("{esc}[2J{esc}[1;1H", esc = 27 as char); + + let mut out = String::new(); + + for row in grid.iter() { + out.push_str(&row.iter().map(print_knot).collect::()); + out.push('\n'); + } + + println!("{}", out); + + std::thread::sleep(Duration::from_millis(10)); +} + +fn print_knot(c: &Knot) -> char { + match c { + &HEAD => 'H', + &ONE => '1', + &TWO => '2', + &THREE => '3', + &FOUR => '4', + &FIVE => '5', + &SIX => '6', + &SEVEN => '7', + &EIGHT => '8', + &NINE => '9', + v if contains_knot(v, HEAD) => 'H', + v if contains_knot(v, NINE) => '9', + v if contains_knot(v, EIGHT) => '8', + v if contains_knot(v, SEVEN) => '7', + v if contains_knot(v, SIX) => '6', + v if contains_knot(v, FIVE) => '5', + v if contains_knot(v, FOUR) => '4', + v if contains_knot(v, THREE) => '3', + v if contains_knot(v, TWO) => '2', + v if contains_knot(v, ONE) => '1', + &POUND => '#', + _ => '.', + } +} + +#[inline] +const fn knot_head(c: Knot) -> Knot { + match c { + EMPTY | HEAD | POUND => unreachable!(), + ONE => HEAD, + TWO => ONE, + THREE => TWO, + FOUR => THREE, + FIVE => FOUR, + SIX => FIVE, + SEVEN => SIX, + EIGHT => SEVEN, + NINE => EIGHT, + _ => unreachable!(), + } +} + +fn move_tail( + (sxh, syh): (usize, usize), + (sxt, syt): (usize, usize), + grid: &mut [[Knot; GRIDX]; GRIDY], + c: Knot, +) -> (usize, usize) { + if sxh == sxt && syh == syt { + return (sxt, syt); + } + + // Present at a diagonal? Return + // Attached to Head? Return + if [ + (-1, -1), + (0, -1), + (1, -1), + (-1, 0), + (1, 0), + (-1, 1), + (0, 1), + (1, 1), + ] + .iter() + .map(|(a, b)| grid[(syt as i32 + a) as usize][(sxt as i32 + b) as usize]) + .any(|x| contains_knot(&x, knot_head(c))) + { + return (sxt, syt); + } + + match ((sxh, syh), (sxt, syt)) { + ((sxh, syh), (sxt, syt)) if syh == syt => { + let dx: i32 = if sxh < sxt { -1 } else { 1 }; + + unset(grid, (sxt, syt), c); + set(grid, ((sxt as i32 + dx) as usize, syt), c); + + ((sxt as i32 + dx) as usize, syt) + } + + ((sxh, syh), (sxt, syt)) if sxh == sxt => { + let dx: i32 = if syh < syt { -1 } else { 1 }; + unset(grid, (sxt, syt), c); + set(grid, (sxt, (syt as i32 + dx) as usize), c); + (sxt, (syt as i32 + dx) as usize) + } + ((sxh, syh), (sxt, syt)) if syh < syt && sxh > sxt => { + unset(grid, (sxt, syt), c); + set(grid, (sxt + 1, syt - 1), c); + + (sxt + 1, syt - 1) + } + ((sxh, syh), (sxt, syt)) if syh < syt && sxh <= sxt => { + unset(grid, (sxt, syt), c); + set(grid, (sxt - 1, syt - 1), c); + + (sxt - 1, syt - 1) + } + ((sxh, syh), (sxt, syt)) if syh >= syt && sxh > sxt => { + unset(grid, (sxt, syt), c); + set(grid, (sxt + 1, syt + 1), c); + + (sxt + 1, syt + 1) + } + ((sxh, syh), (sxt, syt)) if syh >= syt && sxh <= sxt => { + unset(grid, (sxt, syt), c); + set(grid, (sxt - 1, syt + 1), c); + + (sxt - 1, syt + 1) + } + + _ => (0, 0), + } } #[bench] fn solution_bench(b: &mut test::Bencher) { - let input = parse::<99, 99>(INPUTS[1]); b.iter(|| { - let result = solution::<99, 99>(input); + let input = parse(INPUTS[1]); + let result = solution(input); test::black_box(result); }) }