From 77c8739c1341d61126981ceb1715ad6c63527fa1 Mon Sep 17 00:00:00 2001 From: Maciej Jur Date: Thu, 28 Dec 2023 21:00:03 +0100 Subject: [PATCH] haskell: 2023 24 a --- 2023/.inputs/24 | 300 ++++++++++++++++++++++++++++++++ 2023/haskell/aoc2023.cabal | 4 +- 2023/haskell/app/Main.hs | 6 +- 2023/haskell/solutions/Day24.hs | 79 +++++++++ 2023/haskell/solutions/Misc.hs | 5 + 5 files changed, 391 insertions(+), 3 deletions(-) create mode 100644 2023/.inputs/24 create mode 100644 2023/haskell/solutions/Day24.hs diff --git a/2023/.inputs/24 b/2023/.inputs/24 new file mode 100644 index 0000000..bfe9608 --- /dev/null +++ b/2023/.inputs/24 @@ -0,0 +1,300 @@ +291493672529314, 259618209733833, 379287136024123 @ -9, 119, -272 +308409248682955, 156803514643857, 424989308414284 @ -78, 236, -255 +195379943194796, 213851381371727, 355270583377422 @ 25, 14, -15 +297329579961934, 122004770593749, 344090716183747 @ -87, 185, -36 +295385164557865, 339802914312939, 293784344149228 @ 64, 10, -211 +155809034672704, 276962605708219, 308527141561896 @ 65, -70, 49 +379374976062190, 523822522311015, 436295585524315 @ -208, -433, -263 +247918644285258, 312143526467359, 112155607012071 @ 189, 75, 390 +342617287456519, 397354826185853, 200879077842813 @ 20, -132, -32 +378033289852195, 344304802155174, 277151328831253 @ -244, 249, -576 +329376422447230, 354844965599343, 218863978047367 @ -8, 17, -10 +244732151114366, 241023555875268, 299614412087890 @ 91, 151, -79 +229675166786762, 272496792240003, 403388647505619 @ -27, -68, -59 +342641695024690, 405074098532187, 192422793097927 @ -23, -198, 69 +307790269475010, 287974903224075, 133983400495495 @ 157, 448, 404 +338204078494098, 220756564653275, 207895864790871 @ -119, 198, 127 +256854809852143, 151282473118095, 430813946794295 @ -82, 22, -38 +310795589424306, 300273918793951, 561603474537271 @ -105, -69, -358 +216689910377710, 176014643762749, 302037819898693 @ 17, 89, 35 +174016187301220, 213432519760749, 356227705342783 @ 20, -17, 14 +242219599681270, 198095041632474, 234812336636788 @ 123, 291, 53 +363124893146512, 442652496410205, 252364287745435 @ -131, -484, -450 +351213223671270, 362935312834443, 228742908818179 @ -128, -74, 17 +344214173972434, 388335215576475, 186571894620823 @ 103, 14, 8 +349598760694057, 366914630609265, 194339201768647 @ 50, 264, -86 +341614994957750, 190062425474889, 303119964664158 @ -149, 100, 15 +222157711994666, 237412175293295, 408224324533627 @ -39, -51, -31 +271757703912044, 464616309219749, 332689336082035 @ -74, -295, 20 +250628766803800, 168532696620157, 208267299142314 @ 17, 192, 147 +317020112206914, 277809818286032, 407863381711725 @ 15, 281, -708 +139674271448922, 306849236561795, 263391082181071 @ 46, -123, 119 +258096215553470, 289814915480794, 288168350695608 @ 27, 5, -17 +363641445693300, 230988678372095, 207280361486617 @ -183, 14, 164 +395475230137604, 286569114155087, 286374068821828 @ -227, -58, 53 +290926236744178, 297457255748751, 294347374053647 @ -25, 7, -48 +316790682490495, 379717245881004, 409858098674218 @ -110, -183, -153 +334822390551460, 382851207647739, 198921551768833 @ 122, 10, -55 +225775609455410, 89113641823329, 422613356792828 @ -33, 124, -63 +70307326837874, 123895406185359, 143541754272355 @ 295, 235, 257 +162794878008996, 173652810519316, 495533087752947 @ 33, 27, -138 +258705632635810, 80655227230039, 157840377597263 @ 107, 651, 244 +300344409299646, 183646111251361, 110595965169963 @ -69, 168, 318 +213975778288718, 193764624265807, 340491818490139 @ -35, -12, 44 +254365196823130, 485963685578899, 125027966220903 @ -34, -333, 276 +185119816803022, 159164853646062, 332181755689210 @ 43, 89, 9 +312682991980546, 296682404141739, 277578830074327 @ -52, 45, -48 +334063201619320, 349082279167895, 224872082527799 @ -28, 44, -38 +146865332069684, 118672354368894, 388923136846080 @ 49, 85, -21 +241545018449890, 175575930639279, 238105656690763 @ 119, 336, 48 +242998473052770, 260842386471899, 353094911438503 @ -15, -22, -40 +298049374841860, 302953880934789, 280519903072663 @ -100, -93, 74 +241726047709066, 396700833512351, 470178566023441 @ -61, -216, -91 +143251881420009, 227630340282400, 400202239949349 @ 40, -43, -20 +181693698716464, 371335237710474, 279589747245676 @ 25, -185, 89 +199776083341870, 424271723369277, 330637576913863 @ 17, -247, 18 +243099685892272, 278790917182863, 307263401526238 @ 13, -18, -7 +311573992428958, 339563241504477, 421253358816085 @ -115, -137, -115 +195139968654514, 399321212524987, 273718733311575 @ 29, -216, 84 +168652905324066, 42922523093201, 136328134641529 @ 79, 264, 260 +332492502844023, 232541271110323, 268437348702505 @ -122, 98, 32 +229871163504332, 315811780311601, 273027152212607 @ -11, -108, 82 +364596076994326, 405392531793979, 169077695698471 @ -142, -190, 206 +368014471738282, 411404609914515, 359308233522031 @ -187, -232, -168 +336734676406219, 363019597051899, 200746200694471 @ 154, 250, -118 +240100311481720, 182734033187437, 419841535721491 @ -28, 57, -100 +101659208850650, 143063258042099, 354417480491543 @ 78, 39, 30 +316608300364190, 327231766296979, 349926929027083 @ -108, -100, -67 +175882437786106, 207986866149867, 48272619812743 @ 314, 296, 528 +288200702096579, 134237752092030, 431007956556798 @ -50, 247, -237 +187799273615390, 251576716767794, 225064328926248 @ -5, -67, 159 +345031129381395, 398704983119649, 192035012621928 @ -20, -152, 55 +240614617391002, 436092108670983, 319023865196143 @ 5, -269, -12 +127420991862727, 123135422678220, 57674678556796 @ 186, 217, 389 +290291345885074, 335338153703259, 336486368450743 @ -64, -110, -52 +345222677707330, 353264220909579, 228080629830103 @ -55, 76, -106 +120731315974643, 121922962460939, 352925773636740 @ 154, 170, -39 +246457027018171, 290587724108904, 299967181084042 @ 124, 75, -119 +339299631313000, 347877395943849, 291783005889913 @ -156, -157, 73 +186318069122314, 321229647672967, 378293022619411 @ 41, -117, -49 +275970025052456, 254003877380129, 60447875537872 @ 129, 300, 581 +343777030173730, 387603653627809, 190127595920333 @ 23, -49, 39 +326625954078592, 221492115488361, 224589119605135 @ 28, 711, -66 +330727351246045, 382460793638208, 258529227193591 @ 62, -53, -358 +207849930952126, 217444078290659, 375450280446241 @ -7, -10, -19 +330413601325446, 354867024118919, 215181365719423 @ -14, 15, 8 +273539593790110, 527357437168179, 200706886651201 @ -93, -350, 184 +371305621051250, 406992413205499, 294687273096023 @ -194, -219, -191 +238331445291794, 405888543233043, 282145027415895 @ -17, -224, 66 +164563908487373, 245446713465540, 386623255996042 @ 36, -47, -25 +352203648341690, 391410023508659, 182689032755383 @ -14, -49, 74 +196332283252558, 239566376209863, 435769782659827 @ -10, -51, -63 +332262603162525, 477986526034049, 423864050467268 @ -146, -312, -93 +336025171108531, 228814354002627, 246100455575479 @ -136, 66, 90 +202554996256310, 144622073487839, 323843280557063 @ 70, 185, -26 +231583793158585, 274098148570719, 431523663253009 @ 32, -10, -208 +194039870771935, 220086273278949, 348459395283913 @ 32, 12, -12 +350978977183535, 297706532696529, 401295634941628 @ -128, 136, -541 +239988722464295, 366388864576004, 306003658418008 @ 54, -147, -43 +225592715561806, 116755915783527, 495439611678523 @ -40, 79, -127 +295163518502294, 256302372227871, 354092662486808 @ -69, 22, -87 +238762928861436, 104277648663616, 429257920986946 @ 45, 321, -253 +335646527589942, 267411223903873, 319409116881496 @ -149, -52, 29 +308988592776658, 321707797031691, 264887445984871 @ -49, -24, -8 +325655810895730, 314119726351931, 285885347173367 @ -88, -7, -56 +228513865324464, 407705823788478, 98135183804964 @ -35, -227, 295 +221021819586370, 258975000763563, 6625466634103 @ 12, -23, 438 +320402078029900, 178059278800419, 383059738044013 @ -139, 18, -12 +336426609877986, 385743547933251, 217242942544247 @ 13, -83, -78 +59321749403267, 132811665802238, 377024432495280 @ 118, 47, 9 +269221169152992, 144282527780641, 105622925246739 @ -32, 191, 316 +322565467760320, 359196040673604, 209572790080603 @ 33, 9, 22 +343911256200550, 402887944644989, 174632354525853 @ 41, -165, 157 +353126168973970, 405273919582935, 172039271954023 @ -33, -184, 178 +326846182468312, 226025647156965, 371867791604191 @ -142, -17, -18 +372763417186486, 399946994118006, 284888654682571 @ -205, -159, -578 +238591627755922, 274330093596843, 314686772435383 @ 95, 66, -102 +350425162332062, 389369983875975, 179065186259203 @ 156, 127, 23 +195114071161846, 225361264742211, 333450165595939 @ 18, -8, 19 +200946455709850, 426471282348513, 438704787028177 @ -13, -247, -69 +182130635710210, 211838995770339, 366144270406063 @ 21, -5, -7 +337674626273200, 379119144804627, 124545588880084 @ 37, -14, 515 +309119233707144, 345457984349776, 176480897161028 @ 189, 171, 163 +341093069492194, 215426787755718, 543835877405731 @ -145, 83, -386 +406947563701153, 361064263636829, 506655770864396 @ -244, -160, -263 +138744154165460, 337520178393783, 264760081146471 @ 132, -128, 82 +142884697542590, 14953861507879, 301051396847183 @ 36, 167, 84 +62428000394402, 121573669531131, 285948127754263 @ 198, 136, 68 +301235858359754, 290689686950351, 264197704796073 @ -45, 24, 13 +69052754947310, 235657014607714, 418845817526938 @ 99, -61, -25 +276020997007381, 154938920738092, 289050261086728 @ -64, 117, 53 +340992490662874, 283734631397387, 247161636223296 @ -121, 74, 27 +125358983559838, 388966759539897, 442450312355365 @ 59, -208, -64 +247111468608036, 298684579131926, 247459506399721 @ 21, -37, 80 +269799925928330, 346080114851941, 192870832715433 @ -53, -141, 183 +21485022052306, 61917371383851, 14153560016647 @ 151, 113, 369 +168759694289722, 235235657051967, 394018487592739 @ 91, 16, -100 +346771701017358, 379090812136831, 195343843369543 @ -36, -27, 38 +364922844998242, 405449109473563, 193296414410007 @ -100, -154, -176 +286294122958642, 382870439083131, 153541929882391 @ -30, -177, 245 +144541456321322, 259959262174823, 159041330065209 @ 99, -36, 229 +169067477683714, 204758213310363, 221220702084535 @ 78, 46, 146 +201146928516970, 172345662796719, 265025819376463 @ 51, 112, 78 +122849126629390, 139266589388763, 133073803140829 @ 217, 218, 275 +376610203535095, 524590501174134, 540682746641333 @ -202, -413, -380 +155396067983527, 135079411201904, 346771075414519 @ 38, 65, 26 +367025720824960, 399429967429654, 200118770338033 @ -163, -147, -28 +188860323625695, 280509742808449, 228889209496588 @ 208, 56, 83 +370994826025810, 516943861319289, 277158295638088 @ -193, -544, -105 +360132758113355, 400823411389429, 179526450589128 @ -14, -72, 21 +317723494997245, 403424754416019, 123033781749148 @ -10, -206, 371 +231857064371422, 328033566747723, 258488840035627 @ 84, -66, 37 +430250735327386, 317628879447345, 463851654198943 @ -269, -111, -162 +197095573209612, 386367210346765, 255360476476089 @ 118, -187, 61 +237963736351605, 265388533967262, 253761264381393 @ 162, 157, -12 +363368985840202, 288715458856678, 222859449036721 @ -169, 153, 44 +336715322008593, 367196238729037, 205425778003914 @ 18, 36, -15 +172536009897664, 162754568611140, 345184409520034 @ 45, 67, 5 +343839846989266, 277316030970699, 191154063170167 @ -41, 515, 86 +364839061293440, 370333200866079, 202280142884213 @ -146, 76, -47 +205180494328024, 181302108773882, 352998887224071 @ -7, 27, 10 +253114332607887, 252973452511066, 373269612984083 @ -44, -31, -42 +260563693507432, 370218908840841, 227275158133861 @ 90, -127, 65 +211632379587750, 229189261429669, 267702494391083 @ 33, 27, 76 +246925439769358, 403237078327653, 341438050336159 @ 101, -213, -194 +314011896591392, 359513784621587, 220682410853239 @ 13, -46, 26 +192947734147345, 343204650565017, 232772451195853 @ 162, -96, 88 +400010012688090, 317666186832694, 389849162657458 @ -249, -51, -211 +344654321611729, 249175343587025, 521971621625971 @ -160, -28, -226 +334131140547988, 223459610704956, 530065014889646 @ -151, -17, -195 +271802467841374, 312721714818849, 474166669352047 @ -61, -100, -190 +346585589783366, 394172810646086, 185879034872896 @ 43, -73, 41 +348026275676730, 387630874942399, 214450542419923 @ -71, -109, -31 +338259203280741, 352302596311566, 118072221394886 @ 96, 283, 655 +293750362255726, 291573521915979, 78443880264043 @ 41, 130, 488 +327898963343795, 191014039376899, 482563685839609 @ -138, 50, -184 +337166009346768, 391869416398867, 241936328612339 @ 150, -42, -536 +318801805101604, 313350452906991, 260512311617500 @ -79, -18, 15 +363665586589577, 276485965150536, 560019564776630 @ -182, -29, -371 +283693315753962, 303343268529299, 260638812037467 @ 19, 30, -8 +152531270776150, 182584879439265, 364189307415757 @ 17, -11, 29 +331886310340210, 367196248652751, 203943027278671 @ 7, -9, 32 +293670081918730, 338393014464039, 238074080259283 @ 11, -40, 32 +340517885909575, 292220098034574, 263908972058479 @ 12, 565, -430 +215180009575150, 159662811481959, 432250918416853 @ 109, 256, -295 +111353526905854, 158069012352691, 414700573118491 @ 56, 12, -19 +342149249853468, 379057271341489, 449130014242836 @ -147, -180, -231 +164800679784870, 110492400316699, 384075961244050 @ 27, 90, -13 +194218348327784, 317435294782571, 377991167649959 @ 96, -78, -126 +265459439896876, 393130510464227, 448999804034887 @ -22, -202, -238 +342485301424762, 306126318497295, 448916100464563 @ -155, -91, -157 +285930806205610, 329883886388883, 254526439062823 @ 32, -17, -12 +222718267472544, 137706718628633, 419538567330529 @ -50, 33, -25 +355490264524645, 367186320360879, 230373412357398 @ -94, 46, -183 +349202081810142, 291246578412431, 223213156752343 @ -99, 284, -22 +318303996716125, 368813135346114, 214100266906048 @ -22, -95, 67 +359828018775610, 334476869183979, 315718417210383 @ -178, -128, 19 +310093135954874, 392333711576675, 96139866022847 @ 154, -127, 625 +332723387475285, 384153175982064, 182503117349788 @ 30, -77, 131 +360194406570013, 349779100748340, 127043801020300 @ -92, 337, 597 +288773776244596, 318828306006264, 110180186804176 @ 9, -5, 359 +123467355045370, 135168256391259, 212490220185583 @ 66, 58, 171 +301530401246642, 315308990894907, 147997344598679 @ 208, 319, 331 +229677118804378, 304422878069265, 134766211371802 @ -25, -104, 257 +335208657102058, 429374769368011, 181336018815583 @ -76, -292, 173 +153126745187446, 361996029410147, 361232623991831 @ 176, -148, -110 +307543544558028, 310836622716592, 261806684128363 @ 9, 87, -82 +305446483268280, 95007956275577, 26450381518969 @ -23, 588, 584 +308195050787890, 376020805378859, 151124547509703 @ 101, -69, 295 +181744775932850, 416582355770979, 374307216760003 @ -9, -236, 17 +323567364535098, 398843484951019, 184056042477469 @ -29, -190, 161 +239625227411666, 460421176139587, 263860052129839 @ -17, -297, 89 +290391850460116, 123822800918427, 390474163576439 @ -112, 58, -6 +274274367393128, 222419281142943, 357607375004572 @ -51, 46, -61 +355957759423346, 403839841977963, 174439429446519 @ 61, -119, 102 +92872979090114, 178033036374593, 184039848628045 @ 111, 24, 200 +97741768910238, 219237917005243, 481345580120351 @ 70, -46, -84 +219237852779083, 293460830478687, 286842878713720 @ 134, 22, -39 +165873248906086, 48723353419159, 391521269184095 @ 14, 135, -8 +120293816868514, 163820001937179, 368954885538727 @ 51, 10, 22 +337142332745596, 160547517607569, 190677777707717 @ -130, 235, 175 +359903966491060, 336058036164375, 214952259623515 @ -68, 608, -316 +278704085129049, 332251057343106, 274876653327010 @ 16, -53, -25 +341902521147010, 290550862384683, 187354875008647 @ -118, 79, 167 +266132989640850, 85667158930666, 151187445755913 @ 127, 761, 268 +226481708603128, 264873125336255, 125550562908581 @ -52, -88, 259 +358194067651922, 464014334175995, 240376420942551 @ -161, -364, 36 +255918918476926, 464443215434815, 151073769691223 @ 86, -361, 258 +326934575138296, 227642710359355, 187154441418847 @ -139, -6, 194 +355023487027664, 380684157575495, 166279629390635 @ -20, 92, 232 +342708878447974, 365712377127771, 208254982911037 @ -31, 26, -15 +275992353396058, 254199039060579, 312307418341759 @ -44, 15, -9 +275807125436405, 450328581313154, 241879925570534 @ -38, -295, 97 +355105298525698, 461358532374587, 174255797829999 @ -67, -634, 165 +127304870812111, 107206164704598, 387938601844705 @ 110, 147, -56 +191211556791145, 383063844291897, 383818462516984 @ 162, -176, -209 +270008506829071, 306985556216215, 270509853345710 @ 14, -18, 7 +254859649784435, 279691564762489, 252917958138213 @ 22, 12, 60 +301554869022495, 278690002932659, 270658229427943 @ -96, -46, 74 +292995486711810, 278124279008795, 299858987167607 @ -68, -18, 6 +170086256676901, 192032278758264, 399539006601156 @ 14, -5, -21 +363343862472525, 462708884039439, 206020620737318 @ -114, -770, -179 +199767932051315, 231641229533994, 324467235209543 @ 34, 7, 10 +185698250335984, 338189264810958, 295966585334407 @ 61, -131, 42 +355845863753410, 453333218257139, 189979947718988 @ -145, -366, 147 +263693411545060, 382941996378267, 552998788505917 @ -68, -198, -231 +357882206779336, 415793203698444, 221686125924646 @ -59, -285, -335 +58482797244400, 283357087767651, 380695065023959 @ 112, -106, 10 +329961895718995, 370045430297334, 264316414918513 @ -70, -109, -72 +248082141022960, 238905086388339, 221882363855113 @ 22, 70, 123 +209808257975519, 379817673897890, 358895541155856 @ 160, -163, -201 +275001200474245, 405709429886895, 479845248771052 @ 52, -218, -579 +215447048650693, 286084440368310, 308066874352459 @ 86, -7, -34 +243779481735825, 367408788584499, 186923174146441 @ 162, -110, 164 +22569070313760, 307206567552909, 336933487682743 @ 202, -113, 26 +209855802119430, 266771395093679, 336731626000023 @ 28, -33, -14 +152285478372850, 300465378313851, 147474491960791 @ 177, -44, 252 +317340728176012, 355422381584551, 214819746096109 @ 8, -24, 41 +218567618087469, 163809178763437, 274368240641493 @ -36, 24, 108 +263714419323370, 253066561988427, 236112367528733 @ -13, 34, 103 +318025834942906, 209033552746731, 422873100748303 @ -82, 192, -317 +287128402777502, 364357342250719, 245621206783419 @ 153, -40, -104 +248072289852880, 330038730987654, 167572107691063 @ 41, -77, 218 +189081821987410, 458283001653339, 444430934012663 @ 35, -290, -129 +232689117806470, 338009512571859, 347647996245103 @ -44, -152, 24 +286524941660398, 398498738895345, 392464150253677 @ 41, -197, -405 +289581406826830, 404120121547236, 281550894569635 @ 27, -213, -90 +238710152421370, 355292544483489, 351300821030563 @ 23, -140, -82 +356304901805038, 320639399358399, 251359082876207 @ -166, -65, 64 +299258143464579, 329939012733995, 241161767292621 @ 78, 74, -60 +391208392886390, 342636257835159, 562331178144743 @ -227, -116, -446 +347915406224905, 378141743469594, 140106553810348 @ 28, 79, 481 +407508472819681, 342065101666042, 327670405171882 @ -232, -157, 47 +68256701718408, 52950691008669, 156980686432495 @ 150, 175, 230 +241577764898038, 246780391542179, 295501616392079 @ -19, -10, 46 +335640266041963, 366897853889835, 320775200954400 @ -154, -182, 49 +305567299016286, 304550890065435, 234102345829961 @ -15, 58, 37 +255844102411545, 236416893288454, 223372017812513 @ 34, 113, 108 +359486749992297, 388233343083006, 180756857053962 @ -42, 61, 45 +256997657349820, 240682040678865, 191215964897935 @ -58, -29, 190 +337489509798277, 387749886514020, 191762667954925 @ 48, -67, 44 +308731611545420, 173487498189829, 444926426740073 @ -39, 356, -468 +405934168591492, 433302451890441, 495881447316868 @ -251, -268, -327 +342562531851970, 329852991659459, 146721758630247 @ -133, -60, 262 +201459697721034, 226176452581883, 409625152149327 @ -20, -42, -29 +342190286602489, 382361323151712, 199647031503058 @ 36, -7, -37 +295823889919724, 237024181773491, 238902193047203 @ -56, 86, 88 +313871022274978, 350907196244889, 236256681248611 @ -25, -55, 16 +359840463350408, 352014789184705, 312578822471289 @ -159, -52, -224 +63266051000177, 144958221562269, 401563955793621 @ 120, 40, -20 +289363911332530, 4297357886271, 201584988813263 @ 47, 964, 118 +139623875169600, 365121525551783, 489522324414385 @ 42, -184, -109 +285387003808144, 234159759801909, 194429463680919 @ -91, -20, 186 +312338296007416, 230717344302005, 321196352977333 @ -67, 156, -112 +109900900224955, 79824552813534, 271811127497488 @ 70, 103, 113 +299767049618653, 243317066662260, 262990449670462 @ -34, 143, 5 +336430697131966, 368621759709731, 209166228902299 @ -16, -16, 5 +391878841792417, 405438773779004, 446025651245823 @ -214, -225, -62 +382391688500786, 283246166659291, 375114971709047 @ -212, -18, -128 +307671490544586, 326499940532387, 232143193625119 @ 10, 39, 11 +369326492413668, 408128175647671, 194002024388681 @ -174, -204, -83 diff --git a/2023/haskell/aoc2023.cabal b/2023/haskell/aoc2023.cabal index 724b847..a590f08 100644 --- a/2023/haskell/aoc2023.cabal +++ b/2023/haskell/aoc2023.cabal @@ -31,6 +31,7 @@ library Day11 Day12 Day15 + Day24 other-modules: Misc @@ -41,7 +42,8 @@ library base ^>=4.17.2.0, text ^>=2.1, megaparsec ^>=9.6, - microlens ^>=0.4.13 + microlens ^>=0.4.13, + hmatrix ^>=0.20.2 default-language: Haskell2010 diff --git a/2023/haskell/app/Main.hs b/2023/haskell/app/Main.hs index 417a4e9..1a51988 100644 --- a/2023/haskell/app/Main.hs +++ b/2023/haskell/app/Main.hs @@ -13,8 +13,9 @@ import Utils (readInput) --import qualified Day09 --import qualified Day10 --import qualified Day11 -import qualified Day12 +--import qualified Day12 --import qualified Day15 +import qualified Day24 run :: (Show b, Show c) @@ -45,5 +46,6 @@ main = do --run 09 Day09.parse Day09.solveA Day09.solveB --run 10 Day10.parse Day10.solveA Day10.solveB --run 11 Day11.parse Day11.solveA Day11.solveB - run 12 Day12.parse Day12.solveA Day12.solveB + --run 12 Day12.parse Day12.solveA Day12.solveB --run 15 Day15.parse Day15.solveA Day15.solveB + run 24 Day24.parse Day24.solveA Day24.solveA diff --git a/2023/haskell/solutions/Day24.hs b/2023/haskell/solutions/Day24.hs new file mode 100644 index 0000000..88fbf26 --- /dev/null +++ b/2023/haskell/solutions/Day24.hs @@ -0,0 +1,79 @@ +{-# LANGUAGE OverloadedStrings #-} +module Day24 (parse, solveA, solveB) where + +import Data.Void (Void) +import Data.Text (Text) +import Text.Megaparsec (Parsec, errorBundlePretty, runParser, eof, many, sepBy) +import Data.Bifunctor (first, Bifunctor (bimap)) +import Text.Megaparsec.Char (char, space) +import Text.Megaparsec.Char.Lexer (signed, decimal) +import Numeric.LinearAlgebra (Matrix, R, (|>), (><), linearSolve, asColumn, fromColumns, flatten, toList) +import Misc (paired) +import Data.Maybe (mapMaybe) + + +type Ray = ([R], [R]) + + +input :: Text +input = + "19, 13, 30 @ -2, 1, -2\n\ + \18, 19, 22 @ -1, -1, -2\n\ + \20, 25, 34 @ -2, -2, -4\n\ + \12, 31, 28 @ -1, -2, -1\n\ + \20, 19, 15 @ 1, -5, -3\n" + +type Parser = Parsec Void Text + +parse :: Text -> Either String [Ray] +parse = first errorBundlePretty . runParser rays "" + where + point :: Parser [R] + point = signed space decimal `sepBy` (char ',' <* space) + ray :: Parser ([R], [R]) + ray = do + t1 <- point + space + _ <- char '@' + space + t2 <- point + space + return (t1, t2) + rays :: Parser [Ray] + rays = many ray <* eof + + +intersect2D :: Ray -> Ray -> Maybe ([R], (R, R)) +intersect2D (sa, va) (sb, vb) = + let consts = 2 |> sa - 2 |> sb + coeffs = [2 |> vb, negate $ 2 |> va] + times = toList . flatten <$> linearSolve (fromColumns coeffs) (asColumn consts) + in case times of + Just ts@(tb:_) -> Just (ts, toPoint (sb, vb) tb) + _otherwise -> Nothing + where + toPoint :: Ray -> R -> (R, R) + toPoint (sx:sy:_, vx:vy:_) t = (sx + t * vx, sy + t * vy) + toPoint _ _ = undefined + +solveAFor :: R -> R -> [Ray] -> Int +solveAFor s e = length . filter isBoth . mapMaybe (uncurry intersect2D) . paired + where + isFuture :: [R] -> Bool + isFuture = all (0<=) + isWithin :: (R, R) -> Bool + isWithin (x, y) = s <= x && x <= e && s <= y && y <= e + isBoth :: ([R], (R, R)) -> Bool + isBoth = uncurry (&&) . bimap isFuture isWithin + +solveA :: [Ray] -> Int +solveA = solveAFor 200000000000000 400000000000000 + +-- >>> head . paired <$> parse input +-- Right (([19.0,13.0,30.0],[-2.0,1.0,-2.0]),([18.0,19.0,22.0],[-1.0,-1.0,-2.0])) + +-- >>> solveA <$> parse input +-- Right 2 + +solveB = const 1 + diff --git a/2023/haskell/solutions/Misc.hs b/2023/haskell/solutions/Misc.hs index 7d7b41a..730c842 100644 --- a/2023/haskell/solutions/Misc.hs +++ b/2023/haskell/solutions/Misc.hs @@ -1,5 +1,7 @@ module Misc where +import Data.List (tails) + withCoords :: [[a]] -> [((Int, Int), a)] withCoords grid = [((r, c), a) | (r, row) <- zip [0..] grid, (c, a) <- zip [0..] row] @@ -7,3 +9,6 @@ withCoords grid = [((r, c), a) | (r, row) <- zip [0..] grid, (c, a) <- zip [0..] pairs :: [a] -> [(a, a)] pairs [] = [] pairs xs = zip xs $ tail xs + +paired :: [a] -> [(a, a)] +paired xs = [(x, y) | (x:ys) <- tails xs, y <- ys]