From a8269b568273e20ec4bfabf875e09e96644cda4a Mon Sep 17 00:00:00 2001 From: Victor <60045243+wizardassassin@users.noreply.github.com> Date: Sun, 8 Dec 2024 22:41:23 -0800 Subject: [PATCH] 2024 day 9 --- metadata.json | 10 +++ year-2024/day-09/input.txt | 1 + year-2024/day-09/output.json | 4 + year-2024/day-09/solve.js | 144 +++++++++++++++++++++++++++++++++++ 4 files changed, 159 insertions(+) create mode 100644 year-2024/day-09/input.txt create mode 100644 year-2024/day-09/output.json create mode 100644 year-2024/day-09/solve.js diff --git a/metadata.json b/metadata.json index f36fcb1..b326491 100644 --- a/metadata.json +++ b/metadata.json @@ -418,5 +418,15 @@ "solveFile": "./year-2024/day-08/solve.js", "inputFile": "./year-2024/day-08/input.txt", "outputFile": "./year-2024/day-08/output.json" + }, + { + "id": "2024-09", + "year": 2024, + "day": 9, + "yearFolder": "./year-2024", + "dayFolder": "./year-2024/day-09", + "solveFile": "./year-2024/day-09/solve.js", + "inputFile": "./year-2024/day-09/input.txt", + "outputFile": "./year-2024/day-09/output.json" } ] \ No newline at end of file diff --git a/year-2024/day-09/input.txt b/year-2024/day-09/input.txt new file mode 100644 index 0000000..96e2ec6 --- /dev/null +++ b/year-2024/day-09/input.txt @@ -0,0 +1 @@ +3757112515452571411168788924797849913516953199196383971485363287256821453837652888519332636175284314972817516149789564582078874646458762801512403595788778539994587964111076719860265782786310176920353582325040543376701822901867946536952291189587194548163446998075681297769672277085874218399345332841853953317565584855657229339470995383762540196887741883872363922318627123693067326545332230752229351073631849683913871447615473196133997289443692436428217771997932554764434326587590405652705744454736413030985957681060448270828681411311325085892037236559408314247299164674692271685161942246989880724175544711743292158729615582271423629673741837145936595156344516257696113853756984121010909414684827921220149982631041822531148043492721875797374767608160635579109155454299904023523157747757245043197620104056607423515299564430859422772641172334701418793235778959427223519797834719654682451151255013961566917193859153177456205258596448291573747331246544299717288626614158426338647981107353976911603337167673265623309062432215597741684527452432817877667787873342385026404120254577409538943847564060887099895510555730952312899660521750478013806448794030463891313398747264839185561741523684262559129896871030575380313967818235435438161412315944897779813958676248958459682698685670483572427121541586773364979066101755378576722749939422946045213014386615993645363980221899295213155557523652911946127081105143975361986277662051505816401418723742234551656456526358229968925920722693864036553250387788502322211838252994362961732845194720449782253894365381759923603491329586814173684096436219646252251418382789593795118798129229142895934937792749292124434079697331228918142818338127799378841595368978352557934894342055414945819215585422667697648699549421475973401321279798992538795540932059246587535430422417594172741187253140137914357391291080591459807434865396522933409992495536622473621891166692133857368236354972948515517718376976275415659515773411332112125025438862671167429789936743936371846356248910975919604850701021295817842569975574215330658912765183243550455170101068376298807431106996191312553248844424914480712154994832731521747363971446369063746197206599739349253114563623165525959333842867615534809380556398597973504263835712951967258669302158971428429861456843585288158745524054818863597554894694254637734640841189948064103262624479475697113124499551352914476617346424667683141415378117288455885847194671304061893412623596163789721524657839487458718616346656683588162545388975137054872860438853664043136390675594312691452365469199325120556043414110658044998456554844207166923740549430404860771063661468383220241033705770178867484395192051589917946451469914451892264425351263791582938655195755969876562231619829713945491273544694237157165038672834785516583561628298989498273075178738777542391474873469859248617599414184959953186545667489983678447980507126233940135640177955297734492083261497118393224565437495317520433629693918355140875586862659626763983813967211497918929814286160545853861227582776685593561597172019468050548837489678856848951195174359577448992945327382165947599013472360367049164837746092889210354247149288148719184851877643727428207949546333409193653979769689942050181486924037134374352191481411126593879595247040881699659875828046794617146565969816948347913654746256216735295981331783801881911789837123118030513170699054604253939983409837338820513019525217792695172116959079185682689236221244813430409573407621515127159284766476513081744816243724529131225335177990148165588499434636174044695233431972868197374070341217905026217915562280467973497214597660683269636492628773672661594842501911703299913333595134282277687320873976779960315574763557371549291846971486857193565980699840291672722835931531939117629260266238275872104982847399888324561329178755633553968629883016975214974589821854751334487115504244781198998646439370737799433327172723507236876083179678181189228643136487279396106881336620791849257225648315283044292782795298551259202136212213784423511368408658679015671315495664877774268071719778932721768644454133641626757994826535495122315719115898706721612448704539515062768437956690456846344340635731591964825750927349313822629767396386753310207892144747939971582460631036253188874787542971808273973881946871355768108931554262419899731671478184986663705323997614595546256952675122292890321536302812904719933147919092395153846248137344699168145852577025128020197242637565503768675053247598324484421628698993332829748297115968567647264098277918433339913618655335317623239376767275253699205721625492851015841945502831541985534455425240897134219355811545924094522881425093213886452337241394127379174459597027706941459518396644786243305458704943392597368985982356729535468939892754176552419326885119286077908752175159494945856335795138788225571334452229165338611141784258476641536325583494745531436573453854898072945192186173524752707491445344543941922462689026974383389295639893936693532884631192932625319744636282539812922467357823495065107455301319919127787369292074595293163265578630474633266213409356775869161951914959852558779532169724916181443182844268993693225690721310891788726046125138187934308415123931549890565649179660777863712185986483686086705234107238783458417372635014181098341517133853511661688320417565156673328669867866983263137033331747711330712934467469147699834998493084849840829471452448957946352654748668632721527968187612877437732831688514394975374120765313692352152779338825186515705813578127813262192357843360301451545043752694749973938756808674576370436456188138274124779644759443579359558623748135112144746594434345888158734173185541451546984817531637392849946612258472411225792798865711496465683946212952136143186721211884116770154981456020868127988592808423941044719512424051217982634838237549742178375926277521265519329129691742599686704240669063277572307551227068995141466270458018371789193260446591874646956085269570744811551021147656833063979524986455395664494582675550945584204760937685701960423990432464288895314511895694305462236642994893448575357017523483892558621125345015401145323120695398723962534094912958275541561019984246202122438130951484282321845395203626132260129523603267178156742612201586988877226534165942471428472447264569809834661514198743266529465269389820971716553826638246281122132898788241407485273547641981892354513332532755899797174569912656425864707735938232363630564153986839466852768064976090149325403871268815779158242454166966924332508484791557378331122126337925874718208972799258705769177582454167463887176041583368594750924370958254742276455619411880899097213184255098307961178256514064954387438323448383928569863532866084916541966361948964484497379368645244535555688620762015905024716956795059882359264169815449444025646337753998716747202291526823425357558640169691963699124549505466685566347427127045367570726382143156144625152058983588957815938685896793393099715734417074193530941530701239147187938381453096622023156625955882948420878398676144987370186260563873623449919426465079103737742581915168587032295392892284908118113930102733553431855418377242823332753686463930788044645470246877161862386436918142312097808156635075139647272995312091418934542691747045367131454067981381278358362764619686456290221780589576579029157514121753435728599750295134678292899585542025648424976028745621107272508241137079568818685841599691726537197171976040621486939148596199363047391073753461597075452286688724172130142459625860828056718633521937614379528525693194599775907958254893787325519345835932688312357844292115965461475077415210585249672133252920601192138187873892606530638447185242953528882949755090407412834285314767351985915348391739278068232188351711485785937814517242798378922598872423187691833781819979538547377392686959443017829355302332737078469818668182794384673413595973296836597161474035103548609670608865959088996715824367365488248331492552414654502936842331141646935911361113664965592079792847664595735514883282484445678159786363612954982220674679616048222412928854327468541381259776114747153698934836861628876643782558554324771043851550358312849387876419273399518016546991552285558932381690389547858999493046958054743927971234204837118836101196907160125353719217527684649954872327419536598794396016122753981121376257873740548837209976504377201931876334419775523735491592774234752692326550989849181942329877564169546015767370687759398284469254764266373595279116621147479179273985368479725711643788654182321499774985891513908488428155633398434339815392595316505252274418814399451983873287181433446452512614837036666182517721939918853038311166141776156065311881178194451682349976952989106688143837879999386448293684958464483514338045509814719054662349551734775746353670223125786274339280441669425178937779629622502566103366266373519822255437539442791579432120701988444831143948587376773371237837844151881524438213366985322379564055681640807127523947231298387192846725522337109478319849163495895260325072535063733456314169871641137737547947426190441193389141432897729191298577347353213617578179511482478932122835617989329371242163351187523028852091152840324486817245134492247144265472267022148691157140721493817673238225885528688222615229914366155116666467151763594278575173178382451716601529358172612736799489875076165177466198952940873367113531388536827042765845366025676239376047677667672586632111346824795614582029779248879417924184101271928883514771731042652464909665728276441011326457674723293128274961767559214899705627571874329449798464708673306710249082222454936711763398561257889899548871875812608143412016526572829386724629438359583089398619774611151574474259567541746810989822746622613392505793654767842068381770755075382263653899267451172456298137323950904687907126552743714593306734834936913598225391401012451895859594583566954231199656677240468123774684651133807910127745876395617961795276291263221968238732727476709688242779307469804177261339451157272465531756316244835822774765578218702264146222424838519574214882852667718495757441385038397956369070707130822477617973115344212319128474489859612815789655735224891275613998135233853488692774174073558026657290794125614248489567856445168849275796471257469692645827145153656830757167866015781589558635905936888994428274297449635852938429904410553696608217914516659798209448813322699214207840976818469560123696947787869987307348684233179493129133464199667120176214866034112715996273248615897868744672792879632058718979745099211894683958173745255023707545766754928979444512987524894080877258566449792894625047855494301036409725938385173569951591192027988579497270823066238775218753751312743388369832348445824936474543514958248182871753238298852561832390129861992272326793934844305924654491106491232195482166262029523372549738204259314167633867137313698759691483181781928348699943794681418568175684967428278893111419235639372271279118515748415111523885842393776895209282514529136038102780236422672620968549742084439345929723955577196977466992883424772073285876653820995559956165301590117940448842577688624035529477505862764136335012303292662757985168924368171225285431552891519147263289734184217813895887128579744057706231915725945078838252742483811881324453491923168868339363919965673853895373738992905598185874515814645926369293906238991895483395624054956039574320157767631483845387509494937757528757911786832033622274936560527853368186153121713646584267776750663111814222363515282395348344136445722568534029656898949651887461187314786940939911808769775671181285347157137815859689417062875529821142241958588647689117686911293846919976705099459048711586172062497853672366846888269622379713628017411527864517246147905688847954188440799724709946863512858743402923941186261982493946884970178551691945906653458368524590845947961894623216283378446988203149547171201487773136771595758237874717131075544851958025715486521097554326947541379752338335935244628689848635535410519596267882908333539896653811816915873461183715615812807366189527319050158445664350131367915789983670697854146960987833222621726574151341218569922425582430509516149957749027436416474632472110448615892780532760718071535087394560321161269377704566135148247382658343625396173635358211656732929655202993421414654765887311311951394123891269526742542729575945252027836772616053392230587811758292991142339959668828175638152876103236596074115374636938204481358377922946361931229351326927991184264588408327643053384921528640926022378336362496686074419430547237947077642830559049653546969156751380908998721440518062433752102036181132455362335920859448924392178565273164718180842678577947276221274963153696584020306029221417166873318244728557789674159484668214529241349668575476281710785048722823618099511812697621385732505790852073226617675112642644888985617874167480383116629329272314263792561043579020914861545798787215413849621083875455553290614559602346953640846390762843218218874028979380106840434310133233557747913386333366226191548298142234834986144536741191478079852669821052797067181782317382582581511076982630137784743020266236573329622994199212208352789727371537307520499579486938436859289824574795617510147988728716303965242333792817373213368348928637402085144781288472458349945984142753676644464837407189735848703813195786788493674654975621506771722438523950952340931541743821858086664088315121141782971739926763834716451445661585466086432989108812601684552923483181662895461765479543277814251185122274355528791170207569156063546086957030969126265116834934459766858063826784488755827588142265181892327146711487166890637826433785648864519933733736832165458378717550802849386526144427672359271357788293657538344623639449127073956914723328235969116777832921104349804329848460604555602581848345994919717117454393409952747589307459708219979517696035322492699720921457733375101724249836758622995250669832656855211875384340792810415680488619973778799767344052259519308872776185934410642442835381728569743931909949633887885018892576666399144347724580738259858364614415706282549859248552527078941263892027206571402513597287785680949516949085593070489748733299542619649844819249531993331280979086845169631162628477137076949838694026149362768183781583491049359327672274544034471241168228484277971668339978102268222367527976142154796860943426614712855331241754492260771024831880316588244733595210628244947941734767832338215386722276208542597328331458732835719837615610825398477648781348911774415866242432866179251937892953707946584759275970677218268174243963598073441457423030443621197954727314873259818758518124745029738092931274165138939045637587549443655594608012424845848721398260184811728422908569785992811552867689677972811878396635243288422521769756859785514344113938513671733116927123234111943916548817343842462246993644632743182777121168366597322877704276441584545042271443857328794667968618123574771940388271983671837877304736629583337323475859312649335889419626643727644718195698468210266511545572502242145054959751405559716194597965978747864914542083584687332526781757595633677031117892851253481526293523463317661269654837144479279750271185631211285689197148268364644924896486249374446144908083941395206985372556399691985888238517842816147136249057388387607673969799521949849722162690723817856055883041478762939783604364225376521066746343428539294538391291318633256838772215913067864253657742253064778796571028271470373815978833741048334656494488992458675769132596812394443222108333899961778542536741826074189915815927204613611669845426631521691549636959558650374560143472245414785931697746307989519439861459659426874770819741159679868625902610407328641670477578429116722287123894728331219972657973833545454454916032144876966866906073576079764914512164522916545575385358756478357238406767163638713561854053793985828976924822307975866353463393935286446571672855976631776115763944135219475990186072145388824614168746603357593135387521992124791938455979869997507066367072329517366775463731311471938248225933806886931187798425194225637123831861614859576162129525736079179676825072685156911859485770834784574219109315767633281560394473613080734536592757377122344781556384159450893855652971782245427878533420158329804537338596484981847137306337763035298154162741732971112189208821546168935714965532323951582086828731748974694368607681867849201493454454999044143234585730503254253144192923408237839470847475244395163880814257727858986248981764104593628928696872903677654555718090679534114656272029788775864193315969178831901165502255735575661476664782428719154262959537278453896247854840928661441253805280647493496751847320568115429367654755678117792618799220962363694959285981654126387517699221954517961666375522998581822949999646283416835284965858578640678174571826693852891782348334689429515152116230172597757388631599723383437572492654207096655717354356608145394616496170449464164955144789141259376629293619474398371646889828214652779083225132299064886740483450192963335342642251592348469286673180868182803874213691485755405016887633776594539185621943976990346557817053451460537151165168618510901119961957373549472427393558105484603493169132169594412531188456285452188641167247158527732519122597104820718913725438869947815760137084464266716412741255519885867530292257192072654762678282214018335684261292175249836646958289927070412842456262767564494859428842935712303791517336242464143671133292241931966169921244914826892387206091671468168816855047738544696930131761389826365879496089732629431457901816567144786896747179483495207038342013641945789337726717734467738523469998853624154078616175314213892615383156177226113814855698319658791922942310372181415279219219326164258020279473751079639726591753143859387547526259209858119740407530296498584189834763347420997321699433191518401629394281723844213956333760272839724967768024199878882047394528885055533579979680412239943638661985606841603720419379338619306565228564761142659548694036538830943234698381276039132579952769335654952641414854264267568844384780458160656667234768719656619165258236356752766729314655529689423362834675587047239744898979968593726193192866318479405268761560363541394182444498875072273055261623487466193994417581554920216666754083944152587185739058537631544617317465291291444271426692435472676280662092775678159251231284938648642818329940866489417372706929139460313541386345615676746226799390222038972511632530681458355138373160919537829551282464835636167446357055928593568769734223991714938748563626666455876328481997865237888760172387761668216043433247944021816998364927795967225479947160164847375642175840406688689382466599554017773650793768645117188811448152705832462428848553486942916141675194969614901182913339379924177954825341499685186045659067136730214055286792481335571945504644885790704461173752373745399261412246175196446986847137405959822368302065332162546257222712911817268981988540833828475213506990138859204462477925422861929582202018301460462927592479921846492754403259753088114633895517568550109660417275916661761187681876624923426579327948666613634075206344801537969558712077733183971652154067633076577283468735544488474376719920496545326512919239802366852899589617605475911634754867687947293528194577196674545989487148958528696089953988728175665618473968357165137817437026757977599039257179428163729129541427533335793963538617116913716988183087154281501730106171972994672567602247424054459453512776174537643816377338476472704028881464551356967311147486958897517244334022622952764955702871327385623019287830828874994986472433694712233892467212584197676859548845972514248797238789883930672263599948332666112690558024184564141099879112791284136999233589188412269648516628305142494297567281794275387835825987622182294229247586188642421750266625225578214743712698648797232357149432391526993089395877227519769028904637514036184136634948191432198184854164117954145267279468824413999810599691741880827032685539232526847695997055421455976420997023139659563341908640851740509818611723478527243591671279587269865218682798702511847925187776217153534924374130108378744627869383498959165648144088235324743979717210195988486099934597721361122492446918762651943732788171581044531037426121519732804 \ No newline at end of file diff --git a/year-2024/day-09/output.json b/year-2024/day-09/output.json new file mode 100644 index 0000000..89434dd --- /dev/null +++ b/year-2024/day-09/output.json @@ -0,0 +1,4 @@ +{ + "partOne": 6331212425418, + "partTwo": 6363268339304 +} \ No newline at end of file diff --git a/year-2024/day-09/solve.js b/year-2024/day-09/solve.js new file mode 100644 index 0000000..58d004e --- /dev/null +++ b/year-2024/day-09/solve.js @@ -0,0 +1,144 @@ +/** + * --- Day 9: Disk Fragmenter --- + * + * https://adventofcode.com/2024/day/9 + * + * @param {string} input Text Input + * @returns Problem Solution + */ +export default function solve(input) { + const fileSystem = input.split(""); + const fileSystemExpanded = fileSystem.map((x, i) => { + const type = i % 2 === 0 ? "FILE" : "SPACE"; + const id = i % 2 === 0 ? i / 2 : -1; + return { type, id, size: Number(x) }; + }); + + const compactFileSystem = (fileSystem) => { + fileSystem = structuredClone(fileSystem); + const totalSize = fileSystem + .map((x) => x.size) + .reduce((a, b) => a + b, 0); + let start = 0; + let end = fileSystem.length - 1; + + const newFileSystem = []; + + while (start < end) { + const file1 = fileSystem[start]; + if (file1.type === "FILE") { + newFileSystem.push(file1); + start++; + continue; + } + const file2 = fileSystem[end]; + if (file2.type === "SPACE") { + end--; + continue; + } + const minSize = Math.min(file1.size, file2.size); + newFileSystem.push({ ...file2, size: minSize }); + file1.size -= minSize; + file2.size -= minSize; + if (file1.size === 0) start++; + if (file2.size === 0) end--; + } + + if (start < fileSystem.length) { + const file = fileSystem[start]; + if (file.size !== 0 && file.id === newFileSystem.at(-1)?.id) { + newFileSystem.at(-1).size += file.size; + file.size = 0; + } + } + while (start < fileSystem.length) { + const file = fileSystem[start]; + if (file.type === "FILE") { + console.assert(file.size === 0); + } + start++; + } + + const remainingSpace = + totalSize - + newFileSystem.map((x) => x.size).reduce((a, b) => a + b, 0); + if (remainingSpace !== 0) + newFileSystem.push({ type: "SPACE", id: -1, size: remainingSpace }); + + return newFileSystem; + }; + + const newFileSystem = compactFileSystem(fileSystemExpanded); + + const computeChecksum = (fileSystem) => { + let pos = 0; + let sum = 0; + for (let i = 0; i < fileSystem.length; i++) { + const file = fileSystem[i]; + if (file.type !== "FILE") { + pos += file.size; + continue; + } + for (let j = 0; j < file.size; j++) { + sum += file.id * pos; + pos++; + } + } + return sum; + }; + + const compactFileSystem2 = (fileSystem) => { + fileSystem = structuredClone(fileSystem); + let end = fileSystem.length - 1; + + const spaceLeftOf = (index) => { + const currfile = fileSystem[index]; + for (let i = 0; i < index; i++) { + const file = fileSystem[i]; + if (file.type === "SPACE" && file.size >= currfile.size) + return i; + } + return -1; + }; + + while (end >= 0) { + const file = fileSystem[end]; + if (file.type === "SPACE") { + end--; + continue; + } + const spaceIndex = spaceLeftOf(end); + if (spaceIndex === -1) { + end--; + continue; + } + const spaceFile = fileSystem[spaceIndex]; + spaceFile.type = "FILE"; + spaceFile.id = file.id; + file.type = "SPACE"; + file.id = -1; + if (spaceFile.size !== file.size) { + const sizeDiff = spaceFile.size - file.size; + spaceFile.size = file.size; + fileSystem.splice(spaceIndex + 1, 0, { + type: "SPACE", + id: -1, + size: sizeDiff, + }); + end++; + } + end--; + } + + return fileSystem; + }; + + const newFileSystem2 = compactFileSystem2(fileSystemExpanded); + + // filesystem could contain sequential space files + + const partOne = computeChecksum(newFileSystem); + const partTwo = computeChecksum(newFileSystem2); + + return { partOne, partTwo }; +}