From 008ac5a5d958c5132aae627555a172cb8cc31f0b Mon Sep 17 00:00:00 2001 From: Eric Mertens Date: Sat, 16 Dec 2023 21:45:05 -0800 Subject: [PATCH] 2023-17 --- inputs/2023/17.txt | 141 ++++++++++++++++++++++++++++++++++++++ solutions/solutions.cabal | 7 +- solutions/src/2023/17.hs | 84 +++++++++++++++++++++++ 3 files changed, 231 insertions(+), 1 deletion(-) create mode 100644 inputs/2023/17.txt create mode 100644 solutions/src/2023/17.hs diff --git a/inputs/2023/17.txt b/inputs/2023/17.txt new file mode 100644 index 0000000..3d5f261 --- /dev/null +++ b/inputs/2023/17.txt @@ -0,0 +1,141 @@ +131445551112233253211343462645362264333536364313674124314476621242354636547511555665246535766355535443144555253111262426511545413534355213143 +233424145115554544563536623551634234245245226647466342141335242732317413264173727553773417346271273452636214526231261626636515443114231334134 +142542344522223413612323412633411265511751721337441417257213276727474627134235456623341427634774763161362433662654321313511364221333134444545 +215325514111432316211413445125445152444115313243425213457743777551554161363342731541663254115427451521737561133533312121462215531232432435315 +451531341324135344542462126654325246235214355273527352517361157226542614511154755512673466615546552747525176152644433635456345422344511151123 +215214311432112444653362515334123237613537445736667574453555324626246274545121327374666676161332514434747162764221426162366535531234123343531 +344225212315513143216351651545632454522671676741355321433133117626761337161853414372767277524472641632243715222512245552455156241132412343151 +211421311242516661344451465655256575153642122434145162143353276585528121454215786472232636762241645671716135454142224264423524643261324145253 +422224122513333565366446446451622346152571416715331314462357473333243546322312334341837777564363611633652273345267755152462645612415312452451 +323555211414345663143154111422451757527234163331314532465854148818126576621281224168626267882445242246726237774412646656663632541416332512543 +315451553255656466364646463774142415617153542442482448787161235257752342122554345168743862685574366323676755254357634643546114141412434455134 +331442443131244242215432426216343673357432525661188148275724881666337686447134118645367881388775721221754357614322541664244415411312152545421 +455515126331244525512213561113144125127161111463856846367441241611554433144828355285377646274488118744636113745111113135144522511144666532514 +442245445415551152316465555445313573431235755688448178123188811211632828625481346484667621148357462251265242142251614165444353356666116322455 +421223132654231633455225761542152324225162246535571373583845165136481713753764865858457126687765747733545431277741253656615143643516233343121 +515513165654212514554454513176751173534486521271142217413387637716356221514388336653134341152582814837717254736237336561566533553635441666135 +452322122313235163336123717442746545775351661477426485854722638883562771876425838714554146161348763225487253733752526246424735224552341654441 +511261231262533135553326773122451455133526611731788533655187284571774976634151381173266134442171344582835271546674346256765426221346555126354 +441312444426226322326662564465772645165484625533552466632482734959745954345729313323451248384362734271573243616325466632556511656634663155266 +436124143141565661715577517474527177537841752865223364127392252313487265164511384914174281558633266537436657748131153475376671233235563324655 +215462626662162373517245646261132417468465422358353639637556333451739661813229377294416572815728366312241266672662671623625227112545415151634 +526516445133226464624713713713226614823681473822537142256393742664872193735258399575752884244441628851426136361161335277173466213443245255232 +431462154254146354624171615162635421615562251888699599277784797699354194914868856453757847573653564178674457176163625357741353335615155661316 +244624325352343621147637657314268421225183882222317386873219926824762169751747435785839743475964736777571752154351611764245621344431132251465 +622466131624225414165746175468132467442524387453561842849286849623289384653843662687733791731219129358366565355757635446311733143657425122563 +415565244557567443724421274146118367862253779441269779987385298384259842384238756474636422514452298191475376632765124517311772223747111221553 +224415544442722737264277837456331241262383434813218183463359963253442598497216492941383277632623418667535385535482231643236343734565232236444 +642531644634457137722523385376234152324485658765967551483792261838782658347627339446376458811756134717552147451331773156467323215724342116442 +112113412634335564534268458676158367547228686447194692571532281255486635234896812244882937351298543936536772483618318322621454477535523115114 +216121412513263576431356731484743423226186323591931731372862828827435596268672847239849336184758446348635438321131345433132174242622437525153 +361244662336135551344452463485211862627172377935539245834996384454592258948699898479493281223257671814911488182376662145511164525275131736665 +165234521654275573365338385518278629948818996367435586895254436684523588948834744776336561976738986265779662653464324822271266514762166614456 +324144767427637621188145143771424263391457862667374927664422328857282489772884986588289223465238542877749258682122413475416277214371116144623 +462141757254226563733583713476432319352426521991596892898487867483266853758672579895694242632283377513828828261837833183121631572445742221442 +215437425121164562573363383767726238622382131485669753322623542876563466426275244369368447787488539787837637458832715174756512351354433553615 +411512143274675166775574111817787573766775639649748955987736757897939233746284477745449498436594834584563281472552721784377616221164373235444 +512226541464154167618621765353997426286177987528994879733349887982688442788392574494257223769364334977973914468831215213434121557435771565134 +635331345725771132217132287438273585552172816423755333597376226838886737863392477937822267422942458778328451456818552882733583711124745146656 +162257267374445546767112112712599764653643626686288372592388595479834563982395645952583383855929363816518284764675946533645314857511275441423 +525354122752235724621386155517388489843996386869822654744547868463666959853998539475689499989335596595158734553643844345146762118341614515637 +212327336673515327218426574633382538632266645426845353829727535364459353455497533356978423362735468863571995889884663822271785863316751172437 +654151554722716881474716178795444491967242838664634497963334873734937539636888983644492435252529592388296918524215237646756324535244337742726 +436134144453674243475135213891997979652264272377259763296776495333488365579853956347338222448869775679874493495427192882433526465264166512725 +352441657667211781286346867251829436915494872282657548879573773477647586633836864636375888836387434837247286746357749946378358815164761341544 +344211312455633127334571881285487991146674766575667553989789874759837856753797837467959637559882538673235724542397242463723311666271462151564 +765447465132754118378824765215457832223883484794236957898556549574873435765334375746566573588226343324243774263269962798366373842274325572431 +245442774216763847855223456682983887229487772878955883963385895968748584584569393936333658859622439522349296447541345839677485776581752747135 +464755326741735643184731216812211999566567378343556656375863985733995377668847983654457864497366893338557566694594267935524728564757115562372 +276611114441172744317873532453116592272575726637753987386573644857854859893767947868594769849334765626244238348181439655388314127867476637735 +172775757671812773447757984667458565653235583325877488595356447758955333968754849886479358495987483444887222341827944126868285314572316572772 +346211121143728547658894831896538745449646869878395896483386939533887675869768936676584556758835577259849792653641654418357664532478455461772 +324643633857276637635414112252261345767947486449933395899997354966968886655754863434973644864943443597868329833361741583728881152722855261725 +252431552876626235415879971515865933622258886449394946659847485697766844696568859899973848343735672764778878853778812544691151562486731376623 +316722737474755264329193787285617936365855268547765346757449658889948756496468776965675735634954445286494442828961927698659861153211716551626 +132773141483712743853563134218674334446923794554859775566386875866547795854764589949888685463733764856646335245612652166215322668416242466113 +151424512168615731394256965226768648859888366593449576393685848577645497546546978799664387869736344954593839425929866356999385267562844644522 +717555552616666821865629725717366683284624363537696575686478884697444676498558794865964555694576556597676343463327134246854342316624568632777 +472551411442145515626216329563746474844686877348583653658695864448747455675695987878797598759876444588982764936271821131287267286142726275636 +155171541533286818525899767799783899346843864587558768894759884784845468548846448976554648647475865438854692464626677143436765547273851552154 +452664558522671782529494711976935543453978977539657538756697754957459645979486797498575948848686937394226747747999577444696386565128765367717 +361424226524565628529315274622585494838268365938499747649755856858756997855858979678977694755749839789795947672642972687911181354825148861517 +561537484637775558882152657299652655948477594858347748599487656596976588789645474478889684757873779366738489275563128169128352376636643832235 +776337212743488848616748846392848847657896659968374447465495596675785796966587646955589596975767597746769797657792654213715486318357545244116 +246343528328557474341596791814888892579575499955999879596765596876957869559598695868955995763934977786688537537996996636584397672628681375556 +136671326577271445845366863292636464358974369578878544496788458897586565555996555789858988493646333967495639554756674752389266681768511686224 +245176617835262133329727961335275486386957868454799777894575456889979859668585955696494576885453389696948676864388355173766295788522586337231 +532617248363626252583669482127783364398436954759898655567674697656689776889965969956866846696997964783587863584889724988772766816773813426155 +151164151685553579923929229839447439832567586948367787555998599696867866695798689589694899848596345433754365234223597185565768133543256874513 +473151224148378387859646492989346377444745677487564597775689998656565978698856558998594876984596486599962925635784454242162242433423243854376 +466724652458237264541121915688954565736639364353569769886645956788897989776889667976448776549496956386676358837254711898965961655123621842475 +233554248871634485516124336333327668423344636936345475845874568895556878787766696555955748458735994763932879787695892531647372335182388765717 +442721686873621288167248967272644698765686749466998454698488865855585576969859899957749767696367643485749567384756969121833151142323362853652 +131224361257182686937194839198486944358486644639849596675999459955899587657775896596474765495634946934837752398746648454767955327874862685614 +577234453284318136659448565923964378722959595589456744664955686696755697588769877684847445447355475683793483446432761555355475857422686143754 +214426477131541647836848128972238555848384596844999685878568658578767557689977756869565899556864366577378248982482248471328646638385415561444 +631517715854527284224457827182847678446846445586854979459977968978968565995858675949787689884939546674347723982983665277794391364422526543176 +155422167537473389555527617774884937496574996375454598584877665555986698978669587546956446897646686535954259459925769837343945232326525117536 +177246373177536325624347194283597785836546576666856679887798468766676885797776967668857755495734793955638228967677315548569511116845714682231 +471717133624583778845711674197464474634833438739354856948587945795776985555876655445447849884384784634339268857367889839651724335343345431411 +377264345556117134287713473164229944453868433958366976647975665796597677889585857887445887653768679867444347749283781729133858865113765272413 +314524383574323388183445488392975374524335387556833784995755457845958587597957977996585746949564568954826328329244868171211948362816573326426 +434554682683175418638656162892584843262777493689439866985789655779777857599588597566696478769643473355598537644379788986459832384247463657114 +674133161554648441688835514139688654682245855767867674698455889774984574464496944687789675696956648343523226522788286269838751652575475555456 +462426765663143157969489298764438658449557565688968938876576684576454499644846795656957499768693947683234635482579613741738741638856361164112 +634342136578153121273814635398298322967397354466655667578567645987478666755479478585497449693893779658883764922792819996293164375145165847245 +235512227444633277638292678387497628852659794553574358694977674764986588596589456884464847446856587549447593478872741268721927173411372624313 +743412357831653166133932292232959969965273975538994397776976654998889996845979844576578735876433663853995426362364627124425511613315172526143 +442731622275168261824353433654255778368457494367779488963778455954759484878744598685978865665868534796259238258564779793883843278672577531277 +243343412765576841719869145231283725627253279735756666859767686987764858996579666999676599345445687753629877349867432478917737653485348747374 +621763522433384116683368611216128726575499999675558585954765897754884669785976859747364543433576448954453786355916219328327532384428665575477 +524543276433232377649358862969143584849235654778537988384848895866487768479675459835474689886657946249585372249161848824253141664326626477154 +722467124826263612881883691123387632828943444693843379587888388849754449955477549743646495473486965329666372536965677348341865238638286273165 +477477475777163455752141878838789829433429974989495973339968493793545759888944879396357777984646839554485527326119533345645764113471445746721 +222532226153666532176538988216672893266644423264847958673475539977487799368647679888345686669979534437572432521737216573686711133826462247211 +173125312356454673552112123737663794747882924722848674959576679798568663889689975554993867883977224268427432287697474147348411125466854222637 +557631726747636381682623367181467282894546696525796984344945887944877648398534397357966494763826492939374534122237664392856188571226651127435 +127171514561685641185667884337671878659495478688583573464567388339338786567678789679838634369722994557784389588644887343583216287451252327643 +164453367524423665665615869718416552687693584876854963898383679539375389476467578738696549498664263688784327314522691774631815784468627112721 +715112634543835623631547327647797526999869329583334828693863687779564638748458393589797999328837637987726614986922784643114286383182776447661 +355711513326446741182421385369326178555652458559644274549864795578944956536585564867778923226244636978342947532318399341185647722345124255224 +647455465437375317145777642528468131331794588929843836353876794998539489443959878593478289357799977495783516419518282221358732368424747565234 +312364513326214842148144373318638327793348696288336733823987859657557673386556369755778878695667457674514848581988283384172568623716413616744 +625542417135618786471258548197279447388335755549662542779988643895865386466887694355448325847782959382789524143486954323767228673733555533613 +113421162261731586123115628496729985589669679577694334452673484648548348599379722983968864678744633476342994553771251344771452366634141255454 +134477616117215782383766386493453775873391945835958935853882884577285687834772229378992387429765583535956924916758918366568347212537667423251 +546125732571554374872358223476264933268281677245446647853725963852775689776344369595734827472336722958825384462369632278865437311625461246774 +646255336623315642181874651684351373955248668734484277996952632894969296559358543233256695756389676592281532632683767766752882526214571557735 +263133111154626665153145745673686378972254671179639535354289659749377725276268444955796853437365957681868369889853538365766683133723143774351 +356157122535232157358555862612642718587923187522323468883486236824234882429629298937325727679584633816417673364366257226886437171235264255132 +436147752532112726785333815727415784113119924558927993494437342894334874489644545423795498668966668494397614743133788561372313565526424412513 +234333635661263122125415885764811514949516691237437369553252895285624353424366643522298538321888193121614715333742387574173842512267441376422 +226632355175476153455367255635245459827598218738648873476487898645754923535495742286439348559834173933797375544748555743155726635615152146352 +636224413317446133157714585685756552887125576288396896777827364755537466648938934868868661185787453893179371714788783113713734241254534625421 +244416211151465645123462524671871156149112789579754859794385399687854875594794626735123591291226329389381732675528845288182246375512173533615 +341234644742224472423651462155357678636929435669252952456281465345263486372836626273224322899895557122993167866724672554337135135653113124612 +336163342743427375254448116867562275417362961761582952324457316223521155127469975647292784668179325247941357448422664673715372257542351143314 +446266166212175224425257612338311616745779443888827136424684696578678589723482522448739761855154597451671785541172881877355551326266223432533 +441236466625237165246621216522655162116256812592591918689227535326964684294699757764212824669138847416432658558885738415414371121754226445626 +336214166212676275731613558582511463764777289639827155365223132841918716976452788537939527792782427415512323687826266113415253212634411111366 +156655122133261521516122566572515434717653146596644589653135146364735937358668722466893845594315477856718262712185527217322662323224666442246 +542641643422157335736531433711262816675866776438164738517212817131258542834354849896414772143641517274847844786871322316165477233165122143653 +425621532435625222342717431654422836474813525672717161472481558477572163341687313384669111285481622875246428871137436573216744553463552166264 +524561366513451634126562352443225173336757122613738581756359314696894871173855271891555265243141257445447562465313572767217323644435611635211 +254251516443366157753771541143258516782164212551873214229594347153265831994849692151361355851528274236211216786152232711711651453223421646216 +215554635355325667135716763721217234635357578417452187761828897357193917742118942459777752848665384211266816873171647372217112621162542255212 +514541236521552351223166776737136317146134543621414737161624368879494573519462877621671886741747258617584764124161374765546174436421234345153 +511145424614131264516515137133473167736454277231865328842625472572663325674638234365183157326727761782846522133167145275224151666252145636223 +313332415443536513146361473172162515251734213163676225225133426717638474216532617124775345723771118682526213266352774677221132662366222164315 +132555424153156351214646455337532635262861546511415871233484875138164523831438345121328725486262357726311244324365742311451662324156336636425 +255222216146651531513124575714616465116454165766426434148253317171658475836237648832735577785846338655172353646633527411215524341665262134453 +542143544121563154365555264354257567561417334681327243362335833747845244188881616757755642416375682814575742262167632761256266143411211654155 +424224422121645653255645552354442744755732533713878525763571554588132424638372283711583118661563834233124414622412742711452641462412556452541 +323451134536366144223243127356522172173776114241763278766524165337612613172258564327763676767642716652727411374535644514445412342414264232233 +143523413366136226616145352725462712565116534325315828681434815576341256675583812823136155425577535611711462112345264132341661156123122512444 +534424215335116121416355453212641742616637467561421765211312716561473764825324643348524726375416371646456513273323442243456342316616245312513 +453232513252636341354514425646123634164432116237255356562765431344418733453743628134654343261472464746252217135122315455326111441265213212355 +412215133524541622451243544166466232766317527623242124753316316188516623131472822764467531616273247533444163736555254611411462232144424224233 +334212153313413214524453442336561744345416732257761131131721213371531645656324253657452215533346537166533764142161541461354351664345422511521 +313242332142333451253515355255513453273775326611511651477273475665721752633123246567463636572435614276466213222141412654542666613122112344533 +444454121115313412463433611151615564351422661315351337236747433642477147335533766443773646214777125665424243661322215331245516523155142523431 +111154441321134534546243515132432543442422776456753762623567561122176432727214215165571765763356677517264356451511156533566435315525231225343 diff --git a/solutions/solutions.cabal b/solutions/solutions.cabal index e2997c8..3501fe3 100644 --- a/solutions/solutions.cabal +++ b/solutions/solutions.cabal @@ -1064,4 +1064,9 @@ executable sln_2023_16 import: day main-is: 2023/16.hs build-depends: array, parallel, containers - ghc-options: -threaded \ No newline at end of file + ghc-options: -threaded + +executable sln_2023_17 + import: day + main-is: 2023/17.hs + build-depends: array diff --git a/solutions/src/2023/17.hs b/solutions/src/2023/17.hs new file mode 100644 index 0000000..3c05e53 --- /dev/null +++ b/solutions/src/2023/17.hs @@ -0,0 +1,84 @@ +{-# Language QuasiQuotes #-} +{-| +Module : Main +Description : Day 17 solution +Copyright : (c) Eric Mertens, 2023 +License : ISC +Maintainer : emertens@gmail.com + + + +>>> :{ +:main + +"2413432311323 +3215453535623 +3255245654254 +3446585845452 +4546657867536 +1438598798454 +4457876987766 +3637877979653 +4654967986887 +4564679986453 +1224686865563 +2546548887735 +4322674655533 +" +:} +102 +94 + +>>> :{ +:main + +"111111111111 +999999999991 +999999999991 +999999999991 +999999999991 +" +:} +59 +71 + +-} +module Main where + +import Advent (getInputArray, arrIx) +import Advent.Coord (east, south, turnLeft, turnRight, Coord) +import Advent.Search (astarOnN, AStep(..)) +import Data.Array.Unboxed (amap, bounds, UArray) +import Data.Char (digitToInt) + +-- | Parse input grid and print both answer parts. +-- +-- >>> :main +-- 866 +-- 1010 +main :: IO () +main = + do input <- amap digitToInt <$> getInputArray 2023 17 + print (solve 0 3 input) + print (solve 4 10 input) + +solve :: Int -> Int -> UArray Coord Int -> Int +solve lo hi input = + head [cost | ((loc, _, dist), cost) <- astarOnN id (step lo hi input) begin, loc == end, dist >= lo] + where + (start, end) = bounds input + begin = [(start, east, 0),(start, south, 0)] + +type S = (Coord, Coord, Int) -- location, direction, distance in direction + +step :: Int -> Int -> UArray Coord Int -> S -> [AStep S] +step lo hi input (here, dir, fuel) = + [ AStep { + astepCost = val, + astepHeuristic = 0, + astepNext = (next, dir', fuel') + } + | dir' <- if fuel < lo then [dir] else [dir, turnLeft dir, turnRight dir] + , let next = here + dir' + , val <- arrIx input next + , let fuel' = if dir == dir' then fuel + 1 else 1 + , fuel' <= hi + ] \ No newline at end of file