From 9ac4656d4d63d7229ee695a0a16c979eafade3b5 Mon Sep 17 00:00:00 2001 From: Ben Kyd Date: Thu, 4 Dec 2025 13:46:32 +0000 Subject: [PATCH] Day 3 part 2 & Day 4 --- 2025/3.txt | 204 +++++++++++++++++++++++++++++- 2025/4.txt | 139 +++++++++++++++++++++ 2025/aoc | Bin 82976 -> 100880 bytes 2025/aoc.cpp | 1 + 2025/aoc.hpp | 339 +++++++++++++++++++++++++++++++++----------------- 2025/day3.hpp | 29 +++-- 2025/day4.hpp | 97 +++++++++++++++ 7 files changed, 682 insertions(+), 127 deletions(-) create mode 100644 2025/4.txt create mode 100644 2025/day4.hpp diff --git a/2025/3.txt b/2025/3.txt index 7255fca..77a33da 100644 --- a/2025/3.txt +++ b/2025/3.txt @@ -1,4 +1,200 @@ -987654321111111 -811111111111119 -234234234234278 -818181911112111 +2232133233333122223222321121432322323324333234233221423334362333113343833132233313523312322224432234 +9544718948279477416294977734546287758964484675984344448638555429875995525496945633428322464129775449 +2342431222323242222322132121222212212132223222221322252221222222422212122222231227223222421241422222 +6244953925232293122334482643333513353336433435373235433333433333344373324258246634153623454355543453 +7736344447654414443368344654254336514625323365763557557347345633456536654753356543554224337423655645 +7678256455884537672778638766849667285882535872669457673757574863687675953957763739884526852357676358 +6418138815172751627482363178142568277778573255724443532712835875457855664165654688176581654473178739 +6854446345485434355456557454552353525455763235344855551758634555554555645555644535645534531743242554 +2222222322322223322332612212222225222322331322242221255172251455232132122221223222221221222241222221 +3522465222652563115529464642233332216344152233612263521373322232245234334452353472671944353144627333 +5545321222222522222344243223154223534233224542342331245267254214331654424232831423343325435272544421 +3542524122211624341522322226153222251432222222223323326252321225121362141322235161225221111222227241 +2455322717243462411254243226323523121523342233134641142441394244224254232641451244318434422422224383 +4553343324447136364342223433344524634414373234332183266461265223446463254334435343223462442245322567 +6563436486136355463655575366345554384456562545629262586425424652243626548657625466455656653543945665 +7535454577563343346435454343443457475576543343854334614444838455344744678754354444737744257755677424 +5564445435564444634466844337565445844465549459245334613233554632368925514334436545333343645355776454 +8687888777879988878786888689883788878676787767787678887576788777889856868587889748756884386837718787 +2232412541224222322223222276932221124212222125272222222211222152123223225321262122552222226222425222 +4367133344544422433442443532453333443413434346523142232414343334324332325334334344244542343334544237 +3333352232143322323333322333313212323124323333333344323233231333234333263223423333332233323324333333 +3413221222121422224313122242223232422123223114221342223232222113722222222422342323332232242313233343 +2333245223264434343533344443342324333344512585354324463634444223333444444444314323334344443944441334 +1321263414534312232212221232224263311122443321313323123542213232222213122211333322133342142442322512 +5234832322232222341332323232223423322353544163291633234233432333233323421323132323426422212322312243 +2222272225322222521313431322212652311262252232321522122312222123132225324154112232242423632352323232 +1233322333332233324333323222323234333332242125322233332233135232333343331233133333333332323223413332 +1312424453343532223551344364432434354347433354424723733371315333224226424334434614235534445274332431 +3333222231433223233328333143332343233323313231223323333413325234311233222233254111233223342433224413 +3333222655333336333322323255253323533335253333652336321225333233224452233423332325333333253323223333 +5442432232322344133222221323243283242223312342542332152332352351236334222332422231332432235543252524 +3533343334332332529234332635513353343333312739332332563333213353323121263322322323325226163333269332 +2122222244442433423244142412444333335443132364364534743313414423244243245343424211134123233441243732 +4633963376156266384333658525662638893353359263721347373868352835376452436935238733834236233534373967 +2868546568874346646545656477657574895553666666558685549546665585686962555965744696697655946493595695 +2424225323222312222223222152333122224122412215154212252311412222247265222212525114212422232122122412 +4122125146221433231332322546242212133253432131543424113132355232443113244544336232221214432244331542 +4316244124525612322532522225222222523221664223522294732225222321222441382426222447462326223431346222 +5464524566374845443775253524262353365414473446366263943245443654534643234274644327649441535672314333 +2222226211121221331222221522224252212122322222122212222243222221643222132222322222221326263232142232 +3333252553243533452223224422312333322233213232324543232252125425312234413225543223321933125342423142 +3332223222222433147322232631122323433333223331233133332232133231313331312234134243113322422313332323 +3352113432568212214452342423233422512652142236263412243242444223222554315232212432252432223462242221 +7333543341233454333343233343333364334313464323334291434332344333638433574433417333432823333334433833 +3264323365333111323333343336334333333224343233252323333333322231145335333333123233233335232334333533 +2432322325121422112312235223112123222222522232222733313233433224212232223232131221423123342235222122 +4322122333221422312325222324131434225242432232913422253233241331422332232314322353311222232125223432 +2724243234112245242225422434212431122341124421154322328252112244221525272534232222234424223252272222 +6263444344135654233444434353424513343334244643543244344552442244473444344534444335444243223333444344 +5652456451676873241633354363633342254384434464235654741335434444443364444349248666733344414676344424 +3332234444433333132133232334413433434342544333333333332133433324334351233235333213234412432355333433 +5253244864383445455545484741654848745663334656346555654783452554459476247734877397397479436544545535 +8847848634467769875277674783864637763348776585487564877575446789458658887576743878774573537768857846 +3465232634212442535222152333343332414424443235324424245225244656253234443454326334233233343712233242 +2526424327586513436454654476775737662269387645787541237764227642652736745535462656515468637462462272 +2435133332535344754333243263585245556234826664432357313443546253542483751473335539432333256263939333 +8382382578536859647359748967547585734844587735757947889135698988238798976595788728827485377567664443 +2323333232332224332333333132132223332332233334333134322223332322322331323223342212211342323423133112 +2222223231325222321233222222232235322222131322134223434372222513322651221231121523323221222433421122 +4343333333353433133333432533433534423434442333344142233435324333432233343333413433234343443332444133 +3435843213132344233334752343345344336253342532313323325472445232541333328233323334423541324432222453 +5344384444237343444782523452775445754348886564424435585784776766424342433744438325484356577344888333 +1224244324222262324522232424222642321661225332423222223231222122222223122223251414233371222214244224 +3543443335325823355433332433232363341313324563431344435344334634224312333333143434333333343693437623 +3222444622443242233334533343431223432343263144442444242344413342243411444323111333422334172843235313 +3233243443233433233232333344313433332321342333333334333332322334333324324224233333335134433232343313 +2322382122121323222232222224422355232222223232212122222223222322322212222212322232222222222222222211 +4438874627283769846545858477542757538887557577785678557696594525464885577588345473865884555825561648 +7324232222222223222327122222222333124142233231222221222213623122235281121154322132231522522312221232 +2333433334433422333333433433412334433334523334443333442543323423432335444141133424433334329334222422 +3134463377323343243327234347364223313333433142833225473216361353553398231433232233134221371355315334 +2286532255124664377635386342833365262327225754851573844435254235445111322654684446255426313359435562 +2332221234222223233225242232333231341432233433313215322243233232332331433823432243433223332282413422 +4452645222243142511223334433245244322342425224221373244442233412443521333664343443244123333552252344 +6342492286728826426533414885485313383365538228643655268866833443862544644641653154644262754544665538 +4348222441234532331362213144243172444641324435312344445342524624344244334537324313348132332536622632 +1312343222332333342331132332222313523432333323322613133333224212322342151431233322333243233323342221 +2432343233323222322412213232342333224322223143332232332324232323232332223322332222542332412225243222 +2452344334433343323244445245322257264463432342324322134422221321224314133334353354524452342424143224 +4442333443444454443442443444443434533244354446444443443344445322433454242343332344344424333434644424 +8634324339339317534223333323739328623427333734521177196243735432834223827834436832731312246232273785 +6485236322212732224522124122122252242252126221211282288242279272225242442642278527645921222194723223 +3615215333285423223433333532642133413313532352344233263453434225344523343343452434433224335235441422 +2422544126132223324321252211123142222233213322231312222322112122232433423283224233222121323124242261 +2344463434152382333281434454344553345433362453133442343344445443543324392453343439443324324763633442 +3437353315538337595346532555635436876443356345954234333432342327246437754343343335325354283333534437 +2452212263422223574224222423225223423433651242252355232223626336323325426253433434623433274324474216 +5765276675264696695461433224346233783941273322233552212723372159556463264643637125566446246446333751 +3732223222221552433423122222122443232222243442122452922332422212133222247236721143422123632722356222 +2363434624333134423342523424343332246312346134473384231393741244763633254642436332242324232232237352 +6647421644234223129224541461443174244433333345533642413652347443544544333735247415613455436354433343 +4425834244465436335445345632343233424345425444442346382432242336236441342233344461354245646534344742 +5743433673433313638653536582345321453457651837423642123458226734277346423997436443274433233333666648 +2322465252234422122212243222232312124251421223122231432222132319527222264211322226221245522911222111 +4132544322238334333235333252282333243543433333423435144535222226223364345423181323324531343342362332 +6395732553634323536534635664454563666335534687635322745452356365676654356865366655543558761452346463 +8525333555554553354625353535661444334216356565765655347495733536664755363546554556655675334665345632 +2224222223412322662244223232425261752321222222226595213212115242532344225522486216122231222742326333 +4344445434433371234434444237244241324422432333382443122234325144245365444452241273223442333442464534 +3225334632332322633326544153233322232363522334723123331243322134221335232423333533223251127322333236 +6286125832212222224332231722212222722222122312222152228113212222311223632422225222512242221222212222 +2622233222222442111322422244125322211322122122221423461222222132212442943623136145262312122322262222 +2422272424326821663242123334232322242561943233452352322263216846337363646625544232212142221223692322 +2222323332324212311332331122122333222223233211223312322231133124322323322334322322233823242322232233 +3371333745646334334582444935636634348123863349243334762443545833343369542293533743454247388843454335 +6537724565567775777467774785767414549447727266273565567747667766444476766567878157655753673663544567 +4232456132623232124482415652321558451214723562396612244136524425122125765455552424223244422146222532 +2212323232122322222322113332433323522472132233232332343233336133211312212231232333521114232222232122 +5155553546841455454558325264555553434375556552555257235515455534455515535535525544612654551556453524 +9722515125324323362444125472327421252358654235635924222635231244315621287234335525325576533463224849 +1668336355465725434223666523665616453433664366665644647241246212551332582536336235544653338583343525 +2342313322332521582422234378343223122233333212153252233326562322353443222534132143235631222243225231 +3512333132246411343713435343335333335134243322323234423253343242463434234133342434353423243323541236 +2455375222533521242123424433216423384424242442312521232359426424132423124225424483242432223241412437 +3233218222223222112222312222232212222212122222123222212222132321222322222223221312212253122211223222 +3234532211453232241212332322222243442412123922323322223141422421223423322324442222342355445523212331 +3429536326344342532553888333258463373336453332333234433333335537325237137423534323744133635593353433 +1434363334311314233411433264324535442213456833323132422333223343323434414343231414426223345135344335 +3222322222222222122232212232232242122233213222322411222243222421222232233233232422222211222212222514 +6245324443534665534554336746249753563335341556444551723734362444643464344474745553444253347339624453 +5334426434433344534332343143438432432335433324463233234221334323468433944352243324231363434332625232 +8835353872326366238572332425353324479424422434333346836423292341543941333134553678322426837372329372 +3353353533434332533732453332323332653233444333665433535362635253376331553353453332533343753423532332 +3343243356114224312352353422632522434115634344445422323511425423314221221433522323356223423225255632 +2131222191232122222212222132222242322422222222222122222622222121311323322232531223112212232316222312 +2611324436312524222533222646396144443463214214855314424162675322243512222352222445432472255223323232 +3321544624337424523342534434446442223443444852334474733733453347434543434247424241449444324392444414 +3232232122231222412322554334342222225242243221431313242333235232421342242444532333422232232212223143 +2235543354323222423532241735522524422433353321334432454254235522425133355446542154332373422331222322 +6656555559464658486564666446555555958585543486575355545856447758556755747565596255555657556545666643 +3427121822212112122524323222422442222736172215222531143142252533823222221215614162522316266442225222 +2118213211352282332213226223228122142262542422222222221522227223334212554222247222352222322213224222 +3144232433314411535242444333342145242444623322445244434143422434423543324232351334133423424211334444 +3216432126534223385221653121423325142416433252224592351254332242343442122112124243172322248634423422 +8232224118222323245252122234212612222232232222243334227235223222322623333122822231222442722214641521 +5225453455364344623154425264523386354642337433564515232333324534423324233424444233445243425411233426 +2129343373333483292343353333723633533722324323233576454932343124233235332494433273254332333363323223 +3132237211131224222323222232233112513122242322323331222321222322362323314212323251122122142321314332 +4754225344465673553443332554442234332368453223434322243554338472333376322322323373264335834444444454 +1136836833853233743825433251843363363773263235234234436336233123333822323634323732233628834362573344 +4844243444444551634446643424544135465684324528815345344224634234224549498346492425564256444423334644 +3422823122474323322211211254233232242225113311222244651822522625442272221125622442222422332281437221 +6623252422332233132333335332333332244232349323342345464333133432235323413344143243122423326233443233 +2242262441326222126522262538422244221311432233276326222662122251577211323433432322272254237218227255 +1522262322523152212423563322522212212254632142224423643515523222221221124424533333236365124123422163 +4242444771425444442434324143363324444462243374423432343434743443433325334244444242663444542333332364 +4467443545345563442425445446144526644534454645534344422432453362525386241432143354236394394455643442 +6343374593516625614864577324773453644234545343335665954344436954943544863347328561423354849629433463 +6454554753858656445365796554643561451495685364644648447664466634661655686334288549414845625665536336 +4232223224223322422223222242225232232192241422224242342225222242424232212342134212122432222125232222 +4334423968793346242226322514232422321226553255315372343155358422135233422454522342335118123474233432 +3472434344433651194343225239333452324232557832655444224444434422433262332942445234324383555182422444 +4424351655527244337373445455333533736563356654243556467635353733355335333646623435448534356333545735 +3232222225222424231212121223122225224224225422122252523121122251222222321221452622226222222522122224 +2122212232422222231322222222212221121222222222232321232211222622222235722272211335212221222212232315 +6454725483654746576544566678744754568736666737374787768825686646756657486465676458756567577645549754 +6543332464452892654265421473452246152323334243132461133232268432326464344224434241334347224223637423 +2625625445315322983553485264538578269825762565283434262436532372363665472636353672583331262724383282 +3232873321113226222144282428233322212428413493131222282337243214426225432312212464183227223215322622 +5533353553464424514343342332242153433523454444333321443556343543325535242335142343654353353454554552 +2232234232322134112222233232222131322421223112222322222322312222122322121422221222223132223222421221 +2542714544725485233345575425263952272367274717554242355655462443557222473293232951342343442452324423 +1522272222252132246221322112223226252743225122222221245222123121226621223522223223222222252252222112 +2222325482123525443465251443231132323225535255131422551222625533222225254232153225134255222122243222 +6656454363343651412324333545111113136525316222354554652432154354434131665442413114245242521545146789 +4442322122221211111142431111423134131114232312212433444323424121424432331422121141332422343232356789 +3212335244334332433262134213122321124252125232331433231143313223122235224431221423232261233323231242 +4735243252264454742487242145543733424454475231547442975364451544354542541564536434255546274455744268 +2231333322232223222332242321222223213222223212355253221312232111223222343232333221422222222522332233 +1211433622312212212252257222812222298229429222234222222272222222232227219221222121422422123212322722 +4232445421241534473275551254233253262432233593325542424423222323312234235422461255251554212224221394 +2332221333232122335822323313352132222332523221332337122231331282323412322322232344233222223343434232 +2725485313222257742465511364531545622523277422426227222232736162236656569732283124765582223755732564 +2422422232232222231293223211214131221333322214223422221241221232223223222422133221343123232222211212 +4423356255222445231344243352545445254524241242223343454331311552242422314224432453144352242224445432 +2423222112524244313125332315155211253125555344355233321155112141531113141441113132323412443334156789 +2132222232222222322323425223212233214222323222221212431223222243222212322222241223222232311222233212 +3233323244222222223133244314225325253125542422222225433336144222413422222435123533244422532542733532 +3179924698386238367236593939527652322332466621532864535417839339549568538333386378572432732335294933 +4556625964624535444457459976684768643867379699957697477636867849789767443477999249975628749748535594 +4629452241643442562722514324244522252334424122221442154624212436246324434432222446882442858183638814 +2762633653564553234324556522227332322287612643631342575896463774526327166372715867363623524434541342 +6354275125434124325317724755566423441362644754622366364521264253744362443226444235265644424464421425 +5685441376483994474989626583976445565259674397656552955383597645927397356293554543768262246758236737 +3355743464265538557364156954953826744564335659344225554364562673453556857364557845562528462524532648 +2362233223421632223453484622242433341232273332325542322263251323724722123733237174753332323244476511 +2223212212222222222322222211223223122232121452523223223221222423225232122221122222622321325322221225 +2232722133422322222122222221232225311222212222333312222331212321136222233241321352225623324234222122 +2122122222221223212221222222322221522222122325212252222211222222112252222312242121231224233324522212 +2223132337112363331242233333233452222523212322133631228262514223262121583222722631526321222222163139 +4263448542324314343424413363325543434433334323134243243423633624444423334244343343421363444344453444 +2333245422112423332222554513223345313442243431132323334323233222241233235321254565235234453221354432 +7122232324231443228212622222222811323422231442226922122722222193132286284324226229232424221722326323 +2332333635333393223294339443286233343344333354433323346333333343435484332344635232331535134363334334 +4342233233223235333442222354362232461233325223213133322335223322232162123352235334432323835145224146 +5325724624322453232513342246246424252324311563425123725212653322744243224221343256233543532546328374 +5167221272721721513145417116271723735472261435635543175711143567436751671556535526773233635213713589 +4222217222352426574636595434452626345767335635745413424952434246665862444324244533526544264882645424 +3363134416249632478713332445322358253276633544356437455435523166425363424223275532472253554853752493 +8433153548467574565345443536354435745576547444746273754765547465643444685959385677525454323444357566 diff --git a/2025/4.txt b/2025/4.txt new file mode 100644 index 0000000..6577989 --- /dev/null +++ b/2025/4.txt @@ -0,0 +1,139 @@ +...@@@@@..@@@@@@@@@..@@@@.@@@@..@@.@@@@@.@.@@@@.@@@@@@@.@@@@@@@...@@.@@@.@.@@..@.@@@@..@.@@@@@@@..@@@@@@@@@@@.@@.@@@@.@@@.@.@@@.@@@@.@..@@. +@@.@@@@@.@@@..@.@@@@@@.@@@@.@.@.@@..@.@.@..@.@@@@@@.@@.@@@@..@.@@@@@@.@.@@.@.@@@..@.@@.@.@@@.@@.@@...@@..@@.@.@@@@..@..@@@@..@.@.@...@@@@@. +..@.@.@@@.@@@@@@...@@@.@.@@.@@@.@.@@@@@.@...@.@.@@@..@.@@@@@.@..@@.....@@@@@@@@@.@@.@..@@@@@...@@@@..@.@@@@@.@@@@@.@@.@@@@@@.@@@...@.@@@@@@ +.@@.@.@@@.@.@@@@@.@@..@@@@@@@@.@@...@.@..@.@.@@.@@@.@@@@.@..@.@@..@.@@.@@@@..@@@@@@@@@.@@@@@@@@@..@@@@....@..@@@.@.@@@@@@@@.@.@@.@@...@.@@. +@..@@@@.@@...@@@@@@@@@@...@@@@@@@@.@.@@@@.@@@@.@@.@@..@@@@@@.@@@@@.@@@@@@@@..@.@.@@.@@@@.@@@@@...@@@@@.@@.@..@@@..@@@@..@@..@.@@@@.@@.@...@ +@@@..@@..@.@@.@.@@@.@@.@...@@@@@.@@@@@...@@..@@.@@@@@@@@@.@.@@..@@@@.@@@@@..@@..@@@@@@@@@@@...@@.@@.@@@.@..@....@.@@@@@@@.@..@....@@@@@.@.. +@@@@.@@@@.@@@@@..@@@.@.@@@@@@@@.@...@@.@@..@@@..@@.@@@@@.@....@@.@@.@@.@.@.@@@@..@.@....@@@.@.@...@@.@.@@@@@@..@@@..@.@@@.@...@.@@@.@.@@@@@ +@@@@@@..@@@@@@.@@@@@@@@@@..@@@@.@.@@@.@@@..@@@@@@@....@@..@@.@@@@..@.@@.@.@@.@@@@.@@@@@..@...@@@@@@@@@@@.@@@.@@.@.@..@@@.@@..@@.@@@@@@@..@. +@@.@@@..@.@@@@.@@@@@@@@@@@@.@@@@@@.@@.@..@@@@..@@@@@@@@....@.@@@.@@.@@@.@@.@.@@@@@@@..@@...@@@@.@@@@..@@@@.@@.@...@....@.@...@@@.@@..@@...@ +@.@@.@@@@@@@@@@.@@@.@@@@.@@@@@@.@..@..@@@@@..@@.@@..@@.@@@.@@.@@..@@@.@@@@@@.....@@@@.@..@@@@.@@..@...@.@@@@..@.@@@.@@@..@@@@..@@@@@@@@@.@@ +...@@@@@.@@.@@@.@...@.@..@@.@@..@@@@@@@@@.@@@@@@@@..@@.@@@...@@...@@@@@@@@@@...@.@@.@.@@.@@@@@@.@@@@...@@@@@@@@@@@@.@..@@@@@.....@@@@@..@@@ +@...@@.@@@@.@@@@@....@@@@.@@..@@@..@.@@..@.@.@@...@.@...@@......@.@@@@..@@@@@@.@@@@.@@@@@@@@@@@..@@@@@@.@@.@@@@..@@@@.@.@@@.@@.@@.@..@...@@ +@@@@.@.@@.@.@.@@.@@..@@@@.@.@.@..@@@@..@@...@@@@.@@@@@.@.@@.@@@@@.@@@@@@@@...@.@@..@@@..@@@.@@@@.@@.@@.@@.@.@@..@@.@.@.@@@@@@.@@...@@@..@.. +@.@....@@@@@...@@@@@.@@@.@.@@@.@@.@.@@@@@@@@.@@.@@.@@@@.@.@@@...@@@@@@.@..@@@.@.@.@@@.@@@@.@@@..@@@@..@.@@@@.@@@@@@.@.@@@@.@.@.@@@..@@..@@@ +@@@@@.@.@.@@@@....@@.@.@.@@@@.@@..@@.@..@@@@.....@@@.@@.@.@@.@@@@@@@@.@...@@@@@...@@.@@@@@@@@.@@@@@@@.@@...@@@@.@.@@@.@....@@@@....@@@...@@ +@@@@@@@@.@@.@@@@..@.@.@..@@.@.@..@@@@@@@.@..@@@@@.....@....@@@.@@.@@.@.@@.@@.@@@@.@.@@.@..@@.@@..@@@..@@@.@@@@@@@.@@.@@@.@..@@@@@..@@@.@.@@ +@@@..@.@.@@.@@.@@.@.@....@@@@.@@@@@.@@...@@@@@@...@@.@@@@@@@@@..@.@...@.@....@.@@@@@@@...@@..@.@@@.@@@@.@@.@@@@@.@@@@@@@@..@.@.@@@@@@@.@@@. +@@@.@@@@@.@..@@.@@@..@.@@....@.@@.@.@@@@@.@@@@@.@..@.@@@@@.@@..@@.@.@@@..@.@@@@.@@@@..@@@@.@@@@@.@@.@@.@@@.@@@@@@@@@@@.@.@.@@@@@@@@.@@...@. +@@...@.@@@.@@..@@.@@@.@..@.@...@@.@@@@@@@..@..@@.@...@@@@@.@@@.@@@@..@@@@.@@@@@@@@.@@@.@@@@....@@@@@.@@..@.@.@@@.@@@@@.@.@@@@@@@@.@.@@@@@@@ +@@@@..@@...@@.@@@..@@.@.@@.@@.@@@.@@@.@@.@@@.@...@@@@@..@.@@@@@.@@@@..@@@@.@.@....@..@@@@@@@......@.@@..@.@@@.@@@@@@.@.@@@.@.@@@..@@@@@@@@. +@.@@.@..@@@.@@@@@@..@@@.@@@..@@.@@@@@@.@@@.@@@@@@@@@.@.@...@@.@.@.@@.@@@@@@..@@@@@.@@@@@.@.@@@...@@@...@@@@@@@@@..@.@.@@..@@..@@@..@.@@@@.@ +@@@@.@@@@@@@@@@@@@@.@@@@@@.@@@.@@@@@@..@@@@..@@@@@@@@.@...@....@@@@.@@...@@@@@.@@@@...@@.@@@@@@.@@.@@@..@..@...@@@@@@@@.@@@@.@@@.@@@@@@.@@@ +.....@@@@@@@........@....@@@@@..@@.@@.@...@@@..@@@@@@..@.@@@.@@@@@.@..@@.@@.@@.@@.@@@@@.@@@@.@@@@@.@.@@@..@@..@@.@.@.@.@.@@@.@@@.@@.@.@...@ +.@@.@@..@@@.@@.@...@@@@@.@@@...@@@@@@@@@..@@.@@@.@@.@@@..@@@...@@@@@.@@@@...@@@.@@@...@.@@.@@@.@@..@.@.@@@@.@@@.@@@..@.@@@@@@@@@@.@@@.@.@.@ +.@@@@..@@@@@.@.@.@.@@@@@@@@.@@.@@@@.@.@..@@@@@@@@@.@@@@@.@@@@@@@@.@@@.@@@@@@..@..@@@.@@@..@@@....@.@@@@@..@@.@..@@.@@..@@@.@@..@@@@@@..@@.@ +@..@@@.@..@.@@@@@@@@..@@@.@@.@..@...@@...@@@@@@@@@.@@@@@@.@@.@@@@@@@@.@@@...@@.@.@..@.@@@@.@....@@@@@@.@..@@@.@@@@.@@@.@@@.@.@.@@.@@@.@@@@@ +@.@@@@@@.@@@@@@.@@@@@@@@.@.@.@@......@@@@@..@..@@@@@..@@@.@.@.@@@@.@@@.@...@..@@@@@.@@@@..@@@@@@@@@..@@@@.@@@@@..@@@@.@@@.@@@@@.@.@.@@..@@@ +..@..@@.@@.@.@@@@.@@.@@@.@@@@@..@@@@@@..@@@@@@.@.@......@@..@@@.@.@@.....@@.@.@@@...@..@@@@@.@@.@.@....@@.@.@@..@@@@.@@.@@@.@@.@@@@..@.@..@ +@@@@@..@@@@@@..@@.@@@.@..@@@.@@.@@.@@@@.@.@.@..@@@@@@@@@@@@..@@..@.@@.@@.@@.@.@@.@.@@...@.@.@.@@@.@@@.@@@@@@@@@@..@@@@@.@.@.@.@@@.@@..@.@@@ +@@.@.@@@@.@@.@.@@.@.@@.@@..@@@@@@...@@@@.@@.@@@..@@@.@..@.@.@@@@@..@@@@@.@@@@@@.@@@@.@.@@@@...@..@@@.@.@..@@..@@..@@....@@.@@@@@@@@..@@@@@@ +..@.@....@@@@.@@..@@.@@...@@.@@@...@.@..@@.@@@@.@@@@@..@.@@@@..@@@@@@@.@@@.@.@@.@@@@@@@.@@@.@.....@..@@@@.@.@@@@.@@@.@@@.@..@@@@@.@@@@@.@@. +@@..@@@@@.@@@@@@@.@@@@.@@@@....@..@..@@..@@@@...@..@@.@.@@@@@@@@..@@@.@..@@@@@@@..@@@.@@@@@@@@@@@@@@.@@.@@@@@.@.@.@.@.@@.@@.@.@.@@@@.@.@@@@ +@@@.@@@@@.@..@.@@@@@@.@@@@@.@.@@@...@@.@..@.@@@@@@.@.@@.@@@@@.@@@..@@.@..@@@@..@.@.@..@@.@.@@.@@.@@@@...@@@..@@@@@@@@.@@@@@@.@...@..@@@@@@. +...@@@@@@@@@..@@@.@@..@@.@@.@@@.@@@@@@@..@..@@.@@@@@@@@@.@...@@@.@..@@@@.@@@@.@@@@@.@.@....@.@.@..@...@@.@.@@@@@.@@@@@.@.@@@@@@@@@.@.@@.@@. +@@.@.@@@@..@.@@@@@.@@@@@@@@.@.@.@..@@.@.@..@@@@@@@@.@@@.@..@@.@@@@@@@@@@@.@@.@@.@@@.@@@@.@@@.@..@@...@@@...@.@...@@.@...@@@...@@.@.@@.@@@.. +..@@@@@..@@...@@@@@...@@.@@@.@@@@@@@@..@.@@.@@@@.@.@@@@@@@@...@@.@...@@@.@@.@@@@.@@@@..@@.@@@@@@@..@.@@@@@..@..@@.@@..@..@.@@@.@@@@.@....@@ +.@@.@.@...@@.@@@@.@@.@@.@@@.@@@@.@.@@@@.@..@@@@@@@@.@@@...@@.@.@..@.@.@@.@....@.@@@..@@.@@@@@@@@..@.@...@@@@@@@@@@@..@..@@@..@.@.@..@@@..@@ +@@.@@.@@@@@@@.@@..@@@@.@@@@.@@..@@.@..@@.@@@@@.@..@.@@@@@@@@.@@.@@..@..@@@@@@.@..@@@@.@@.@.@@.@@@@@.@@@@.@@@@@@@.@.@@@..@@@@@.@@@@..@@@@@@@ +@@@@.@.@@@@@@@@@.@@.@@@@@@..@@.@.....@@@@@..@@@@@@@.@....@@@@.@@.@@@@..@@@@...@.@@@@@.@..@@@@@@@.@.@@..@@@@@@.@@@.@@@@.@.@.@@.@@@@@@@@@@@.@ +.@@.@.@@@@@....@@..@..@.@.@..@@.@@..@.@@@@@@@..@@@@@@@.@@@@@.@..@.@.@@@@@@@@.@@.@@@@@@.@@@@@@@.@@@.@@@@@@@@@@@@@.@@.@..@@@@@.@@.@.@.@.@.@@@ +@@.@@@@@.@@@@@...@@@.@.@.@.@...@.@.@@..@@@@@.@.@.@.@.@@@@..@.@@.@@@@@@.@@@@@@.@@@@@..@@@.@@@@@@@.@@.@@@@..@..@.@@..@.@.@.@..@@.@@.@..@...@@ +@@@@@..@@.@@@@..@@@@@@@@@@@@@@..@@@@@@@.@.@.@@.@@@.@...@.@@@@..@@.@.@.@@@.@.@@.@@@@..@.@@@@..@@@@@.@@@@@@@@..@.@@@@@.@@.@@@@.@.@.@@...@..@. +@@@@@@.@.@.@@@.@.@@@@@.@@@@.@.@@@@.@..@@@@@.@@@@.@.@..@.@.@@.@.@@..@@@@@@.@.....@@@@.@.@..@@..@@@..@.@.@.@@.....@@..@@..@@.@@@.@@@@.@@.@..@ +@@.@@@.@@.@@.@@.@@@@@@@@@.@@..@@..@@.@@@@.@@@.@.@.@@@@@@@@@...@@.@@@@@@@@@.@.@@@@@@@.@@@..@.@@.@@..@@.@.@@@.@@@@@@@@..@@@@@@@..@@@.@@@@@@.. +@@@@@..@.@.@.@.@@@@@@@.@@@@@@@@.@@@.@@..@@.@.@.@@@@..@@@@.@@@@@@@.@@....@..@.@@..@@@@.@....@@@@.@.@.@@@@@.@@@@@.@.@@@@..@@@.@@.@....@@.@@@@ +.@@@@@@@..@@.@@.@.@.@@..@..@@..@@@@.@@..@@@.@@@@@@@@@.@.@@.@.@@@@@@@@..@@....@..@@@@@@..@.@.@@@.@@.@.@@@.@..@@@.@@@@@@@..@@.@@@..@@@@.@@@@@ +@...@@@...@@.@...@.@@@@.@@@@..@.@@@@..@@..@@..@@.@..@@@.@@.@..@.@.@@@@.@@@@@.@.@@@..@@.@@@@@@@@.@@.@.@@@.@.@@@@@@.@.@@@@@@@@@.@@.@@@@@.@.@@ +.@@.@.@...@@@.@@@..@...@@.@@.@...@@@.@....@.@@@.@@@@@@.@.@...@@.....@@.@@..@@@@@@@@@.@.@.@@@.@...@@....@@..@@@@@.@@@@@@@@@@.@..@@.@@@@...@@ +..@@@@@.@..@@@@@.@..@@@.@..@.@@@....@@@..@@@@.@@.@.@@@@...@@.@.@.@@@..@@@@@@.@@@@@@@..@@@@@@@....@@.@@....@@@@.@.@.@@..@.@@@.@.@..@@@@@..@@ +@.@.@@@@@@@.@@@.@.@@@@@@@@@.@.@@.@@@..@@@.@@@..@@@@.@.@@@@.@..@.@@@@@@@@@@@@@.@@....@@@@@@.@@@.@@@.@@@@@@@.@@.@@@@.@@@@@..@.@@...@@@@@@..@@ +.@@@@@..@@.@@@.@@.@.@@..@@@@@@@.@.@..@@@@.@@@@@@@@@..@@@...@@.@@@@@@@@@@..@..@@@@@@@@.@.@@@@@@@..@@@@@@@@@@@..@.@@@.@..@.@.@@..@.@@@..@@.@. +...@@@@@@.@@@@@@@@@.@@@@@@@..@@@@.@@@.@.@@@@@@..@.@@@@..@@.@@@@@.@@@.@.@@.@..@.@@@@@.@.@@.@@.@..@@@..@@..@@@.@@@.@.@@@..@.@@@....@@@..@@@@@ +@..@..@@@@@@@@@@@@@@@....@@@@@@.@@@@@...@@@@.@@@.@.@@@..@....@@@@@..@@...@@..@@@@.@@..@@@@@.@@.@..@@.@...@@@@..@.@@@@@@.@.@.@@.@@.@@.@.@@@@ +....@.@@@..@@@...@.@@.@@@@.@@.@@@@..@@@@@@@.@@@@.@@@@@.@@@.@@..@@...@@.@@..@.@@@@@.@@@@@..@.@@...@@.@@.@.@@@.@.....@@@.@@.@@.@@..@..@.@@@.@ +@@@@@@@.@@@@@@..@..@.@@@.@@..@@@@@@@.@.@@@..@@@@@@..@@.@@@@@@@@@.@@@@@@@@@@@.@.@@.@@@@..@.@..@@.@@.@@@@.@@.@...@@@@@@@@.@@.@@..@@@@..@@@@.. +@@@@@@.@@@@.@.@.@@.@@..@@@.@...@@@.@@@@.@@@@..@.@..@@@@.@..@@@.@@@@@@@@.@@@@..@@@..@@.@@@.@@@@.@@@.@.@.@@@@@.@@.@@@@@...@.@....@.@.@@.@.@@@ +@@..@@@...@@.@@@.@.@@...@@@@@@@@@.@@@.@@..@@@.@@.@@@@@.@.@@@@@@..@@@@@@@@@@.@@@...@....@@....@..@@.@.@@..@@@@@@@@@.@@@@@@@.@...@..@@.@@@.@@ +@@.@.@@.@@@@@@..@.@@.@...@@@@@@@.@@@.@.@@@@@.@@@@@@.@..@@@@@@@.@@.@@@@...@..@..@@.@@.@..@@@@..@.@@@@.@@@.@@...@@.@...@@@.@.@@@.@@.@.@@@..@@ +@..@.@.@@.@......@.@@@@@@.@@.@@.@@...@@@@@@@@@@@@.@@@@@@@@.@.@.@@.@..@@.@@.@@@@@.@@.@.@..@@@.@@@@@@.@@@@@.@.@@@@@.@@..@@@.@@@.@.@@.@@@@.@@. +@..@@.@.@.@@.@.@.@.@.@......@@@.@@@@@@....@.@@@.@.@@@.....@@@@@@.@@@@@@@@@@@...@..@@@@@@..@.@.@@@@.@@@...@@@@...@@@.@@@@.@.@.@..@@@@@.@.@.. +@@@.@@...@...@.@@@@@@....@@@@@.@.@@@@...@.@@..@@..@.@.@@.@..@.@@@@.@@.@.@@.@@@@@@@@@@@@.@@@@.@.@@@@@@...@@@.@@.@@@@@...@@@@@@.@.@@..@@@.@@@ +.@.@..@@.@@@.@@@.@...@@.@@.@.@@@@...@...@@@.@@@@..@.@@.@@..@@..@@.@@@.@.@@.@.@.@.@@@@.@@@@@@@@@@@.@@@@@@@@@@@@.@.@@@.@....@@.@.@@@..@@@@.@@ +@@..@.@@.@.@.@@.@.@@@@@@@@@@.@..@@.@@@..@.@@.@@@@..@...@@.@.@@@@...@@@@@.@.@@..@@@.@@@@@@@@.....@@@.@@@..@@@@@@@@.@@@..@@..@.@@.@.@.@@.@..@ +..@@.@@.@@.@.@@@@.@..@..@@@@.@@.@@@@@@.@@@@@..@@@.@@@.@.@@@@..@..@@@@@@@@.@@..@@@@@@@.@.@@@@@..@@@@@@.@@@.@@.@@@.@...@@@@@@@@@..@.@.@...@@. +@@.@@@.@.@.@@@@@@@.@@@@@@.@@@@@..@@.@@@.@@@@@...@@@..@.@@@@.@@@@@..@.@..@.@@@@.@@.@..@@@@@@@@@@.@.@.@.@@@@@@@@.@.@@..@@@@.@@@.@..@.@.@...@@ +.@@@.@@@.@@@@.@.@.@@@@@@@..@@@@...@@.@@.@.@@@@@..@@.@@@@.@@.@@.@@@@.@@.@.@@.@@.@@..@@@@@...@.@.@@@...@@@@.@..@@@.@@@..@@..@..@.@@.@@@@@@... +@.@@@@@@...@@@@@@.@@@@.@@.@..@@@@@@@@@.@.@@@..@..@@.@...@.@@@@.@@@.@..@@.@@@...@@.@@@@.@.@.@@@@@.@@@@@.@@...@.@...@.@@@@@@@..@.@.@.@@.@.@@. +@@@..@@@.@@@@@@@@@@@..@.@.@.@..@@@@.@@@..@@.@@.@@.@.@....@.@.@@.@@.@@@@@.@@@..@@@@@@@@@..@..@......@.@.@.@@@@.@.@.@@.@@@@@.@@.@.@@.@@.@@..@ +.@...@.@@@@@@..@@@@.@.@@@@@@@.@@@@@..@@@@@@..@.@@@@...@@@@..@@@@@@...@@@@.@@@@@....@@@.@@@@@@@.@..@@@..@@..@@@@...@@.@.@@@.@@.@...@@.@@.@.. +@@@@..@@@@@@..@@@@@.@.@@@@@@@@@@....@..@@@.@@@.@.@.@..@@@@.@....@@@@@@@@@...@@@.@@@@@@@.@@@.@@@@@@@@@@@@...@@.@@@@@@@@.@@@.@@@.@@.@@@.@@@.@ +@@@.@.@@.@.@@@@@.@.@@@@.@@.@@@..@@.@.@.@@.@@.@@..@@@@.@@@@@@..@@@@@..@.@@@@@@@@@@@@.@@.@@.@@.@@.@..@..@..@.@@@...@@@.@.@.@@@...@@@@@@@@.@@. +.@@....@...@@..@@@.@@@@@.@@.@@@..@@...@@@@.@.@@@@@@.@..@@@..@@@@..@@@@@@@@.@....@@.@.@@@@@.@@@@@..@@@@@@@.@..@@.@@@@@.@@@@..@@.@.@.@@@.@@@@ +@....@@@@.@.@@.@@.@@@@@..@@@.@.@@@@....@@@@.@@.@@@.@..@.@@@@..@@@.@@@.@.@@..@.@...@@@.@....@@@@@..@@@@..@@@..@..@.@@@.....@....@@@.@@@@@.@@ +.@@@@@.@.@.....@.@@@@@@...@@@...@@.@@.@.@@..@@@@@@@.@@.@@.@@@@.@@@@@.@.@@.@@@..@@.@..@@....@.@.@..@@@.@.@@.@@@@@.@@.@@.@@@@@..@.@@.@@.@@@@. +.@@.@@@.@@.@.@.@..@.@.@..@@@@....@@@@..@@@...@@@...@@.@.@...@@...@@@@@.@.@@...@@.@@.@@.@.@@..@@..@@.@@@@@.@@@@@@@@@@@.....@@@.....@...@@@.@ +@.@.@@@.@@.@@@@@.@.@..@@.@@@@.@.@@@@@@@.@@@@@.@@@@@@.@...@.@@.@@.@.@@@.@@@@@@@@@@@@@@.@.@@..@@@@@@@@...@.@.@.@.@@..@@@@@@@@@@@@.@@@@..@..@. +.@.@@.@@@..@.@.@.@@..@.@@@..@@@..@.@..@@.@.@@@.@@@@@.@.@.@@.@@@@.@@@@....@@.....@@@..@@@.@@@@@@@@.@@.@@..@@@@@@..@..@.@@.@@....@@@@@@@.@.@. +..@.@@.@@@@@@@@.@..@@@.@@@...@.@@@.@@@...@.@.@..@.@@@@@@@..@..@..@...@@@@@.@@@..@.@@.@@@@.@.@@@@..@.@@.@..@@..@.@@....@@@.@.@@@.@.@@..@@@.@ +@..@@@.@@..@@@.@@@.@@..@.@@..@@@@@@.@@@.@.@.@@@.@@@@@.@..@@..@@@@@.@.@.@@...@.@...@@.@@.@@@@.@@@.@.@@@.@....@@.@@...@@@@@..@@@..@@@@.@@@@@@ +.@.@@@@@@@@@@@..@@.@@.@@@..@@.@@.@@@.@.@@@@.@.@@@@@.@@@@...@.@@@@.@..@@@@@.@.@@@.@@@...@..@@.@@@@@..@@@@@@@.@.@@@..@.@@@..@@@.@.@@@..@....@ +@@@.@@@..@@..@@.@.@@@@..@.@@@@@@@@@@....@@@.@@.@.@@.@.@.@@@.@@@.@..@@@@@@.@@@@@@...@@...@@@@..@@@@@@@@@@@....@@@@@@.@@@.@@.@@@@@@@@.@@@@.@@ +.@@@@.@..@@@@@@@@.@@@@@.....@@@@@@.@....@@.@@@@..@..@.@.@.@@@@@..@@@@..@.@@@.@@@@.@@.@@@..@..@@@@@.@@@..@@.@.@@.@@.@.@.@.@@.@.@@@..@@@@@@@@ +@@@@@@@@@@@...@.@..@.@.@@@.@@@.@.@.@..@@.@.@.@@@@@@.@@@..@.@@.@@@@@.@..@@@@@@.@.@@@@@@@.@.@..@@@.@.@@@.@@@@.@@@.@.@..@.@@@@@@@@.@@@.@@@@@@@ +..@.@..@@.@...@@@@@@@@@@@@@.@.@@@.@@@@@.....@@@@@@@@@@@.@@..@@@.@.@@@@....@.@.@@@.@@..@.@@@.@@@..@@@@@@@@.@..@@@@@@@@.@@@@@.@.@@.@@@..@@..@ +@.@.@.@@....@@.@@@@@@.@.@.@@@.@@.@...@.@@@@@.@@..@@.@@...@@@@@@@.@@@@@@@@@@..@.@..@.@.@.@.@.@..@@@@@@.@.@@@@.@..@.@.@@.@..@@@...@..@..@.@.. +@@@.@@@.@@@@@@@@.@@.@..@..@@.@.@@@@@@@@@@@@@@@@@..@@@@@@@.@@@@@.@.@..@..@@..@@.@@@@@.@@@@@.@@...@.@@@@@..@@@@@@@@.@@@.@@@@@@@..@@@@.@@.@... +@@@@.@@.@@@@.@@.@@.@.@.@@@@.@@@@.@.@.@@@@@@...@..@.@@@...@@@@.@@@@@@.@@.@..@@@@@@@..@@@@@@.@..@@@.....@@....@@@@.@@@.@@.@.@..@..@@@@@.....@ +..@@@.@.@@.@@@@@@@.@.@@@@@..@.@@@@@..@@..@@@.@@.@@@@@@@@@@@..@@@.@.@@.@.@.@@..@.@@.@@.@.@@@@@@@@.@@@@@@@.@.@.@@@@@.@@@...@@@@..@@.@@@...@@@ +@@.@@..@.@@@@@..@@..@@@.@@@..@..@.@@.@@@@@@@@.@@@@@@@@.@@.@@@.@...@@@@@@@@.@...@...@@@...@@@@@.@@.@.@..@.@..@@@@@@@..@@.@.@@@.@@@.@...@..@@ +@@.@..@.@@.@.@@@.@@.@...@@.@@.@@.@@@@@@@@.@@.@@@@@@@@.@@.@.@@@@@.@..@@@@@@@@.@@@@...@.@@@...@@@@@...@@@..@@@@@@.@@@...@.@@@@@@@.@@@@@@.@... +@.@@@.@..@@@.@@@@@@..@@@...@@.@@@@.@@.@@.@..@@@@..@@.@@@@@..@...@.@@.@@..@@..@@..@@@@@...@@@@@@@@.@@@@.@.@@@..@@...@.@@@...@@@@@@.@@..@@.@@ +@@@@.@@.@@..@@.@@.@.@.@@@@.@@@@@@.@...@@@@@.@@@@@@....@@@@.@@@@@@@@@@@@@@..@@@@@@@..@@@@....@@@@.@..@@....@@@@@@@.@.@@@@@@@@@@@@@@@@..@@..@ +@@@@.@.@..@.@@@@.@@@@.@@@@@@.@@@@...@@@@@@...@.@@@@....@@@@.@@@@..@@.@@@@.@@@@@..@@@@.@.@@@.....@@.@@@.@..@@@@.@@.@@.@@.@@.@@...@...@@@@..@ +.@@@@@.@..@..@@.@@@@@@@@@..@@.@..@.@@.@@..@@@@@@@@@@.@..@.@@@@@@@.@...@@.@@..@..@..@@@...@@@@.@@@@@@@.@@.@.@.@@..@.@..@.@@.@@@@@@@@.@.@.@.. +@@@@@@@..@@@@@@.@.@@@@@@@@.@@.@.@..@.@@.@@@@..@.@@.@.@@@@@@@..@@@@.@@@....@@@.@@@@.@@..@@@..@...@.@@.@.@@@@@.@@@..@@@....@..@@@..@@@@@.@@.. +@.@...@.@.@@@.@@.@.@@@@..@.@.@...@..@.@@@@...@.@@@@@..@@@@@@@@...@.@@.@.@.@@@@@@@@@..@@@.@@@@@@@@@@@@@@@@..@.@.@.@@@@@.@@.@@@@@.@@@@@.@@@@@ +@@@@.@@@@@@@.@@.@@.@@@@.@@.......@..@.@@...@@@@@@@@.@@@@@.@.@@@@@@@@.@@....@@...@.@@@..@@@@@@..@.@@...@.@.@@@@.@@@.@....@@@@@@@..@@@@@.@@@@ +.@@..@.@@@.@@@..@@@@@@@@@@@@@.@...@@@@.@@@.@@@@@@@@.@@@@@.@@@..@@.@@@.@@@@@.@@@@@.@@@@@@@@@@@...@..@@.@.@.@.@@@.@@.@@...@@.@@..@@@@..@.@.@@ +.@@.@.@..@@@@.@@.@@@.@@..@@.@@@@@@@@@@@@@@....@.@@..@.@@@..@@@@.@@..@@@.@@@@@@@.@..@......@.@.@@@@..@..@@@@.@@@@..@@@.@@@@..@@.@.@@@@@@.@@. +@..@@@@..@@.@@..@@..@@.@@@@@@.@@@@.@...@.@.@.@@.@@.@@.@@@@..@@@@@@@@@@@...@@@@@.@@.@.@@..@@........@.@@@@@.@..@@@@..@.@......@@@@.@@@@@@@.@ +.@.@.@@@..@@@@@@@@@..@@@@@@@@.@.@@@@@...@@..@@@..@.@@@@.@@..@.@@.@@@@.@@..@.@.@@@.@@.@@@@@@@@@@@@@..@@..@@.@@@@...@@...@@@@@@@@.@@@.@@.@@@@ +@..@@.@@@@@@@@@..@@@@@@.@..@.@@@..@@.@.@@.@..@@@@@@@.@@@@.@@@.@@.@@...@@..@@@.@@..@@@@.@..@.@.@.@@.@@@@@@@@.@...@@.@.@@@@@.@.@@@.@.@@.@.@.@ +.@@@...@.@....@@@.@@@@...@@..@@.@@@@@@@@@@@@..@..@.@@@.@.@@..@.@@.@.@@@@.@.@..@.@@@@@@@.@.@.@..@@@@@...@@@@@@@@...@@@@@@@@@.@@@@@@@..@@@@@@ +.....@...@.@@@..@@@.@@@@@.@@.@.@.....@@.@@...@@@@.....@@@@.@@@@@@@@.@@@..@@..@@.@@.@@@@@@@@..@..@..@@..@.@..@@@.@@@@.@@@@@@@..@@@.@@@..@@@. +.@@@@.@@..@@.@@@@@@@..@@@.@@@.@@@@@@.@@....@@@@.@@.@.@.@@@..@..@.@@..@@@@@@@@.@@@.@..@@@@.@@@.@.@@@.@@.@@@..@@@@@@@..@.@@@@@.@...@.....@... +.@@@@.@@@@..@.@@@@@@...@@@@@..@@.@@@@..@.@@.@@..@@@@@@..@@@@@.@@@@.@....@@@@@@@@@.@.@@..@@@@.@@@@@@.@.@@@@@@@@@@@@.@.@@@@@@@@@@..@.@.@.@... +@@..@@@.@@@.@@@@@@..@@@@@@.@@@@@@..@@@.@@..@@@@@@@..@@@@@@.@@@@@@@@@@@@@..@.@.@.@..@.@@@@@@.@@@..@....@.@.@@@...@@.@.@.@@@@@@.@.@..@@..@@@@ +@@..@@.@@@@@@@@@.@@@@@@..@@@@@..@@@.@@..@@@@@@@@..@..@.@.@.@.@.@..@....@@.@@@.@@@@@@@@.@@@.@@@@@@.@.@.@@.@..@@@@@@@@@.@@@@..@..@.@@...@.@@@ +@@@@@@@@@@@@.@@@.@@@@@@@@@..@.@.@....@@@.@@.@@@@@@....@@@.@@...@@@.@.@@@..@@@.@@@.@@@@@@.@@@.@@@@.@.....@@@@@@@@.@@.@@@@@@@.@.@.@.@@.@@.@@@ +@..@@@..@.@..@@.@@.@@@@@@@@@@@@@@@@.@@@...@.@..@...@.@@@@@@@@@..@@.@@@@.@.@@@@..@.@@@@@@@..@@...@@@..@..@..@@.@@@@.@@@.@@@..@...@.@.@@.@@@@ +@@@.@@.@@@..@..@@@@@@@@@@.@...@@@@.@@@.@.@.@.@@@@@.@.@@@@@.@@.@@..@...@@@..@.@.@.@@@@@@.@@@@..@@@@.@.@..@....@@@.@@.@@@@.@@@@@@..@@...@@.@. +.@@@@.@@@@@@.@@@@@...@@@@.@@@@.@@@..@@@@@@@.@@@@@@@@@@...@@...@@@@@@...@@@@@@@.@@@..@..@@@.@..@.....@..@.@@..@@@@@@@@@..@@.@.@..@@@@@@.@@@@ +@@.@@@...@.@@@@@.@...@@@.@@@@.@@@.@@.@@@.@.@@@@...@@@@.@@.@@@.@@@...@.@..@@@.@@@@@.@.@@@.@@@@@@@.@@..@@@@...@..@...@@@..@@@@@@@.@..@@..@@@. +@@@@@.@@.@..@@...@@@@.@@@@@..@@@..@@...@...@@@@@@@@@@.@@.@.@.@@.@@@@@@..@@@@@@.@@@@@@@@.@@@.@.@..@@.@@@@...@..@@@@@@.@.@@..@@..@@....@.@@@. +.@@@..@.@.@@@@@@.@@.@@@@@@.@@@.@@.@.@.@@..@...@.@@@.@.@@.@@@@@@.@@.@@@@@..@@@@...@@@..@...@@...@@..@.@.@@@.@.@@@@@.@@.@@@@.@@@.@@@@...@@@@@ +@@.@.@..@@....@@.@@@@@@@.@@@.@..@@@@..@@@@.@.@@@@@.@@....@@@@@@@@@.@@..@.@@....@.@.@.@@@@@@@@.@@@@..@..@.@@.@@@..@...@@@@@.@..@@..@@@.@.@@. +@@.....@@@@@@@..@@@....@@@.@..@..@@.@..@@..@..@.@@@@.@@.@@@@@@.@@@..@@@.@@.@.@.@@@@@@@@@.@@..@.@.@@.@@@@@...@.@@@@@@@@.@@@@.@@@@.@@@..@.@@@ +.@@....@@@@@@@.@@@.@.@@@.@.@@..@.@@@.@@@@@@.@@@@@..@@.@@@.@@..@.@@..@@@@@@@@@@@@@@...@@@@.@.@....@..@@@.@@@@@..@@@@@.@@@@@@@@@@@.@...@@@@@. +..@@@@.@@..@@@@@.@@@@@@@.@@..@@@@@.@...@@..@.@@@@@@@@@@@@@@@.@@@@..@@@.@@@@@@@@..@@@@@...@@@@@.@@@@@@.@.@.@...@@@...@@@@@@.@@@@.@@..@@@@@@@ +@@@.@@@@@..@@@....@.@.@@@.@..@@.@@@@@@@@.@@..@@.@.@@@@.@..@@@.@@.@@@@@@@@@@.@.@.@@.......@@@@@..@@@..@@@@.@@@@@@@@@.@.@@@.@@..@@..@@.@@@..@ +...@@@@.@@@@@@@@@@@@@@..@@.@..@.@@.@@@@@@@@@@@.@@.@@@@.@.@@@@.@@@@@...@.@@@.@@@@@.@@.@@@..@@@..@@@@@@@@@@@@@@@@@@@@@@@..@.@.@.@.@@.@.@@@.@@ +@.....@@@@.@@@..@@@@..@.@@.@@@.@@.@@@@@@..@@@@@@@@@@..@..@@.@@@.@@@@@.@@@.@@@@@@.@.@@@@@@@@@@@@@@..@@..@.@@.@@@@..@@@.@@@..@@@...@@@@.@@@@@ +@...@.@.@@.@@@@@@@..@.@@.@@@...@@@@@@@@@@@@.@@@@@@@@.......@@@..@@.@@@..@.@@.@.@@@@@..@...@@.@..@.@.@@@@@@@@@.@@.@.@...@@@.@@@@.@@@.@..@@@. +@@@@@@...@@.@@@@.@@@@.....@@.@@@.@..@@.@@@@@@@.@@.@@@@@@.@.@.@@@@@.@..@@@@@@@@@.@..@@.@@@.@@@.@.@.@@@..@@..@@@.....@....@@@@@@@.@@@@.@.@..@ +.@@..@@@@@@@@@@.@@@.@@@@..@@@.@@@@.@@@@@...@..@@@.@@.@@@@.@..@@.@@@.@.@@...@@@@@@...@@@.@@@@@@@@@@..@..@.@@@@@...@.@@@@@..@@@@.@.@.@@@@.@.. +@@@@..@@..@@@@@@.@@@.@@@@@...@@@@.@@@..@@.@@@@@@.@.@@@@.@@..@@@@.@@@.@...@......@@@@@@..@@@@@@.@@.@@@@..@@.@@@@.@@.@@@.@@.@@@@.@@..@@..@@.@ +@@@..@@@@.@.@@...@@.@@@@@@@....@.@@..@@@@@..@.@@@@@@@..@@@@@@..@.@@.@.@@...@...@@@.@@@@@@..@.@@..@@@..@@@.....@.@@@@@@.@@.@@@.@@.@@@@@@.... +...@@@.@..@@@.@.@@@@@...@@.@@.@@@.@@.@.@.@@.@@@@@@@.@@@@..@@@@@@...@@@..@..@.@.@@.@@@@@....@@@@@@.@@@@@@@..@@..@.@@@@@@@@@@@.@@@@.@@.@@@@@@ +@..@@@@@..@@@@...@.@@@.@@@.@@@@..@@@.@@@@@@@@@@..@...@@..@@@@@@.@@@@..@@@@@@@@@.@.@.@@@..@@@@@@.@.@@@...@@@.@@@.@@@@@@@@@@.@@.@.@...@@@@@@. +..@@@@@@.@@@.@@@@@@.@@@@@@@..@.@.@@.@@@@@@@@.@.@@@@@.@@.@.@@..@@@@@@.@@..@..@@@.@@@@@@..@.@...@@@@.@@@@..@@@@@@@@@@.@.@@.@...@@@....@@..@.@ +.@....@...@@@@@@..@.@.....@@.@@@.@.@.@@.@.@.@.@@@@@.@@@@.@@@@@.@@.@@@@@@.@@@.@@@.@..@@@@@.@..@@@@@.@.@..@@.@@...@@.@.@@@.@@@.@.@@@@@.@@@@@@ +...@.@@@@@@@@@@@..@..@@@.@@@@@@@.@@@.@.@@.@@@....@.@@@.@@@@..@@.@@.@@.@.@.@@@@@@...@.@@..@@.@.@@..@.@@@@.@@@...@..@.@@@..@..@@@@@@@@..@@..@ +@@.@@@@@@@....@.@@..@.@@.@@@.@.@@@......@.@@@..@.@.@.@...@@..@@@.@@@.@.@@@@@..@@@@.@..@@@@@@@...@@@@@.@....@.@@..@@@@@@@@.@.@@@.@@@@..@..@@ +@@.@@.@.@@.@@@@......@..@.@@@@@.@@.@@@@@@@@@@@.@@@@@@@@@@@@@@@@@@..@@..@@@.@@@.@@@@@.@.@@@@@..@.@@...@@@@..@.@.@...@@@@@@@@@.@.@@@.@.@@@@.@ +@@@.@@@@@@@@@@@@@@@.....@@@..@@@.@.@.@@@.@..@.@.@.@@...@..@..@.@@@.@.@@@@@@.@@...@.@@@@..@@@@@.@@.@@@.@..@@..@@@@@@.@@@..@.@.@@.@@@@@@..... +@@..@@@@.@.@.@@@@@@@@.@@@@@...@@.@@@@@@@.@@@@@@@.@@@@@.@@@.....@.@@@@....@.@.@@@.@.@.@.@@@@@@....@.@@@...@@@@.@@@@...@@@@@@@.@@.@@@....@.@@ +@@@@@.@@.@...@@....@..@@@..@@.@@@...@.@@@@@.@.@@@@@.@@@@@@.@@@@@.@.@@@@..@.@@.@@@@@@.@.@@@@@@@@.@@...@.@@..@@..@.@.@@@.@@@@@@@@@@.@....@@.@ +@@@@.@.@..@.@..@.@.@@@@@.@@@.@@@@...@@@..@.@@.@...@.@@.@@.@@@@..@@@@@@@@@@@@.@@@@@.@.@@@@.@@@@.@.@.@....@@@@@.@.@.@@.@@@@@@@@@..@@@@@..@@.@ +@@.@@@@.@.@....@@@.@@@@.@..@@@@@@@.@@@@@@@....@@...@@@@@@...@@@.@@.@@@@.@@@@@@@@@@@.@.@@@@.@@@@@@@@@.@.@@@.@@@.@....@@.@.@..@@@@@@@@@.@.@@@ diff --git a/2025/aoc b/2025/aoc index bdb30da742b46f411cf61e178e1c0131e50df86f..97b0f585b5ed17eded4905a5d58d0c954b031e8b 100755 GIT binary patch delta 19281 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 h3EK@LlHn{ObHYHoXNK+C+C51SJBIP2 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 delta 12571 zcma)C3tW^%*Pmy0S$4TBuq+EKu&|55iU^8;fPxE}DU~9ksd<6Ck(!#B*K$`Z^U~+X zHY#SOWM#0Kk$5R9MSUw%KO;4}=W14DzFoW|TPojwp66M6^nJhg_pQHi&i~ArGiPSb zoVoDSuF=#l52#%c;Uc&HT<#4;blYV2mjevbA0|XVX^2V^nf@@#5{eA-XGv_eTyg#^ zRwEQeJub7`0wg}il)b2lW4{SWhKX~fN(vS!8w9cs`Qapi3``;<7<3sD|BaSY5b}VD9Ppk5473QO-aRyuxdQCr z{WOkKyDdd~>)-0%UUccqW9+Sfw>v{;CB(ZRaT|CW{Fi{lad@#n!d2`nOJgmXq>O=t z)M~pG`?P|?*RV9c-2qJ2IDA$@ezVrbx@%Of@+v)9b5<4UxfILvfhNPtv1Cm##HcK>r00(QP54rv{#5jSSt_VTW0p1uF&v( zjAG1S;Wd^`0H-+qA@y+0TG?&3D={~+J~TSu<< zV~4L8cyUKZG`pyakMuV=H&pK1y=L}KP=aBPvRQPXi8mV)6Xw>*E%8>*K!{u5jbY~C zG+`LKD>!ke=okNV__W2u-F6T0wQW9>UrpL`z0({%ippa7Pk)!YN{IVBSA;pLvJv+O zpj`(A_s_^1mX2v3#C8RD%@oJ|x-{-v1Xp>A-`?yvaf)iFtK916EstYiA>I0lbzY8h z+fWwnFS{tomk?KZu%Fj1@hJ3a{Ji*hwkV`qw5X$dy!#;JuZH-?D4y*P>E=|Ho%feb zj2G>pYFGIg@VNKSLQh25ws`jz==s7gOAiY zsWJrL_cQI5TMAqJJcYt{{5*xi-G1I-sV;B$O+W9v#H#^so1fP%^8|JwG{r3TD?QQu zAVi*r2zPdZRTdP(()1Qu9K%ZWwji&GtZBjAUW;aP^_IvC49IQaqE8}wRi9vZH(KHA z{WR`f(QrC*svhEgM?Vh{PJfU5HWk&0EIKSF<)3J&8Vf+TWL$e2R8&&ksyY1R)u=nFmrGW?rl`I| zrfZNVAxz2PwbeQ&k-Ze29^7g@mgu%&Y8!w*AP^$OtrW3nHs?5fL{bXlG8OB_Y=r3|19{p>}AaJ9LQFpyf-fg=Cb#J zu7vDt=NA!wlb|JztU?5;AA;!xp;^A%g2fkOvN`4XeJhJ>jkfYy6 zF_B^&^sQGk8*F%x=0>v}hOE*p{t`$ZmZe`%@D9nm^?n{&Rdemo%4D7n7Sx(pMr2xf z2#R=r#n6ZTYB@%KMU4LPs%_}6h|ymnmZQHsRHDDvp^_WEQEv7TsLeOW=D`hOE<1cC zmEgXDzOT~jghf?QA*B}nO9-) z{?+RCdfNB(dip{iJG;-=l}<6Sg~pPSW(aBf5qGtQ_$o_?yAJp)CYE<|0cbB)%O){5 zd929);1dAeb22a9#BLf(GNJ)rBxEPA#ur!ta2Q61<518`{AB^I^6n-!Bg#Tib9Iy@ zVV#Ahv=eH4{wO5*ipld?c_f4d*eM%jdHW;MkLc2;PL z%eWUsb_|zR-fa9m%1~4f=hd;<9eRb;iv)%f`Alj;4)_jlwq?q3?)j#gW(tx4|s z?}SfmTH+2hvc1u1)MjEoM31(83dz4PCU#Zvj>|8p8@bR6hedHYjGsnh0j2okFwW7t; z_@To1+stc8cJsY>zg9Nue6rhyJ@Oqtp5Dn#p?r@Yhj(_{w65}IKaNRpZ-M+9e%zG8 zK1=9KpEk0a36|SCN0M1rO9Cx3vQkUo$X4t6WOo71n~p$|?Zsq^qp~yEodaIIM!`F5 zb9V=iD0!!B?ylff29WIA#wID1ow1}Fd1u9FJ=Sm6^i-CZ*n{egtUNK75+hrgnBvTV z%kEm|@byN%XtTrD3tn)|*2NvjS5IGu?-z_^+vbD$%hTI?t>H(#`}iu0@<^uI#VP8H z7M2(sZ|{aI_)XSyySoJYL?ZYu@Y~R}lPHtB*kr|tb~Z2}Ei5z1N{>gff|QKRuOiUY zcY^4EXHg~oMn_%ScsXVzJA8XZ6=Ks+VP|h7<>WtYkk*3O>=?UvFgPD51zjzXH)iM} zM7OGoY{FT%Z8BSu6Un+;wWh~KE)N?fPq|DFi)4eXS-OdUJPx?n!>Q3hV}Sky8Xd_z zR!dhddmT_7j3(=JyXZz9w9a)EpUx=$EeW!yv<5gk!&9{?^0-fL)3hiq%B6&{H-`rF&=Kf zEt}K3xcO;o1lNp}`6J3in;l)mzLbH#oZYZSQ;XddXj! ziPE0Lx7on-opaONem4B!aw_rt7jRo&xaY}^UffL&pTz!skHh!0fz9Y_bK-*Ax<>Nu zrbRRD?mqC&jc2TGTy&creb#=<%ja-4sBX8k_qqlzpJ(A-ZscCxWNlA%*C0N;rokY= zoBKdk@On1l7`Oqbk} zm3}tn;40=|88DxNwzJY4*w0CG-~yiy=C!jOyBaQkk;l&(^-D*#FN|PYx(q0-MsW$E z3_m{&LK4qOSgNJq^X=`6aQW;6-d!^9l+0_}jH8YQM;F*VB7$Y570}EGHY05l4TR}k z3kHOv0-sRvd;@<70an_el@&Un@b+zA@bH5UCef1@!B%%Ipa~J|NY_#)_V!loP&_~! z*q_&+C%J7Z$J?TNO$9HQWQ*m)rSfW&!^K)3ol)$o#@+ZZ_NdArhp!&TkSIi@BWRUR z_O6bOUCtoltJXMt%TZQ|(Gq@t;^a>#cj}4nvdZ=L3X~1f5XREq?}0eqN~Aro$-2Ia z`y6)F57j*0M0!S|j^wUb({R@V;AgWH-MZ>TD`AO^z1OW*!V6&-8HMf3fA7dSht>HS z_&r%fMnCEbXCpGw=w0EgCc_pzJ)9T?oCF)5Q zf$x`&0v&)=lxZ>Jl}J>!6NAVH&Pj>SfkFH;ta(djia?vg*pco>s4#>kt)iXoZ zzMu@~=T^OqXv$oT$Bg%!Z4QAa~Zv&XM1}d#DVXL z>^Qns&o*R_pj-9qQg#a6sAuLJGfsp#IepW@@et+3Sn+WQ0?l_KZ35mxFfT;td-|&A zVZ=Q_&o<>u4&d)rJ((^yIU!7}D2Oi;2GFi88utL?{AHpG8|Ab&^G!T1L?OD1UU5tu&!!T)G%LNJv@;eRfd|Ed z=7X?&Tuc68tkESwjz+F}5B6WYMjA7@A+)8?t8x`ChZna66FxV!B~Sis!YgPC+j*f@ zi*m#lZ?KCU&DF8mULlre{(~I`jA$>5;UYx%{jGstM{s>>3uPC2+019a=2P&im<#UH z;_bxfDGy~Sc{W2U*pI15uM`;RMKC%R%0}ne=%G-yIL|!dxLC>P>4}^>pm;x&_3skP zB0cZRGHHI9Gtv-vBOShNa#^xm#vL~)l>L%tN?QRIMWdoxR1u>Lsyr`N5!@IG(KW+E zaf>RU%R<@g{1U@sDCIGjJL?=c*CU~9hQrLf`2&q3?*O7BMCzreP4urBbNkVx!wb7%fb*ZH1^Ep7=d_{|4wJl5|R3cA)wEYD3uI!VPp<2)j@? z!}K^;j4_%wnl#QwbaY@*-W|eb6y?$#!E9?$3e5~*$BVM!Y!Ix5L;eA^{s580--SO< zV{v`&Gip(;9B?(TII6XM9rTxAaZDwmerK24k*D>7rn^ z*HMts9i>=R(#!G$;_d?MU*iI<0(^~M!+`U5*qUHwD=rP04-wp%+(VGFvVKWyeQ`)> z6@cH5cwt{9#)LcpTn!7fcwVZc+EpWg7a{$K4)gI7m16w7LF|{}?X)PEZ7Q+Qhl1I@ zlEE}FnCbh?4H6*F$9R4aTiwsB`zuKD1v`7Q-;aWgJ=Z@oR~$2JD+2BS)+=f5b9hVt z`DRC*6;t*&lIc?w!fjV_;!=M!UijEx|G@6dnF-vI?9js&H zN_W!)9W&iyp;0=Pd(U3_la^h&CxwRTnEBq(^stuAy?3Q;3vL*EhTBXrt9mZQiyuNy z8*Zj^#b!*N4O(WqZy{Z*Wt;9RFl~hN`r|?)9uICwOwqDm?%Uq0H;TN6h&%B*?_Q** z2`67Z!klN8d9Q)zcQb;a^6!G(P?yUpcEMWfL~$3aElHB%Z6C<^cR?=Chwxd2zL!DU zSeaA6hmNB|0@>(ti)kLTB~Hu9^S&f)EhX5o zEP-rw`2gB2kex1{Oih8TXqaVi5d=G?=H4dwJx;>>fu^maCBKbFS{(QV$l)(+Mo!;E z`7RA{@294p+kWk+XhS3187^sBNq?mY(zSHvZy#4+*p+UnYSLD)nG;CAF z2nv)|VP@gOLrlk^@=oE$G%Ra)hHWK^I;ipI2D*7eq!77^Tc!QIBljuzi#OHbtI@EU z;idHB0Cs%%pR~J%9T|~9J7F|NSc2kFm%9NAVC!buSpWOesYdfJgIFEU2l2)GAEl!L zm}%r>`au9&JknzNB|sj;tmrYFPiwGPIibvW4MatKDZ?<9Yx+`!5w~0TB|QoaRnH~^$LEF%zvID;zfsW4@M2X z`n0U`1iq#cCW>oHJWFHkH2K#QuUUmP^}M99$^V3+7Bw0@2dTKG)=$i%+iCNOiGc!p zZf2r0zuM8*S7rXWGK5q_;%|D-qe&x{B)@q^A>Xyh;ltmcjVEd3s{9EE^N>vnCKdMa z;vDu$QneJ?ag&h`PKA8ESc7p0TT0wle(%6@zUxE`%rYV8?=k~n-tt3a=;?#@Ro67c z>F&rPzkAiBqV0^N&>JkB*4ps$%TH@u;o0C4@l@x9!gwe<9AsK$@;Ogl81Kj*m_Q$A^Q8WnNbNf}?J8=pVFg#n)D04iJp3Q50 zB}ztm_*RSQHp;`4+Xi9LX;fOz1zDyFIjf%-!;U?%P56l|SbVoo$_^~PM_9u`ovFee zmg7u~F!L6%0L9}f7T^N*uroCw4X|b!(v^D5r5&>$p6Bzg~n&`&E$7B$Q4J^1^G-DlbtMTGkUf{P(08<_#9~ef$j=d zfamF0S&qNvi=FYhItlNxfF-FBJHTqAj(h=A&W{}1S>cj6;Z-(jNg~a?$`&rk5H7IB zB|UZDK#&KC3ikbyWT$wWrBr;E|Kw^%T_wW!zINn6#C>B?apRRC2OAo0{Cy0=j@3%a zihX#wT~jZRY;lLGF82MIFQA?T%-3L25T1yD7E0FQa-&k~@;bTk@&s$XEPs{sl z4!i^kD~f&ZD-}*J_MP}Q3Y%nw>>o9qoMOe1#lAPd6c^>}VxJ2ZZC*?oH{)~(Ynq6w z&n;{Cz_0gPgnBQ7o`b8Qzn9!9e4o%7ZY%Z?nkdmYquru$U%y2MIh=n3oG@<{7!9;~3t74!%NJz7DJQ_v48=*bFts)C*Y z+UXyn*@}X>3VNY}UaX*N6!bC$y;4E1R?r(1^p?MAXZY5?LAXajZ&%Pe6!dNdy;ni+ zQ_u$$^al$1h=QIg`iE0;kcA3oxv3CJQShmP)+p#81+7=m1_f=pMK^_;6?7Wboa}T> z;aLhgS3wsj=pqGOqM!#T=u!neSfaD1HS4kV8IBOyq0T8)ja0;D=o$|*kiQiETCKkHSXOr2MQ z_Xa#q#DG~1LH=zR|8cDRahb55zmME5gMP zA~^I!)2>J5FrwPoiD>$CCIJ^yF<5q@DYFy0%??BCM2Jr(0UNs!VOAE=CiNr%EQv)s zX=NS>Xw4(q!}%mIyEh4J#XERK5mApRBDzWkQK<(K8Z(e+s*yi45M3!HYI`YBO)Nv% zaH8rz1}%>zYVTO0jTui==~YBXpFjc~6NykciKyqGOAV6<9XOc~%nyzm%3t%ZEL_#B zY59u^OBp?slJ@;V6l=rz=U<4V;jV9GoV1izOXB~DzgbIJ`Joi^KmU*7rlsuJLn%R5 zZWTA5Wu4QTe`6;8Utp&?wL>TrTzg6!!u;?+6;Z1{cd6tu%=HA1n_h}h(FXA}BEX((kaH@=rcS$%; z#_=*Pm$7<)Sned#Wd?Ugu5g)*{{gq;_$L{2H|01cPHNCTM8btKzE{TMW$Z;Kx%?~{ zbNA+WrHr|o3k2)xWtqYKoeTJ6tezm@IIMa;LhC0=I9nN)a6D7SJo<24BV!(gI9@Ab9*sC|kTH)+ z9KR!DL?XB<0Z%)=VT z!(_btF{i|sEHi$S1s2GdhdW;385#4i$MI$v^YF*<4q%JMMR;W3c%O`U;A-##T18FDH?z-oygv8He>*9(C_OCFIrxE)#~;&0Z!%<%FX#?lSym z{PWuoxDvfiC?XEUKgrmUVktk&2*u$^l!V|z=@jQ=J_P(HRLz_~UOV;Bv!72~J@oY1 zVJ|)Rt0p`r@%+m6hqk;*`a9NKnGqAw9yodb)`4Nqo^VXHU#fjz!neymdiuoTn#E_H z>9&0BxuD_OG?~4JygKaRqLE2Ao zPw(wj^3vROPk!j#c2TDrf9{!*eXEN)g&f^@?%7?t@45QJk(L`>%A8;Mstnyq`h>iD z;yU}X(^KBh7CaDTD0G|%rB}aLl)2)~ohi?bzj$f$f8TALHht6+Lq_iIc_YVMv194s YDLv`fX #include +template +class Grid +{ + public: + Grid() = default; + Grid(size_t h, size_t w) : data(h, std::vector(w)) {} + Grid(const std::vector>& d) : data(d) {} + + size_t Height() const { return data.size(); } + size_t Width() const { return data.empty() ? 0 : data[0].size(); } + + const T& At(size_t r, size_t c) const { return data[r][c]; } + + const T* SafeAt(size_t r, size_t c) const + { + if (r >= Height() || c >= Width()) return nullptr; + return &data[r][c]; + } + + void ReplaceAt(size_t r, size_t c, const T& value) + { + data[r][c] = value; + } + // + // 4-neighbours (up, down, left, right) + std::vector Neighbours4(size_t r, size_t c, bool wrap = false) const + { + std::vector out; + + auto H = Height(); + auto W = Width(); + + auto idx = [&](size_t x, size_t limit) -> size_t { + return wrap ? ((x + limit) % limit) : x; + }; + + if (r > 0 || wrap) out.push_back(&data[idx(r - 1, H)][c]); + if (r + 1 < H || wrap) out.push_back(&data[idx(r + 1, H)][c]); + if (c > 0 || wrap) out.push_back(&data[r][idx(c - 1, W)]); + if (c + 1 < W || wrap) out.push_back(&data[r][idx(c + 1, W)]); + + return out; + } + + // 8-neighbours (diagonals) + std::vector Neighbours8(size_t r, size_t c, bool wrap = false) const + { + std::vector out; + auto H = Height(); + auto W = Width(); + + auto idx = [&](size_t x, size_t limit) -> size_t { + return wrap ? ((x + limit) % limit) : x; + }; + + for (int dr = -1; dr <= 1; dr++) { + for (int dc = -1; dc <= 1; dc++) { + if (dr == 0 && dc == 0) continue; + + size_t rr = r + dr; + size_t cc = c + dc; + + if (!wrap) { + if (rr >= H || cc >= W) continue; + } + + out.push_back(&data[idx(rr, H)][idx(cc, W)]); + } + } + + return out; + } + private: + std::vector> data; +}; + struct FileFragment { int Line, Col; @@ -19,156 +95,197 @@ inline std::pair SplitToken(std::string del) class File { -public: - File() = default; + public: + File() = default; - explicit File(const std::filesystem::path& path) - { - Load(path); - } - - void Load(const std::filesystem::path& path) - { - if (!std::filesystem::exists(path)) + explicit File(const std::filesystem::path& path) { - throw std::runtime_error("File " + path.string() + " does not exist"); + Load(path); } - std::ifstream file(path.string()); - if (!file.is_open()) + void Load(const std::filesystem::path& path) { - throw std::runtime_error("Failed to open file " + path.string()); + if (!std::filesystem::exists(path)) + { + throw std::runtime_error("File " + path.string() + " does not exist"); + } + + std::ifstream file(path.string()); + if (!file.is_open()) + { + throw std::runtime_error("Failed to open file " + path.string()); + } + + _lines.clear(); + std::string line; + while (std::getline(file, line)) + { + _lines.push_back(line); + } } - _lines.clear(); - std::string line; - while (std::getline(file, line)) + /// Split each line by a multi-character delimiter + void SplitBy(const std::string& delim) { - _lines.push_back(line); - } - } + _tokens.clear(); - /// Split each line by a multi-character delimiter - void SplitBy(const std::string& delim) - { - _tokens.clear(); + for (size_t lineIndex = 0; lineIndex < _lines.size(); ++lineIndex) + { + const auto& line = _lines[lineIndex]; + std::vector lineTokens; - for (size_t lineIndex = 0; lineIndex < _lines.size(); ++lineIndex) - { - const auto& line = _lines[lineIndex]; - std::vector lineTokens; + size_t start = 0; + int colIndex = 0; - size_t start = 0; - int colIndex = 0; + while (true) { + size_t pos = line.find(delim, start); + if (pos == std::string::npos) + { + lineTokens.push_back({ + static_cast(lineIndex + 1), + colIndex, + line.substr(start) + }); + break; + } - while (true) { - size_t pos = line.find(delim, start); - if (pos == std::string::npos) - { lineTokens.push_back({ static_cast(lineIndex + 1), colIndex, - line.substr(start) + line.substr(start, pos - start) }); - break; + + start = pos + delim.size(); + ++colIndex; } - lineTokens.push_back({ - static_cast(lineIndex + 1), - colIndex, - line.substr(start, pos - start) - }); - - start = pos + delim.size(); - ++colIndex; + _tokens.push_back(std::move(lineTokens)); } - - _tokens.push_back(std::move(lineTokens)); } - } - void SplitByIndex(const int index) - { - _tokens.clear(); - _tokens.reserve(_lines.size()); - - for (size_t lineIndex = 0; lineIndex < _lines.size(); ++lineIndex) + void SplitByIndex(const int index) { - const auto& line = _lines[lineIndex]; - std::vector lineTokens; + _tokens.clear(); + _tokens.reserve(_lines.size()); - // Bounds check - if (index < 0 || static_cast(index) >= line.size()) + for (size_t lineIndex = 0; lineIndex < _lines.size(); ++lineIndex) { - // Just return whole line as single token if index is out of range - lineTokens.push_back({ - static_cast(lineIndex + 1), - 0, - line - }); - } - else - { - // Left part (may be empty, e.g. index = 0) - lineTokens.push_back({ - static_cast(lineIndex + 1), - 0, - line.substr(0, index) - }); + const auto& line = _lines[lineIndex]; + std::vector lineTokens; - // Right part (may be empty) - lineTokens.push_back({ - static_cast(lineIndex + 1), - 1, - line.substr(index) - }); - } + // Bounds check + if (index < 0 || static_cast(index) >= line.size()) + { + // Just return whole line as single token if index is out of range + lineTokens.push_back({ + static_cast(lineIndex + 1), + 0, + line + }); + } + else + { + // Left part (may be empty, e.g. index = 0) + lineTokens.push_back({ + static_cast(lineIndex + 1), + 0, + line.substr(0, index) + }); - _tokens.push_back(std::move(lineTokens)); + // Right part (may be empty) + lineTokens.push_back({ + static_cast(lineIndex + 1), + 1, + line.substr(index) + }); + } + + _tokens.push_back(std::move(lineTokens)); + } } - } - /// Access tokens for a given line (1-based) - const std::vector& TokensForLine(int line) const - { - if (line < 0 || line > static_cast(_tokens.size())) + /// Access tokens for a given line (1-based) + const std::vector& TokensForLine(int line) const { - static const std::vector empty; - return empty; + if (line < 0 || line > static_cast(_tokens.size())) + { + static const std::vector empty; + return empty; + } + return _tokens[line]; } - return _tokens[line]; - } - // Access a chunk of tokens for a given line - // E.g. Iterate [1,2], [2,3], [3,4] - std::vector> ChunkView(int line, size_t size, size_t stride) - { - const auto& v = _tokens[line]; - std::vector> chunks; + // Access a chunk of tokens for a given line + // E.g. Iterate [1,2], [2,3], [3,4] + std::vector> ChunkView(int line, size_t size, size_t stride) + { + const auto& v = _tokens[line]; + std::vector> chunks; + + if (v.empty() || stride == 0) + return chunks; + + for (size_t i = 0; i + size <= v.size(); i += stride) + { + std::cout << "max " << i + size << " tokens " << v.size() << " index " << i << " size " << size << " stride " << stride << std::endl; + chunks.emplace_back(v.begin() + i, v.begin() + i + size); + } - if (v.empty() || stride == 0) return chunks; - - for (size_t i = 0; i + size <= v.size(); i += stride) - { - std::cout << "max " << i + size << " tokens " << v.size() << " index " << i << " size " << size << " stride " << stride << std::endl; - chunks.emplace_back(v.begin() + i, v.begin() + i + size); } - return chunks; - } + + template + Grid AsGrid() const + { + std::vector> d; + d.reserve(_lines.size()); + + for (auto& line : _lines) + { + std::vector row; + row.reserve(line.size()); + + for (char ch : line) + { + if constexpr (std::is_constructible_v) + { + row.emplace_back(T(ch)); + } + else if constexpr (std::is_constructible_v) + { + row.emplace_back(T(std::string_view(&ch, 1))); + } + else if constexpr (std::is_arithmetic_v) + { + if (std::isdigit(ch)) + row.emplace_back(T(ch - '0')); + else + throw std::runtime_error("Grid: cannot convert character to numeric T"); + } + else + { + static_assert(sizeof(T) == 0, "Grid: T must be constructible from char or string_view"); + } + } + + d.push_back(std::move(row)); + } + + return Grid(d); + } - /// Iterate through all lines and their tokens - auto begin() const { return _tokens.begin(); } - auto end() const { return _tokens.end(); } + /// Iterate through all lines and their tokens + auto begin() const { return _tokens.begin(); } + auto end() const { return _tokens.end(); } - /// Access raw lines (before splitting) - const std::vector& Lines() const { return _lines; } + /// Access raw lines (before splitting) + const std::vector& Lines() const { return _lines; } -private: - std::vector _lines; - std::vector> _tokens; // [line][token] + private: + std::vector _lines; + std::vector> _tokens; // [line][token] }; class AOCDay diff --git a/2025/day3.hpp b/2025/day3.hpp index 69da7e4..3692d7f 100644 --- a/2025/day3.hpp +++ b/2025/day3.hpp @@ -50,19 +50,26 @@ public: return totalJoltage; } - std::pair FindNextBiggestNoOffset(std::string bank, int startOffset, int endOffset) + + std::pair FindNextBiggest(const std::string& s, int start, int k) { - int biggest = 0, biggestIndex = 0; - for (int i = startOffset; i < bank.length() - endOffset; i++) + int remaining = 12 - k - 1; + int lastAllowed = s.size() - remaining; // inclusive upper bound + + int bestDigit = -1; + int bestIndex = start; + + for (int i = start; i < lastAllowed; i++) { - if (bank[i] - '0' > biggest) + int d = s[i] - '0'; + if (d > bestDigit) { - biggest = bank[i] - '0'; - biggestIndex = i + 1; + bestDigit = d; + bestIndex = i; } } - return {biggest, biggestIndex}; + return { bestDigit, bestIndex + 1 }; } uint64_t PartTwo(File& f) override @@ -74,18 +81,16 @@ public: uint64_t joltage = 0; int start = 0; - for (int i = 0; i < 12; i++) + for (int k = 0; k < 12; k++) { joltage *= 10; - auto res = FindNextBiggestNoOffset(bank, start, 12 - i); + auto res = FindNextBiggest(bank, start, k); + joltage += res.first; start = res.second; - joltage += res.first - '0'; } - std::cout << joltage << std::endl; - totalJoltage += joltage; } diff --git a/2025/day4.hpp b/2025/day4.hpp new file mode 100644 index 0000000..cfeb7b2 --- /dev/null +++ b/2025/day4.hpp @@ -0,0 +1,97 @@ +#pragma once +#include "aoc.hpp" + +class Day04 : public AOCDay +{ +public: + Day04() {} + ~Day04() {} + int Day() override { return 4; } + + uint64_t PartOne(File& f) override + { + const auto grid = f.AsGrid(); + + int res = 0; + + for (int i = 0; i < grid.Width(); i++) + { + for (int j = 0; j < grid.Width(); j++) + { + if (grid.At(i, j) != '@') continue; + auto neighbors = grid.Neighbours8(i, j); + + int rollsOfPaper = 0; + for (auto* n : neighbors) + { + if (*n == '@') + { + rollsOfPaper++; + if (rollsOfPaper > 4) + { + break; + } + } + } + + if (rollsOfPaper < 4) + { + res++; + } + } + } + + return res; + } + + int MovePossibleRolls(Grid* grid) + { + int removed = 0; + for (int i = 0; i < grid->Width(); i++) + { + for (int j = 0; j < grid->Width(); j++) + { + if (grid->At(i, j) != '@') continue; + auto neighbors = grid->Neighbours8(i, j); + + int rollsOfPaper = 0; + for (auto* n : neighbors) + { + if (*n == '@') + { + rollsOfPaper++; + if (rollsOfPaper > 4) + { + break; + } + } + } + + if (rollsOfPaper < 4) + { + grid->ReplaceAt(i, j, '.'); + removed++; + } + } + } + return removed; + } + + uint64_t PartTwo(File& f) override + { + auto grid = f.AsGrid(); + + int removedRolls = 0; + + int removedLastTime = 0; + do + { + removedLastTime = MovePossibleRolls(&grid); + removedRolls += removedLastTime; + } while (removedLastTime != 0); + + return removedRolls; + } +}; + +ADD_AOC_DAY(Day04);