feat(day_3): done with poor performance

This commit is contained in:
2025-12-03 13:36:22 +01:00
parent db61479292
commit 8c57f72d0b
5 changed files with 316 additions and 0 deletions

View File

@@ -6,3 +6,4 @@
| :-: | :-------------- | :----: | :----: |
| 1 | Secret Entrance | ⭐ | ⭐ |
| 2 | Gift Shop | ⭐ | ⭐ |
| 3 | Lobby | ⭐ | |

View File

@@ -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);
});

View File

@@ -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

View File

@@ -0,0 +1,4 @@
987654321111111
811111111111119
234234234234278
818181911112111

89
src/exercises/day_3.ts Normal file
View File

@@ -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<BatteryBank[]> {
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;
}