diff --git a/README.md b/README.md index 875c488..a397e01 100644 --- a/README.md +++ b/README.md @@ -6,3 +6,4 @@ | :-: | :-------------- | :----: | :----: | | 1 | Secret Entrance | ⭐ | ⭐ | | 2 | Gift Shop | ⭐ | ⭐ | +| 3 | Lobby | ⭐ | | diff --git a/src/__tests__/day_3_test.ts b/src/__tests__/day_3_test.ts new file mode 100644 index 0000000..3ec91ed --- /dev/null +++ b/src/__tests__/day_3_test.ts @@ -0,0 +1,22 @@ +import { assertEquals } from "@std/assert"; +import { + find_largest_joltage_sum, + find_largest_joltage_sum_unlimited, + read_battery_joltage_list, +} from "../exercises/day_3.ts"; + +Deno.test("Day 3 - A", async () => { + const battery_joltage_list = await read_battery_joltage_list( + "src/exercises/assets/day_3_test_input.txt", + ); + const result = find_largest_joltage_sum(battery_joltage_list); + assertEquals(result, 357); +}); + +Deno.test("Day 3 - B", async () => { + const battery_joltage_list = await read_battery_joltage_list( + "src/exercises/assets/day_3_test_input.txt", + ); + const result = find_largest_joltage_sum_unlimited(battery_joltage_list); + assertEquals(result, 3121910778619); +}); diff --git a/src/exercises/assets/day_3_input.txt b/src/exercises/assets/day_3_input.txt new file mode 100644 index 0000000..f3c5745 --- /dev/null +++ b/src/exercises/assets/day_3_input.txt @@ -0,0 +1,200 @@ +2555245573282137352766682525526364435746545343523394355638332326665366122245646523573255525564158774 +5413546422442523229295232262733493414148154532639862333271175557334235334296623642342223646213476455 +5433332355353372756453622653442176834335623343626343236463374522272945534432336513564562366234336223 +8587847976565774858953965468986376666446479587478457937677478585829659678676687889878667678628785855 +6725568675552323432643555634432545535456664533555625265445346557244554345575553442385873456485265552 +9635355438448533559523575659543917474655454558565535466569258555554341635555765555575554355746548434 +6334336636325533344553333342445422324353356584464747446345433244635424242342533252332455232342441523 +2232323232223333223433222223123323333233533333132323333373334422234233233234233353331333324225235335 +3453244144313333334225445843256532445424644455423563444533352222214431521555446221352455525534352744 +4222312242222382223222522233222244222252124224122232332141221421123222222222323272422422223564223122 +3665575656254343645544656646746466563665352664365462466653467356356625626343263256544665546553555653 +8868657846574287538755799635858158734635886494697558788974725689798868576477687776866666753869689648 +2394435233234444443212426444434324334444445645433344444344424164444243544324645633244244434434344683 +3332233243354533435342424331323662422344253463563116365314353545433353432343252532424442556323332334 +1323214134211344311144234224422324424143224143344311323144443141442413142114111123244411141324256789 +5555482427856556561438464655344682243557544654673314386626448364445555654745425534534545657564668662 +3133221322242243224332522334251243344322243232322374343332233332233324333332224452231323411422423422 +2122122282221242222223213222222222221423223122232322328222112212212256322122222224221162222322222222 +2121423245343334523343334231542244135423644433421243422342212323237443133345233221333423344343623222 +5312325252622336223612818151262222267254232133124327226531225248123255225352334236321246631522621622 +3557342552354356363355442242355584935534335363451245443455553353135453762254455324454524545613549235 +2424122362224232461213421531227441221241242211232233221232231344444212134222222322212222293223524263 +1122227423222123222223322232242122433221312341312112121222221412221739232122125521281125322212142322 +2673232362764725776575337633457437662545526562533966337745691623542772266356256243476345327233433834 +2323342233322222222311324332312322332332222232532382222212311222332232313213321222232282133231232212 +4221244575224224228233224522352415234264233252652432141565556214844442233244354421744332123233526222 +1331232322232432343412123234322242932245225222233222323354312421333253224123323322143232422222221353 +2222222222223235213322222312223213122263233232322322222233521222261222211212222323212121263122251222 +4324245113362244152243712422245235221423134254345524541353323422522245322432522224224522142822525257 +2578316453353372757453453363342646233133354959333376248434663432317234632133996363315353324333833223 +6652222242825222221442231223832222122212133312232242322244312232212222336314221242534126232232314312 +2122322212435425358523342132223143142522317581625286232223342222181551622253542225113215215323216424 +5243543227223123522226435222214523353423294332623323225833232421131226433388228216142233666441432326 +3686948544446344866654654689566846658258838872968654764673688675797464756757724458892888676744388969 +5122222221234226122222122222242122126232132142422231221122212222312122132222124222222522224122222224 +2312324432333232211232232232222256141323832223231232353232227322232222324223237123312932232262335142 +4353223337238234322333323134632331326332342723234322223323433833223332333892343332253328633626627377 +3334284235525334724323935433542563533367562326346333332264455333343543673342432373653233333325352344 +2122452242322821242222491222222222414222222114424424821431222224222651424421265232275321422233223224 +3222332221733544222324233433833233212132344245344116583322332262232512351327442342253312615326924424 +8422733975263681952227832426355332693251284223632322583938683262547198863782342447397579954522532266 +5344526323123123482423413134372344272534522237343634422211232353544363344527634423242566122432442213 +5544444444544475443343444443444643443432534342442262444444443333333434346444356444446343436614444344 +2562222222212223226524422322122223323222222212321528224222123312321222236232122122422212622322622122 +1362222428321223712423511422932124272231263422714323925422943333537226341275221753238272444722222233 +4212415343225623522421214732314253475222134225325826474324342233122334242332338155471354425423458426 +2562223222332522323222125564232212322222223228342242222424244323241249755732165211423224211122233521 +1242322333255324523623343543212232322322432122251232223532225232322332324213441322533222441333352532 +3453232332433433363333334283542322342636343223322232335733543232472332232236333353336332347332633333 +1725417647425561541234572275622744647722241735336218128384778727854584383531763168831773488155888719 +1522446332232322132232522221122185117242334423252532392423242242434243214352351222221641124529261333 +2232222223222121322222322222212342222237224212322742332322222122222212912182222122232331223122222225 +2432333113333322221522323522313322225242218223353321212432322523222234311323323113221322222122123222 +2247232463533223526323752362263722336323527233143314353312323466351363421222335222342333343522323358 +8221154228333443922523522332333132336454413421343681223333332244312634333232131333333222433132143632 +3343443243423443134423492265243444224243374432432234333374644414347832444334444543424223431243442322 +2393243334232412525232415355234232113343333433335423535553553512245134223155553634223342623431533331 +4444344332444444424344434455243534444454634251323454444213433343343464345442463543543453284444444364 +2221221122225123222224122522222222222212231232222242222342211222252221512212226222344233112222222122 +1542333694524314331323153651644423424546436273645634456134434366663321534652745426342424424455222311 +3935743338337433653364792336733332343538543433516383322344236276634635647951636375327252452623233323 +2122262235525286283123183222332233223822327222122252332356429235352253234332923312134352133243222932 +3635555535455424445655754444935425453346542533454434445553543344336444444554325323555434555586545331 +3244441432544355324343443322443453444123426343224442344434343234443443424346244331424223143244423433 +2343144333443433353323425333433333433353332333333534424323134423533353323334234234332313342522333342 +5344455435524612735278425445744422252242244574433434425325222445345558354322345334242434525143541622 +4446535643565733551245643664341675648246536553545683535533556622556566541564647764736535235665465446 +1342222233222222442551232222231122362822222112331123322232211323212612222266224324222222222251222122 +5462265565746659657348434513426352434324523556513933554415365324354636222553442697434643345441243538 +3433222772325512164333136124332324133223223266333324657422527341311213455432122312223326221422214624 +3123724236324313373624742564433344333522233434332433316623433643228733522234256735463372541622722244 +6626627555652777622637665255256354642356594678571223254715445475546665317246662767346735763653526767 +7633637462597748227556474425364835474466357777349537346683456367642542753733531772736323245774693493 +3333432336333333333314333343343333233333123436654333333323333333224432333333132333463333333233232322 +2294212679457563848346753719657771482455849656257114443711954534474239844322671464334143584221372437 +5233422242235354425214584332662256223223234324253422332232226242235724552341323257273444123126552351 +6624322855312322243623433233432144748638132536334511373552422233625444542423332333333733252339336233 +7432353425125454233535242534352325553442314332452443373255542544222134422532135324233323434334365535 +8738556132488742884427532342423635327963381844412858524137528776125434474844438935374282879495627591 +3715464344244453434482554436558354533464535355535544538743494445352355456345355555554548458455355463 +3214256423113343433443434433341115344331434462434454443143442444524241254225453414446323336334213424 +2223331122222112424622432122422221312222222231221322231222231212323122232221122223233223232324412232 +5272131222224213172322232226212241222221122122222132422432222211222222224311334324244132222222126282 +3521316116613624156133635434453324625544551452142413423125263263432653512413621445146461526535425789 +2332422222132433344227242223432333333344223222324422231233143734323244621343323243344432132233233321 +4235543322522444255511256335245335253546624222234634244341222384357525242242425333824332253522393235 +3367322243225554232322282222235223334254242431213212462233132325132251543324122142135522441424231124 +3542445634224165237844457233456464453346444543944512522415543934654434234442453357543726437782467553 +3122227242342123424331222222222312216242222725222521442223823232252535232222416452726123622315513622 +3333244544333752533433344433322451442334333234314362444312434654343253324122246352142556426354332324 +4323231123224331246322434222242333113223453632244231322332433227632323143223322326213422452232217112 +5354232322351353362463332244235375953362614244626334453443514253436355564662633524743573444523574443 +4535333434353826634424446335633323495525235328542322345222252666325434446235331233257243612315322533 +4451544253436254443233442333244334345344353442342464444443444432334244341413352334424453953424334334 +8225212112622114222224812126134222224263245224242484474222262222161212214213444631222779623222551347 +4521233332431214333345121243434145523225332443512225423255343255225213424435344135224544511513156789 +3223344423222431424523434342231223423332522325132242223323314122452426142251231214321122443221323213 +4347454559995245975147244444733762333385425584487342552433793874354853442454234374453254443534544626 +4222532162212321221421221431223233232427226213222222332222226725432324335231222122122522322312227213 +1231224511293423231245232251325232232323233642324323332223321212532251326223332252222654136327224222 +2342122454434453343422341333233233332431323421421522233553333454352153363324323232526324351333334232 +5345744756675595635594675676335555979777358664836465475573546725357577455347786458695364498743676532 +3524763455522424332323345424524223434534544546375534442463224455468434137164454244533423424447435564 +2356555363553563435355375334535444355343355533634453533533432533545355662445633545444322335533424555 +6225744372552734434415535555653155448535447353446556663221354854466462254223255157453452325543427614 +4448449433441443343444423234544344544344444444444455485533323344424354444444443255441554334444434544 +5712676515344145175343771556132372542165774575453347175532122152262467117711655442123212657616671789 +2132422253442445453624241353344522255333543254525341234342224633841532445674655242414544222543423223 +6353356353332533333322313333323344335333533323333243433343342333343331434333393633323323433632335362 +3523523323333352232252325232335332333333223333332332333623232233233132333333843322535422333463522273 +2222142342523317216322335361313275322123222637221152222323522222221242223222334252263213232422262312 +3219212221422422112222313421212323212322122132422312322312222122227223133133215221253323322235322322 +4251661432722234222224532335345422243322322222222583221173423246222225321223322223122612421332222526 +3222272234222323342221133152431234522243426462651521245274225472353454644534334552442636842232255325 +6233373325362212253466325332543324232532525542123321354323343323752233275333133334543253533335364443 +2343223233122212723422222211224232242242323221322223513222323233233312222332112232322532432222212224 +3252231422615121622412622622222276523212322386122261232242312321523221215251122222422525212112633622 +7885764747473653363474675637675868784443728275273746566653968439767274644776724364656575545442645434 +2742222242224223222623223311126254222424122421226232212324332332422112133232132312223324264232334112 +2331522423323322314332234123422223323222331231333222212745343122542221254313122621333233332323323322 +9555645637577354531594343836443546344441549463736449463593335544845446544245423443433264444357848452 +1385436365543456564545352363646365343464545657333365536633631274125426633142836354441435354445743335 +2332221322274323321743232343252126323332622232233222222342221612313732322213127336222644322221221222 +2123421213211223122321224221325234222322422222112332123422324214332422112232322242524133322342222422 +1424234342425353262131243233324453469225544444331133244284623265324542323333332632244331522346534234 +1421224222243442242422322223243212224223221222232222122134222341221121122222242133122331241223332222 +2344226245144223324252222423224212154415255222234544566533225326223233422136334154424262322242165254 +7253255334362343272221542631239351582273555146521292862172342422413253513656355132182894533254925243 +2234433411442122223554324222252222212322224251222222224334521225342522424222226112222322142254453232 +4432422233313341321226422241222341234233312343344331144233213433264341351332433113342331216432232332 +2324232212342242241322251233122222132222723236524322322322233233312412332223232323433515223342423332 +2696492134445533665555445454825344166569343276335493725432593746342533433344252517653232563354344638 +4374833563374364524943443434933523273243231615537133533444394343635464445633633764697363332743355345 +3233232337222344843342347312434253383243473244332434534344244457332842332315343344337342243233334954 +2422413433243245254234242213553233336242253143235243335334242455446353322343432313342323152113372245 +2342122322322322262135532222143322223112542416223821664253126616626365212332325232424712266422332322 +3324213845427337245332232725322543322249333653573633352526627655222342332932738334241532233393563435 +2322212431232822142214222234522113213222311213232221322224222212223432262342522221112232222242322132 +1124232232145245224222212422322722222512113224223422212224221222226211222342142222221212442222122223 +2122112132112222241225222412224222222233222122222352225222221212222222212522214222222222222324242223 +2222414113212243814294242223442232221242421212122222226624621221672122261534212211311221222122423145 +5683478244543237344346337321844635327637542741744143744364444523144435444532464443237446274666346642 +5544546424576644958845543756142442244324653942243149426339732713469323566539553273432744244442137272 +3422222222212344222512321122223227222422212222212221243134231222122222122422222222224241211242221222 +2373322222222211322225113438221224222344437222422342311221224422224115215222532221223123533212224236 +4337276796342256572338937454577475337476576546642449422775625729961252662566427727345456522373162622 +5234735933352433214173575354635765532744333332623437257377255284233732356365642365345334333326231642 +6314324553322653335345324313656543651344563353124262234333333444535633333993631243433332553145532233 +8221222346542321332775332322232221246223222222222223122226224422242242222223253511282222232122622212 +2333525243332432442432243252232213461332935352512523425322333343324252251221442144333143332422344132 +8363527674335693366826473776748553417989447665663633949562873467376626336353727738173354327456323624 +2212418682422432131122323252232212222383224338322323244834262453222241433232214222148431322253592242 +2321122224122122232434222322122222216222154122212262222122512212122312723214223242321121232521324125 +2222114412221212212217411222143282223382217422521433223141264252426121427211562222123232232722422321 +1222222211231534221322223222232322222222222222221323222224432212221222222112212321222222114122122222 +1122223424221222426122322221112233222213226223112113221222112147122222222322222122332124222292322221 +3343553383433245385145525365335223232363234546433824656332513526381332536324282236422583226353133344 +4732492342765324333513331739224822772634321223342242412333243322324222132634242613842234229462423112 +3125643256275524556332433626714545252744344345433463274546853524474352317325515753446325665476745366 +4224533511234243433542452233215412234232254442332223222223536823123332122574223233462212423252423122 +4247315263132423712386824414634276157333323293232223615513428582434447292185243492234326143836418362 +4533135724245644133333224312325234212145323234235243533642425413744252123232242443242235344123432444 +2222324422234333213323253223222133123333243352328532232331353313312322332332222231231122332323232242 +3925277534233874349445348885622447586356642343831324762824654436557286644843488438559417556565854537 +2222231212212232222221222221542225122222221322212122221222221112222322223222223121222222221122211122 +8747687636452444622834433864483444264454254758347914745364454274428473744361498555337843348457564846 +4353333532533515545542117565634551734335455234455353435456643333343434533934735634323545455533553553 +1133432333331333443333233634333222232323323333233433322533332386332323322433235313343223413213333352 +2244244322443326426344343544323623344754544328349234314343326845448293685333624723325435746339254445 +2323262442326232462423644222126636315318944352482351564262343746212263354522225236222143623254683421 +1323321332247222244412322421222252422412422441241226362444244232222422344323224312822422422241216224 +5366835348333754465654557444743456774564554545676755765533846866687637547353772775554935754554744663 +3243533233134222443333433331522323422244323252323432115433224313143923543332233332432233323323351333 +2232424172522422212223234644343262423333233532422122421131662222413423422335221632422322323415342421 +2426433332237242244228376314363645235321339233448524233924263344454222234334935265185232132333322242 +2423232422323311334233142333122323432423133532323334332123332423331322323832331323342433313343332623 +1232443222223433434543422924633243432342142149333343414483441442423454231343433424422324344445532413 +1343345242342122312222214214523323323542222224422132321324431212225752532533272333222341425213223162 +4583753843764756856378669635655484728768368883857639796465655666448734673438869344669779786636653223 +4444333435553234263344433374333443333332333332363333533324525233343365343333642341362344262232333633 +2321544242127622332222367322414335577334624261322252843276262244257552263532252422824225219332512533 +3432142253337532132333433232522337322284612323323532332435333123134435133233342242224233237223232123 +4333231244224221232232323232332432622322332223132432334243312223322432213324322323432433323221332333 +2221334423231421112242332222123422224122214133424132222222212433123124322322222322232231213242244314 +4312262226342326245321221326223223242221271523232221236422231122432336552422242221232443126738224214 +6555955456378335662853453254665995357775339455735458554366593557734253755782381353465451465459348355 +1142224223112232222222122522232233212223721132222234212522125223212441222212332113424152322317222222 +4546635437352668454442256656465657544438252637452456575656765956535653447444766785663466635754645548 +6755457674885836498743795825524658856524686556745867858446686859549868578755488587556654767867599767 +2222112222222222321112422522232251212122222112222222252222212222344225222322232422221223212222212322 +1132327442133434423282144223262432324242211243364521334223133364432322223322242222723223325141233321 +2326333332323231343613333332423333134123333333333433214323333342233313323252633232243112223334334233 +3563245382268334211461225534232239213473435467263454512214765433232234532627426679445435432572288166 +2362351432332333645413425523216643433243323446435452364562331225326243444224322424342222736234422226 +3235427912235161232225629229228722121466437262984421214262299364422857652361212874355873327982652222 +4433232327424373423226656444524323622732431273631426234347253474825556767433324532334423334462622329 +3522234323528426342653217372343242533467422332633543725133534325533335557336153333543343443323435255 +2353223535157258454242545555359216443755555583323254553443425455544244542575524844564253462244655556 +2325224215124223252521513224722214442235422621153552922242312263378262342197222373332245246222432242 +1212422224352324224333264212322156522232312432522422111222222521313812221112222142322344111253222322 diff --git a/src/exercises/assets/day_3_test_input.txt b/src/exercises/assets/day_3_test_input.txt new file mode 100644 index 0000000..7255fca --- /dev/null +++ b/src/exercises/assets/day_3_test_input.txt @@ -0,0 +1,4 @@ +987654321111111 +811111111111119 +234234234234278 +818181911112111 diff --git a/src/exercises/day_3.ts b/src/exercises/day_3.ts new file mode 100644 index 0000000..c1528bd --- /dev/null +++ b/src/exercises/day_3.ts @@ -0,0 +1,89 @@ +type BatteryBank = number[]; + +export default async function Lobby() { + const battery_joltage_list = await read_battery_joltage_list( + "src/exercises/assets/day_3_input.txt", + ); + console.log( + ">> Joltage sum:", + find_largest_joltage_sum(battery_joltage_list), + ); + console.log( + ">> Joltage sum unlimited:", + find_largest_joltage_sum_unlimited(battery_joltage_list), + ); +} + +export function find_largest_joltage_sum( + battey_bank_list: BatteryBank[], +): number { + let total_joltage = 0; + + battey_bank_list.forEach((bank) => { + let max_binomial_bank = 0; + bank.forEach((battery, i) => { + for ( + let new_battery_index = i + 1; + new_battery_index < bank.length; + new_battery_index++ + ) { + const production_joltage = parseInt( + `${battery}${bank[new_battery_index]}`, + ); + if (max_binomial_bank < production_joltage) { + max_binomial_bank = production_joltage; + } + } + }); + total_joltage += max_binomial_bank; + }); + + return total_joltage; +} + +const LIMIT = 12; +export function find_largest_joltage_sum_unlimited( + battey_bank_list: BatteryBank[], +): number { + let total_joltage = 0; + + battey_bank_list.forEach((bank) => { + let max_binomial_bank = 0; + + for (let nc = 0; nc <= Math.pow(2, bank.length); nc += 1) { + // NOTE: this only works with possitibe numbers, for negative: (nc >>> 0).toString(2) + const binary_nc = nc.toString(2).padStart(bank.length, "0").split(""); + // PERF: REAL dirt over here + if ( + binary_nc.reduce((sum, n) => sum + (n === "1" ? 1 : 0), 0) !== LIMIT + ) { + continue; + } + + const summatory = parseInt(bank.reduce((sum, battery, i) => { + const result = `${sum}${binary_nc[i] === "1" ? battery : ""}`; + return result; + }, "")); + + if (summatory > max_binomial_bank) { + max_binomial_bank = summatory; + } + } + total_joltage += max_binomial_bank; + }); + + return total_joltage; +} + +export async function read_battery_joltage_list( + path: string, +): Promise { + const txt_input = await Deno.readTextFile(path); + const bank_list = txt_input.split("\n"); + const battery_joltage_list: BatteryBank[] = []; + for (const bank of bank_list) { + const row = bank.split("").map((ch) => parseInt(ch)); + battery_joltage_list.push(row); + } + return battery_joltage_list; +}