From 98eb515c198a016f3cdaaf4795aa7317127d4382 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Capelle?= Date: Mon, 9 Dec 2024 06:55:27 +0100 Subject: [PATCH] 2024 day 9. --- src/holt59/aoc/2024/day9.py | 63 +++++++++++++++++++++- src/holt59/aoc/inputs/holt59/2024/day9.txt | 1 + src/holt59/aoc/inputs/tests/2024/day9.txt | 1 + 3 files changed, 64 insertions(+), 1 deletion(-) diff --git a/src/holt59/aoc/2024/day9.py b/src/holt59/aoc/2024/day9.py index 07e201e..3ab9d39 100644 --- a/src/holt59/aoc/2024/day9.py +++ b/src/holt59/aoc/2024/day9.py @@ -4,4 +4,65 @@ from ..base import BaseSolver class Solver(BaseSolver): - def solve(self, input: str) -> Iterator[Any]: ... + def solve(self, input: str) -> Iterator[Any]: + blocks: list[tuple[int, int]] = [] + frees: list[tuple[int, int]] = [] + + contents_0: list[int | None] = [None for _ in range(sum(map(int, input)))] + + acc = 0 + for i, c in enumerate(input): + if i % 2 == 0: + for j in range(acc, acc + int(c)): + contents_0[j] = i // 2 + blocks.append((acc, int(c))) + else: + frees.append((acc, int(c))) + acc += int(c) + + assert contents_0[-1] is not None + + contents = contents_0.copy() + + free_0 = next(i for i, c in enumerate(contents) if c is None) + next_b = len(contents) - 1 + + while free_0 < next_b: + contents[free_0], contents[next_b] = contents[next_b], contents[free_0] + + free_0 += 1 + while free_0 < len(contents) and contents[free_0] is not None: + free_0 += 1 + + next_b -= 1 + while next_b >= 0 and contents[next_b] is None: + next_b -= 1 + + yield sum(i * c for i, c in enumerate(contents) if c is not None) + + contents = contents_0.copy() + + for block_start, block_length in blocks[::-1]: + try: + i_free = next( + i_free + for i_free, (free_start, free_length) in enumerate(frees) + if free_start < block_start and free_length >= block_length + ) + except StopIteration: + continue + + free_start, free_length = frees[i_free] + + for i in range(block_length): + contents[free_start + i], contents[block_start + i] = ( + contents[block_start + i], + None, + ) + + if free_length == block_length: + del frees[i_free] + else: + frees[i_free] = (free_start + block_length, free_length - block_length) + + yield sum(i * c for i, c in enumerate(contents) if c is not None) diff --git a/src/holt59/aoc/inputs/holt59/2024/day9.txt b/src/holt59/aoc/inputs/holt59/2024/day9.txt index e69de29..83152f1 100644 --- a/src/holt59/aoc/inputs/holt59/2024/day9.txt +++ b/src/holt59/aoc/inputs/holt59/2024/day9.txt @@ -0,0 +1 @@ +6920945132536042828994482345396169724991532616269072173941615129441070989533549353544192338215647480107561245832285861135469128938656230362333818111433746344751894125805448321674418337459440436476402523264257512621383849394968854739721644705231266361534476141022646838663844981685665728936624151235476791584929822482292987334479824016888196957024425673938289753698621244157130975989396226731549454298144391686468562820376390235135108330238590316674261440783039581594584646247629719986582560203598244312596985279832984526808559405915881067383593502384107494586724976925694948216635952475703445963854271259175649271576378184603074946598276445248640841860479933368524996925945274749282264063148922416399632485376097486952663787643633316356949469798134153950341455917737349115548390535536536397237654519556679716185652595572754749672866345553911576628161614338861880658781637382837898686889463249126116447176285128303560134154431099612772162289797131303641655015516771696046959228585241299646581370538088916416989047515564526116366867367181678616439431284930379889626059473847818663132232979123503952455854489755245141781899866948543116887346827534697893607177987563154596774691267167851154138330695352108499217988406372425774968626985943665687196181233111972699532427257992757984672882888037943925818450345177398760216079692074854569485530377584183586279552981343712063437565138087959796501957177177884278405560475435141829787014884681355059571489723985901554488154898784759668954752934048679146776060562786272011429026535298115262548593878183498916571398351436431313482968486771572527901996664899792152552410493090499727835643526428881322227999149881884793853729989624533029587010105028429614225841889414576176753414877452414680577843459538128911939238704598815126186492327558383740971333501769852667796188543180462490517062819496532859194781303437743159526136553370517461484469733677187178992265612439155938358015666261906673153823768535183244601645561579916316476813124539675061263411515873626197742860301068615568696174716481151333516718804424987323957615961444822618946925923196806747458558553262735686467327309580525855605085698452928593956820699112556481136173708346321771719645737818963669665547522134505223646796667286359173528172301211931188731691358636677670346032949579894428251583802532214067603254278658698940647270167640764638397570409829821264846762426836572463386475815673329747876757249732659277388030843590439617143487927833367461978526979212861844382550791390358527895937281110537852835869713059958217969899704145215985377666628719451233132412294358444746793946343553683032671225858498134340537229859741987180829468238642605723478228646886791227546199853372232566387139711011753555879744151132642224546223435667375781861424845134566438891443785750344893853718679532879854483395621276216275644617996376282773738211864275304297979547422875934634992111232368475557713129934172577624852042405732858060209959806520925730394293739081861693532946112557827992852621975727432957291082907728921029905725787812513023871891551681262814572424452648875694586632916946898788794936727799526748807158546930659285568029733948646265541485187570661411984840326374573377475525442055851882711851241546246736884066686885724058588220382743451817154627144869212944944985727560911326298754699513901913775411631051155448259136813383243697125190592983671813131786588158152523929049549018258627964330945831994544156999373027523966329015316477207024639470312244244043635392684240435826402148884612989874566739774998162494686244143442812672951249922585423333957811202767768597518787769627151336335561386093158376767595684951873065594471827052965041948820794865486179401375326111497235854418829486872664452298163169179763609277741983868518845423468770227926607088302941698125295594475259881783566721809397453893791727816025381929613950311537338366491240658016437269618697401059446097141870959520762921795565136242743648578086232855147488427619213536145259919693337741268680894834764319547389247696113145205712656834305853252319218569748862345539664553175240528621328137233671331496239591159242157540311894387168954936104597756026326867837474564813109417965475217180909770328412366820819856465692951152217195926734339475647977941578704832148162624950666959803544861952503327149381886822448876119689339525506530908057658831734314782789403859159140861863441316507541724950952813805027348681195732431077527032288464138566218538872859584917499525836591767449976656995832671090428231768276817086739548184736619593995890627469304045694886472239926957619713406672338242792916165364319092467393762659507280766130614650714578158668223729969833521230132362652920501879253529918593985420164433543723195494516524374868413098986785659755568535428352283325182993645099162378369653155374131021931261843699904434802022368771208789115558734173174886687017815734914663703423421689129212207413412566174995341165196398703745419245421825756776666796133491582557382048944077997237924013195184539285784349543888737638577471159084726844379956926073297145161264563693767877295574953774737518527729483858159554654723478681786742264685633777206352427512453493108867911723258388999341421440698094669266977694254667425847704750428184232838292849443862273978347377976158887584718461813420997732213815601334616436222164957221197582376148121434107453403058361893979547549637492595886689983445564566987242418492586037986931396676754966982197861075714971797079569145533845272663543954185065926512204880137490255142765952395558262410382146958787289041402568258423843075863368223971716721768124602339656786138159998437634117513611358957356978893690745975215212912986215129801070879611198019365637627767776366448150226593357171716242936480862958239259212497579492853419763819476879985078351071473758267151337323523284201010233716162379825534801544101039319946237269581691371865176129505530301457408271332755963498753027299565888696623134345828155772685593246280236610309043792782687527785817971245975592689921727629335785198744507988527235731587631635671710112764175633914239884764586551403153736794194621148180607619127228839652345763699968851864956529371713601452692759604798106995185225165973261719483666877212598388477736927866486543641123554394248747225722397364376065164163805641587127943488776626691992968141172310113193491129909775963295971894265079494647497147582162174491544099587629553647374744461544687888134486113354936428589621151129798551345425791532448922335487538487581243467659422657808391462614991049847346585785457283429867715079674646501210238673919357672348203274987519569365937213529682354948284652251437236869991011627620785749413650111385777538609016121440147230632287409666332524409250696495631879669627135021722125625538694211522224593680604994199766616478125296671558629763623197567525394381295762797135848285146880356986506777803627826243832095526891312088875557496676254989192740178178279299901050868592242636873111602367776758181239694998169957242434325638802479691349444528784842492386876121564092165273252646716437975690555159548017123189198557936455788676228418602572826245956357829474102549991270954496997724587376386793866335728831619958874156377871924489467940101333436856342096324494886143783589224815481934684861893759677356607965633467556059661494922349744977462668855422294245348785673921201153596043806786676972289946229717632325182827208781907216459216103639511611685857919743818140533061827812137348478272639510543935906647799274378210633541871632364338791368102786594326862523183595423571188459475645353874626095356350218396362788236573928850505870459037992473615646952622996226592996698942613890936526712515102446465341248878518552559558253888241974376581536072868631218192392693164613561695581855458125799584476589486738673524688656627344854320593675135658725543943622805463279640693432549814844736462783968871945515542095612382221026167916811487465553838332268072612480235425155717797742638225217942713856733438193169392666296310678283504465374310142079507989957524181088988760845459297581482395785376562818209833698148919952751829679745752088265837275184517336646859371390249278913990324859775982649626111749614087403840592944548983545751385060482256263391142430394135885764841732772735684284964650687452656147508232594980423449868414298635158047617167585934974740746850978084386448684520269388339456905921609553547156373726413595365999683317295979292887878492342043582249976528674385387675165448527844106146404455735685927541884399905251181214398863411220752085271784942443147472747278135555283055511944715657159672951454882659585835359570602038694124716492783585502659996792934639453623629652573096557051448638494919337757476825708623368858771781869164981058848036337084102389836488288419431240808515755150974913184571806081862250366956523453788056325940509721333934437127432028408679968328756656287022621852506194721398497224285416905944611814762147561426413927114566125970503358402053428887153497763532686852306965605661301817968686208513127129147995172753672840768924917993686680817553573379338153965678213593645140115788133963826148402760214252257885847924882092171625697524946644676385289726302389431146618155319417707322902536118614389340698071705943618270168663953693988392633784866675863085587790569416567557292134417371587941459114844557881266471088232210394434988438301745313713902918573525448889671094702197717116242953375363126860639615295567973128691228875864387876451388289771849769457875633347825487839827983155591251334718253126798892413648537683515061715071702287704446581488954550419477454280376446367518939521168381281299997695477080593920607595535271891624461173366054541613536944152137835439753654651329977097349230129777122398275041151976939657334378138172498288801354306937383274104239676345221267115363445185177180991256547790448585659687715694551716903268422890868056117310957936984928592794771322907386262090567582833641471024442880649886629817724014392414802832845976156086616459692127993312133287337344336377958947172199432710586783968588814161368228133297407298389377659442212244947035741591274927993129441197619487411526746835827929836132287092412388153239705442539930814238286661731492499870891329241778552098715527604334305399748533838246417925956933855180426846205357384956722093564375517194523735431432913921254229797096812871146487747573344091512738406271399975285320257190304235385371617846377458525929799360116579722534804949244043214897137244726196927527247045955595268012549690699390805589397673217382211779591468252659763124416475465190265189882335443222405568129661813662982333246433455659567529668245974283662510182657799540521621829169476119506156809191583774865414883614982095684867775260523988561734337132535618696977377728602861855699453087988368654175569211489422314972317899459173271295825273706111375772796214282485463667565522984757678896528948729038624183967915992682408395763013894652955685104523579532504949506875594590285415519779327119784490218920802757655016953129948924369049789738394422691045957828681830992771725368651797151466905537162620513356187569569152146652916422993656953423435730401281728017674183683445805038984711975661328496374511564333589382985558102960434051191913535596834941374315709374703179218426243811919953945417553235314667864280897444893856873443612428619824256214581883835366583780124397737429817561318062509644711237951598973530827897608374861152854324203353551090696015159957939641388439189872977550771837813233623624759479758561701260681329661476818583349369484363654043777978471253533165125882934648487846727949691533914030117953101446524242709188215480408834701554168836628188107352108427816836854446609044865814898773458072818265638662943689619984165531636698886128716628185047751331853343373157113587399514818011728944688620704586501752631331925768861420579873337863163711326094972142558016359041512495678728352821976265375539257137254661679794564912366225999150689619465424615291382160582350493266746996881964832338699582351430744234262728239141989518449267897255506370258486525780127710363719716394597639922824642986299115696355756769738675574119916074105581117158796655341496887417689861176158207985386657592296734873121026802250614246534743648173775321209230153979635723699212887663942122619072516658588717559899665611529631307543592129992365224984486221417828698051154168388548628912383971297063303525567677673640146017933191602169199291487725468747437844756287508013197449226733207964282330199970416819301468706073692131432029236870152398511735279971743874579052137545462499629876985597342168283911895853978641399539325527361613168124318951808194836319202018464619751922684755268411312216162855822784664372837540689977536716774842288240839930674469778424921528171336705155908530604767615013557146391444204361898690298157747271274493276272664667127138216686443720741428584260545323138478655283896442383148234944276234106139706685779614199588101055186788409714547638386494933020308614824739134937227161726299905697521264975958404026772811172999522389104565944419497223965325774759784918767461202668431078976345869197475417336876948276511777803287757574322519831019472254232243937681226210224840154697578356674736409590316868344450191867429668512828388129523446901028484066132842807533579098933889715668224924963192527924655423582768756210291335942259533322596440795372394522429277368457157986805079271373306313819389652947183336755116984286741193475435326586466628562692396058124759349894608889221529459651118751151050778219564386941465617613525096817599284697358331398538798447376640609814543516268395601957613313387657287910403819587267703334438896255444903689447139702716505134542218807186533395636097298038876538791752188699612320958135565727291842588338428621335891958637503595813096454915207385722339302827743682393474636695384132605276647499541590492270168817979646542462958188148480927747838785761539559223151970746741348051135090321117913579983318895156578674282337736446677546473872634889194979543993561646861972425015453325108053702644133784277199389541244453874315422756167235267538989440736357431684795477965721642887253635427926346415106178786755994813521749547525283839324172764115826159873581129796671685623717562748251526315888855324193462149087934027264724945390274041567442749815304659573663213079327292187322145521291646647718802397516366956132269086656746642372723058792197558188912813635543273977852242178089476365154328907460533844125051513653621123622756775949284498959528139736446348858097933143341597391137117958128341761253304891608484403390205057188948427141136511765668162049429467559065991346379497702516859369112834567065751956116189148596867139148339268346228858324478604565481149699216923530468147842045207653887933419949213687635659482278952710886642293826653448444650718945476493428859176129398415837954797117649059234368312954598464875822239576965478434222406933783821457985682797204822587484679863921670648568868249277551573518999631805360198187309871398039995648369664251995988399294649727082418022417464634123213295683324512894616877696551885252355882485876308456851114542055658323367097287930186999907494388214644085415411121719579827636464749516261521512821793723572283957096543165841592276785524048935699426723689480469832948615491055828085137988679469189614771999286149719981955998644864861825791996196485424060648532886542403498137648708046738459676020274326553615588082536841372910893673756736404214244649356477854580558868225561704188587217318091872679887390285850205363194862278692971635568960282528565824914228757039724250826110818764365567768767887358875572342786459698415967373655803875748868791013512846406998472850858885837031736776149939879268751297587367241976412396112924204742789338209168348198148786841374383731794719913977245792864087228956209422221723719485418814819637345038947154604479504689563593267988455214232956929469558682549054309289343785709137157625846983288542259440406767398096157279153095246825899733375158194340712729857551225466901140208318875383989515124111997125969422241956662387385392614695417024356824227541372122891878485930924114376028913681152095903216857097654328978566629279528862182019104080927687474094112096117292301568752237812555453963126596193615904939116122996824516078723680535422113586211131848482976810217748115418265218509085823198832585722094531078868423484950551317972011704614929159264554536425304174195249976522217421588822158854885038113222109247936510747438924355356659184920827998966365941935517839515222897235164232226273263461165382756548304551994644834963165543363412459533371074719697908328134743568022513619462886353883586182453975146259768051735892103872931276569564368985923686316041203191657863727671932697147835329160168377304835463120195278561589344589678512319465138137308277701313227946363395228919369690656962607632817842685337193026229038288841559854421227362298635256402079236461786082807526175699562977207510476281413362545069257454851435973244223832728095287489895028356288606652227220868081503789131920537958836870178766802738511768641396688781334484405361332834898783851756793173857513113825305330706572211349558164189519676667203617962565902998324844436821653019153131872533567421455120561759978365739035164024454971279594458226543851797822551295174038165289771299911243267837274056271636184616503576325188787288665627141651265650323910833775131453961050554719121911179396325118535275386376706718791892854560552777872511739176976737428226146474684883137312488155452240402057585324415468747549416949298987186624517141732142118248214228458871562022841435661149498399635299308321803362931596518829451818174645396722158524449213239720762535168162946647616079412754397346277464386284194420587635907317824142281034729182166364382019778997201896579163364177875920682478928284577258328388898070843884834157442375432440142526877545371644812053944227692372298676109468334296587414656956841394469471676213468429843561436079106667142368217951596285769566979186787248616363773875488295367352156084593148182351554664356596278979876413577174677690462884812974473127908422429330353664234187562419292873194987624339657447153891385132637568116820342471178619626178287443604574897670191238587881799177811769151751608980246041844365232534923440325219379297939547508476195990584121934045738747241650441520216276851475436285834944409867865777555058198617855063172899997553342030283264914473614542879050891972718034436957582987952732151284448110683457752423804295909711915223748712879543608264709424505371901724348246444743624444198473271713946268529843493149677212991946429644869962106046941052428652486191412314958817958778785344472966797821654548417219353037571236755823729578862480459460226017737412957295474089901743254033337784471173415157215478207021751331755029227445896749664142203977441313878247167251135392977016541150945689598183906040381786411613435978774814471123669245277583479690674620991920871599404255957357896816335831331766661256765757698892531096452656203095205512446329722057899488731339359283531646213741103428818817559625439282564546615198788219847349422888372429818122275563581554439812441620801680266114621941698416326234705944521074844162821958472955704185516686392475829219953749887350985213967237701816565231231123519172618348871718989741823514355456743023374163375225224664751214102336525373847554991517556697513672503621444623989690716894386075226156967217489415602896651295291044869658736296376348858243664920903841906276677375658236386771357756671672172674335286421186823322895741623525518260271187301393829961453028689178368420255860737346231838251793916197889368828090698650843652784543575914857256454062527983413340271574194136235832955244698916519611199170143795296099778817155830972032211486709698876866299098132783146787636488667034482661875827939967991555133366293153279618232241719676952971963669994146715051206846767119494775144616937074323239795759573742513951527834187996841470269599412288365252508550985556258122484817711012825193183586623641657462903133665966641315283126488274385253639817605235595594977236307256163639739996132218746277838241723369237840892113927 diff --git a/src/holt59/aoc/inputs/tests/2024/day9.txt b/src/holt59/aoc/inputs/tests/2024/day9.txt index e69de29..f96c390 100644 --- a/src/holt59/aoc/inputs/tests/2024/day9.txt +++ b/src/holt59/aoc/inputs/tests/2024/day9.txt @@ -0,0 +1 @@ +2333133121414131402