From 02b5f500997dfd86a9680305769e90a5754c49ae Mon Sep 17 00:00:00 2001 From: Rainer Bernhardt Date: Sun, 15 Dec 2024 19:18:04 +0100 Subject: [PATCH] day 9 2024 --- AdventOfCode/Year2024/2024_09_input.txt | 1 + AdventOfCode/Year2024/AoC2024Day09.cs | 143 ++++++++++++++++++ .../Year2024/AoC2024Day09Tests.cs | 49 ++++++ 3 files changed, 193 insertions(+) create mode 100644 AdventOfCode/Year2024/2024_09_input.txt create mode 100644 AdventOfCode/Year2024/AoC2024Day09.cs create mode 100644 AdventOfCodeTests/Year2024/AoC2024Day09Tests.cs diff --git a/AdventOfCode/Year2024/2024_09_input.txt b/AdventOfCode/Year2024/2024_09_input.txt new file mode 100644 index 0000000..d5e7229 --- /dev/null +++ b/AdventOfCode/Year2024/2024_09_input.txt @@ -0,0 +1 @@ +9243454795435273637048798882879428359014707272598768554854148080644043291121943016436992813249386490436517233069618764397642293640862674815714396659391176943138192093338141213384826730281676988577788111468797654679256185165496738919327753197696284739612891522583792367432659737190286196821567651428263381204937956983279071747249471794719790617173698434465156945234835884112198137664721450966896693597868273789488694249194130318073963866737493569059299484306924323935489924432780919285267999804584261369832340907620429822424961552882978826692514145728925925161183775171497266164447639168726516985065835684955543316428256951969317998573564492997793864925616510725329184316108639942767794882936339228780369175425369845576659836965729775140406779996664993113478238831423511697478997305763513639217782695116492352175780187852113880727755672162968728153818685119542746292782179686535168133384952824988689594823503596656064235563526398576039487280606217505874252412887474903129529278738582917630524720183389468222274274903212524194846352153875908474306130633237276091568077595819194150684794788039106621969822151360451337949970523134533154834780568836415752415468481697509498769444187936485816322176779226375727516043383462724285917370577134939952251322465291967950413631486680454722746281971496613054751534258830411987767049172943745049897121623476769732824025486517258961942873489564705028718424226446546277478961777954356220414030616864452035438999852180299735428720996214977561552759937291277412534649197281617459728192885441409979413396185650641286306816291554197491468142478767346287647427372467198623809669161298802321494679568741981985892741213435457039454021443621447751147185669912433914177721718636622745754438227797165013384983394937672839797840894752136760788491291191967258115892644164246121732461998033465731772773917742632764805556754613285989399618678771863370125860187861129399792458833228716819454193238330238739758517633468338871773826218136881988824076794491467050415311306158316146265076787839136324625780464988299259372688169384426239644153465212396727766615552541984189562575439599435126268869544060784041493032155148346328916394956893193182778221541922315695374987968322186478802787741394867885769295209575284310737440764483742016588456923228775034969370309932191782326772455939332245301557208645915371689258167574793932978058652733939911897652838219396671224476817431221680798126194914291013218775951441554427261345198797882398922079309857407610717615989460653448101199204978549373171540583528987297817189671842208197893830434743642418789594124562787637602553743347889196774770486095451697307239218871683715464091855996933050872937996634993627837714844899125317336070137125228145924653838047756755583486632560843017595266347024278590538123889063622863527157499116236333858894731752252164103722294449186850923184302640465611776627702773207755795535979885973481797278193579933460525074142264318723255766925162234123967876648249179472956515252042479242749356679840933588306698203814499329703887931354775929557291132560837593427156798436414181954837251473897333314170637230446475266196736615913073268147905360402866477551147811773489724024988548628327757998979063482998477567774199834118949046523262902895993010574264671319144555807168445324793264643039253119794220371849336649513583615245999254675316418714541512116098832726696187364379687962631052791480923379948752634177904244401264117250738975452361764280715549213994944288652080658790265292155517184138839253477064966227481972644759744877683626958773609064786331546594129777472889873825294521666428219177713053221786567833815296806062378192539952786761321867575398399937782278851816291846381234774586652378127862626479141444659740165995699627213765519917808838566799786945325646538388151694774062919281668981727073963337607990453424536498668998765825616478712045264284494053874662659988328518721844645614502760324976446665691278266528129779959657146385786724211825143979397448869037101845338110173441778722319559495155106012531395971754425038451385606275856517362282297211214096507935211610408692448179433455234022752248825996945199517119117646643171273078342312394487611629971116117364509291523035655429443423333669181283991799778595781275373416316978552022677132578519423246523253695868441258886855647225847691543465111275128178242428437736723242628964533346679778265554115964981787912768188151601653757418118227496076435029596995113183498474732557915448966017145766523954733013593658241878708423278985713783102315977953322136264292173421493211726221974419769832466430196028179580681965958288452668909214989969775569546187659939297922514564342056765546654443965727728913987929594335896747988274872170115613123443681550796369109867936283696188898918295368214238591765494848845790287182398831669441153682219123177758213499933453103014243141436317666256273487538485727264729459156794851430303141653468417082455376338126663134766147381757826265679798629285917947523531582973976472205865939196925963878686681989658753939424144492829924516588718363338896581618752590606278773761968661861285726252791031507253702599849247207561584576754844723891195389685111811898548649332764223774681669736691959690158984378544865673288535322255327227935157349247962967866452424085812026739859313948395468497422303830444399147862457759798458357514641755594341654482359639725973199879811894951535185834539726162592276735811855667371119924886169416731814632581011194957546187769290721334383328749664869672452374599399413595268851803614898958569212311225947975873268745442722152949656926914344058141992586569699927974285863511371652441327982873716943273072886431656078125778287556796444125572354777313873172636144263844747492659617813502823857763477647898880351327584677719099515978744372583643764251412845927748533934126111252850156591497414731041527882889050226210654954939498815834629531348680648547449514967394879388198774546051154396615318406547216457872367624188755470829991929110358312802242709557245420668859733240275444791427809137964171543987991260437842443333644860498631974013115924705782264050239536323528649861412753552777991180447283541564477439264576834940833635419988894579741159432679722116504137753337287491884937694374142934309790342136712575804245255093455191617980325667155238131353489042182478387558173134334021696179385570115255318144444138819061621475592670342996683540288381996490924976695021691171333928594061678045328674584466434913219258925188326092346211869150827984216744811361897012882968265212527758998944599829681287854385193074948973127814459664818624211435231636403369723583926392249574263231398636578145353326131951127691712385455780266564161370951374951697724548549720503791547857106248434113298967116496245038446981451782887281896077198311156464725327765967972095901025957670471857563049909694608538841655512398799543223593866386202660315877331470299074174295831594399259384654225792186569817872121747563162788220886143607115101274749814147822328223899953485136862530386736843545799244402552609492714779795027912881809375197340875112359752499278489879855180843870111622811222794966824781157266751414166515672792713058789973383445914613222339834971188520278173791093847110921547659672969247688781829790738685839346648438834245589455328821459971274135898297377284429043277551139039208991346883855558989250206484674325381013313179832791816575608991343773731546887567949682574178429194885280444678331012166799984295116395713596651164528527697253508158234883699835366168393439572618579436322396211023998393392561478013105817628824836719457623249546614637877252404037155979958559336612427198423020158413341033936151242482505836508553306585623090945638576333447027586836754447252913818347469429508014912792401759616373328335755120596683275615343591544994267556102528496088855843657925575771396065353639877014323348968250723364145719128471772531262195532438474565836650868892724033644233874193411561408935314315652735469124401318175739792784118125924040503850846154125110186526587887454739669863423163611828568542639129101173166717796561724758698118584844104326562415726249246735856165882464453277823961455478467070688067149780456255914481545365322725231647832645971655923978948269251165477622311036961359233121529398626332587112252388463978216754613395913382584917295864807825367956385075146947359050829559488865787538218352605073722529987644813923403232247839795931284414435168599790218265582683979817651640951981598691371641438534317037409068457765523674208145142926452099258069346342335783476876335797447777414765939819503720403335663624109082538159617764398451562432284614871229761656544356867664555526477619781459733969662957711165782594336974386810336260422953889121291366215755456486941756223990519658806841554774807133107088493450486049345748283784763278267261205971924596364659887535285238601313335774431610474973716423455294815211505613637881698193503072268561996772763562887176408971734270197742234794927190391525584221408875891687816216697982783292329017742532884398976535583536353948151726723216607663824726221314779773952350998369266895186958554999957659316547192024132839244627682569195519644038929362771115571090751179572332359050192343168870483268424189283878315440467537907520993057233732275787868741861823282551384157523312213885543275294472345164265691467158299654387343513818617782166588433768811832783055812630632197546328892082398028223829813153749669776690708579712088459085921128918271572520553685391347497653685260424958282685444664497392989934341058843599516072246485879638166617934960396818748896613470363322356486681336679356865485182174747886663722302286901833432184316323876469996512599423859020441758251949398234301562478564144667934275259651492981635229827653595652494714262246107562798660812250768410556379489263416921525540541214408743364246629853464884437022578572142996397494738757766283933092629978706431325634235573489598436052983043331634556017253895544566325078336684875452135347885510195331144724471167509497171449356294753723189688776378152296168761697153434621572615829424243093536873979550665529483178193911144953184899843277873843898834281929473171116116263967638290933170942546364816615781688329673441139036583963544050859888601377142912551417883032391215389073244925877722652233723938803440172452722121528162203048228626951467358466717326725535355753387182219063132584494616934631716293272564286224812311604738334959887843364640921256462189892716135851784315329477365477714462684365779479502045118739919764312692919438214329856470792988119290574232781459601038723481728986726329613989833595727659521424332690583186499981635581297494274747874613341122977728815791382778635559999441151750702487175226123879609267393955744471609769349811639532317028147267999868386885411753481910948673814213657223193595614271808771397135107794405476378735376721346030659249731569823998131236899445733747951639909319362374203991593781225886502471559432698498808490101372703571184989803872612790675183303492283792657836709649199629959692313180698082493633126937298466521593126343864042522287745255252253825530992678119133118434358413448697878354927147416977872538216669166392354992538056323789232221633776126398766232902119552750236150247628316766785110241939239282164458749824698069312123695173692832234088613427542621273166486812907868697854352913157885537221741481557189916210616678364782272297104697183724302992465596858270831223274592374941674780614973322686326283628383286355185353139078103726598536149862677397431543612444177176395118582911671299607423866574428855141871632940941087151551819392143640684325212211787635365788794476778918112921646197114561192159288983321099809685541360864971102926376834799878877553909695315817729867848650323956244724858711762795696991969248625185206971524281539171876427419362679550468039405126899598274856446057991916968115187648167081124974647232383448214212224929509734837936467639861634969333847563979283129688997139784491602651733654831732312869258358962164768513532982283016687568547390716582265045641156781268762063245243819019389334228136948569122485671069906175642486252719652069938829721778774783174975333068529915654310113445578039429430381254921828422083546151969248312929941359476193301027118731671128447235985120249912573171884916512548485724753270428631796773201864718759602551533578393712503434337454816794387489219540377592889795348990762368504491435766254838713879279922131417565426231039396144833482927932575870949737854024327143425540676174929027789065439460648078857330103159184656339495837373172121984950615495279562678698771855831896723233999264568580643433493817837652153733857874346985467244655578131921466771104128538597106757834318997417403996968621529521931671897164668286904994787260888239279748799996331483494418455025897537524863127280725371614173464340407713547840201355237285256762551558404257571034336246566681743869125945277869387996487443421452214258575270863290806276974982845782354972904878935830549895247164134946576984764860445733398886747657881838208522746327862584347479733775672032806883585150936979389294947229698996658957776715432260881029374332483134369725918547203797272336612369205590509321958536415943736636988392415869519711601927777035648356115838599361756047936495581191124034453412927565896636152832618191677364739737707943313998134746672896959976349328838310258079739643876136844613607353176349925370482429846433626489141318568995215033296349481315377373139841548730658515259135582254839727183471948630429486798665119745896617768854473983383768506591914352958879619768254125821030188653641296672569238763765289572029245638864332563276417336625669577735574737854037583725925293701720543689275931394424238562705282387637332741381471613096389433675687583082436883588836529448853333258174965371519149443584486832731198301890264468374695119259936081516935428373468953197369891646585686185359668889608262907575613143323714309281909391211430455584168313277714223025226542249018854829893482209331515931495987971454676688673882863829502697321232511934483456637720117893401951939674493876378933858862808273962468954958658997737027442436969396304840507023612557981163305682198291464870723675792590228611997898111910129598176342259136121534976156709753917337482562841396421688187678685127319156311766367663569322836852306138329522834538265697941467754556355795231736699989393483781953371726593162626365881215874795146916692259514981364963185897209547547284239464617320258295394850253719707657458816338828146929661514366314334584728195451583218517235854139313447979433265274889381782761074555542334551975254581830535875444099512641583056445924716029619166716846498778224952519250168460731980544242649757157595677816347298535382315766401685876647245780519886151840564611858652858059381238722260892047606657626328455146795432235119349424705814745644291975768456165744764182756019369670469618303428985338901850829070244527682929919326894613924164963129471297458441745815563262667756278676702633844888748365548218566896981154892537515986253687903713808128999317527598107152216051743796887311405670926528991493781252307289651357564034149719113129537143157666939521406491459275118538185939958211266386642338914338826021869219712432394151887156577036133138995411926314382651757516707614379063998926245218859836533455637562909875839590693044805877753562632048937729391662253358997774627455898735568384524921536995233120462088649133983947732998934143341057277956796823475515814992167836397867424363954320595338558271551421488474998842183658683782181639918524923259786616142692492351458312312944514713637716169759664825179894577166307491941689662284495484784019425027121180862286611673849278295561316799134445893315365634637121329693292957326176145580494755422229465972879898807058743322482732867589776841814223756124395032592377649052759956221212356943898550184131935061421064345619946011493630342774309628131532889085816651276756981494566083139379357216453531677557746021918531959737442715654684192827358088289468659186425072946726431785957377711348888146389496882135153574551943761036305930242810294358679684835742325471775028617831122580305534234142366465313628429132805053838455524430835570755540732187219538799078802699436719966116145815989840588480164818566774493037682255471431524886814199764578774593475218997981662718613678782269191193212325431755977735955552461196835142694498569893148634998661713778199419572511185468608868456441246426474933704248148874895626368625549339778744518873994086519480421811709916823681722815691835587040832095672098181194483285728063456572151566699043679260637267183993327847112734179415152391505214851939411771287818622287684962276449358942366179469169609936867267759242813893256810735212309043688134215232974325605619787093657078717550308457119127324755845626772113314728121898688330278956339919164241789974917892532896247237692519334683218098816879369226387851876292818965416793855596552410296490657740805749886145228946252683631943731937996397239895932226782542568376419341186244915842637940353246154720487854412475603753479157817380666041446632203112713575296796989059624456491056955057581870237212701898916797176636468032753413424710532358737531769390643124405470204530732486556851214778487152714999306992546094642550755256789634741949706617404528128571515674947032818216334455989357233487505366316944777984806177575221715793975371186996639349352871119326424318924488785782673260594471326415547168757155741393428684942192697355178650605291687879315398331022767262975911719825445526369349251884124951761896765563868690648421929783691226938913676553816351402317464967424280292258784998383139866396776398685038484366927227951626473684236744557926761395173743149937314834947547414593816684352075458269549349312691263466324912852146576967453353281926805120888935551038463298724034198120811682309886118971602387421014255456152551741984525315648367629997834035214092982873643658615231969631904259466486688414389595553631475893282140556092965147941333246468899863922938873481784879673091709189673829431066604977284975539974277683211036172084245631497398497026359777895733326171958568163640854792167038512430913019238424469045253355113586128247579734708270201917598292649817612084492852753759168022599843125637732158771198228280315073288070153844186230288780532460187691906521438267907134323299612424629913513743403177156080319619909721313486247884849157967622117351249185139969198225955261351694453597563647201649181079738144734623978541142410679266341974736227114410507569571330809674629998549871242291786576823836239322364725788698515293165976179716624694237180619660293393484152337064831547569955342946315581485852414265794441926244111344813669938762407877901049259999991129493942632285783569198030867944311534173683987734416352898171249615238953345183115094385314743454136632672861394677654166424619954256414291181517121826278425691936925435865979991830703729785890342967744672297875299975779828533496764451988148479614129040689782157358373393498363495692122933382719445460111155127659885013381255776471596341343381332911644991492035845735726943162325851797275114166391266837832747433365743612539364778230292073214370445297726611101050662923641911609463495939689211533942212041504969448040486814772591644732311719433814207617361160699812941557818083561958616977162367614710477733538799328318226631811043318661131449504812144880895529483470704254878417298592975677964052104170423442636318108537335869204532348586647718525875303973596450378164609362188523281582336263792381687214901991772024746140187919243394548324402730895310134933255773798699107684924221439146122162481332758978621567441874139476566083189853169133892098122188629421272999663753145721963914644699368272231527642445833416287389979021652882433180661655256821144425149652359786666417849063687730522155817627516882536837885123967693788251474017877991849735841094361236196496524657314583933329552965258792142985432454869249238729915331755537762871682228244698265966676981967474986577341029521928804333299466367237506719426930811749512330261358927013469685713787118062888516558124677627415366491989186250827348366361731 \ No newline at end of file diff --git a/AdventOfCode/Year2024/AoC2024Day09.cs b/AdventOfCode/Year2024/AoC2024Day09.cs new file mode 100644 index 0000000..776fe5f --- /dev/null +++ b/AdventOfCode/Year2024/AoC2024Day09.cs @@ -0,0 +1,143 @@ +using AdventOfCode.Utilities; +using BenchmarkDotNet.Attributes; + +namespace AdventOfCode.Year2024; + +public class AoC2024Day09 +{ + // input is negative when line is empty + private readonly List disk = new(); + + public AoC2024Day09(string? customInput = null) + { + var content = (customInput ?? EmbeddedInput.ReadAllText("Year2024/2024_09_input.txt")); + bool file = true; + var nextId = 0; + foreach (var c in content) + { + var count = c - '0'; + if (file) + { + disk.AddRange(Enumerable.Range(0, count).Select(_ => nextId)); + nextId++; + } + else + { + disk.AddRange(Enumerable.Range(0, count).Select(_ => -1)); + } + file = !file; + } + } + + [Benchmark] + public long Solution1() + { + var lastInsertIndex = -1; + for (int i = disk.Count - 1; i > 0; i--) + { + var v = disk[i]; + if (v == -1) + { + continue; + } + + for (int j = lastInsertIndex + 1; j < disk.Count && j < i; j++) + { + if (disk[j] == -1) + { + disk[j] = v; + disk[i] = -1; + lastInsertIndex = j; + break; + } + } + } + + var checkSum = 0L; + for (int i = 0; i < disk.Count; i++) + { + if (disk[i] != -1) + { + checkSum += i * disk[i]; + } + } + + return checkSum; + } + + [Benchmark] + public long Solution2() + { + var lastInsertIndex = -1; + var moved = new HashSet(); + for (int i = disk.Count - 1; i > 0; i--) + { + var v = disk[i]; + if (v == -1) + { + continue; + } + + var length = 1; + for (int j = i - 1; j >= 0; j--) + { + if (disk[j] == disk[i]) + { + length++; + } + else + { + break; + } + } + + if (moved.Add(disk[i]) == false) + { + continue; + } + + for (int j = lastInsertIndex + 1; j < disk.Count && j < i; j++) + { + if (disk[j] != -1) + { + continue; + } else if (disk[j] == disk[i]) + { + break; + } + + var enoughSpace = true; + for (int k = j + 1; k < j + length; k++) + { + if (disk[k] != -1) + { + enoughSpace = false; + break; + } + } + + if (enoughSpace == false) + { + continue; + } + + for (int k = 0; k < length; k++) + { + disk[j + k] = disk[i - length + 1 + k]; + disk[i - length + 1 + k] = -1; + } + } + } + + var checkSum = 0L; + for (int i = 0; i < disk.Count; i++) + { + if (disk[i] != -1) + { + checkSum += i * disk[i]; + } + } + + return checkSum; + } +} \ No newline at end of file diff --git a/AdventOfCodeTests/Year2024/AoC2024Day09Tests.cs b/AdventOfCodeTests/Year2024/AoC2024Day09Tests.cs new file mode 100644 index 0000000..d61d998 --- /dev/null +++ b/AdventOfCodeTests/Year2024/AoC2024Day09Tests.cs @@ -0,0 +1,49 @@ +using AdventOfCode.Year2024; +using System; +using NUnit.Framework; + +namespace AdventOfCodeTests.Year2024; + +[TestFixture] +public class AoC2024Day09Tests { + [Test] + public void Solution1Examples() + { + string input = """ + 2333133121414131402 + """; + + long expect = 1928; + + var instance = new AoC2024Day09(input); + Assert.That(instance.Solution1(), Is.EqualTo(expect)); + } + + [Test] + public void Solution1Test() { + var instance = new AoC2024Day09(); + var result = instance.Solution1(); + Assert.That(result, Is.EqualTo(6435922584968)); + Console.WriteLine($"Result: {result}"); + } + + [Test] + public void Solution2Examples() { + string input = """ + 2333133121414131402 + """; + + long expect = 2858; + + var instance = new AoC2024Day09(input); + Assert.That(instance.Solution2(), Is.EqualTo(expect)); + } + + [Test] + public void Solution2Test() { + var instance = new AoC2024Day09(); + var result = instance.Solution2(); + Assert.That(result, Is.EqualTo(6469636832766)); + Console.WriteLine($"Result: {result}"); + } +} \ No newline at end of file