From 9dd5b41fe5d5522e88e54cdd01a5290bd6b8791d Mon Sep 17 00:00:00 2001 From: ktkk Date: Fri, 5 Dec 2025 08:52:11 +0000 Subject: [PATCH 1/3] Finish day05, part 1 --- src/days/day05.zig | 56 +- src/days/input/day05.txt | 1188 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 1242 insertions(+), 2 deletions(-) create mode 100755 src/days/input/day05.txt diff --git a/src/days/day05.zig b/src/days/day05.zig index 6d13a19..38f67ca 100644 --- a/src/days/day05.zig +++ b/src/days/day05.zig @@ -1,7 +1,59 @@ const std = @import("std"); -pub const title = "Day 05"; +pub const title = "Day 05: Cafeteria"; -pub fn run(_: std.mem.Allocator) !void { +pub fn run(allocator: std.mem.Allocator) !void { + const input = @embedFile("./input/day05.txt"); + //const input = + // \\3-5 + // \\10-14 + // \\16-20 + // \\12-18 + // \\ + // \\1 + // \\5 + // \\8 + // \\11 + // \\17 + // \\32 + // ; + + var lines = std.mem.tokenizeScalar(u8, input, '\n'); + + var ranges: std.ArrayList(Range) = .empty; + defer ranges.deinit(allocator); + + var accumulator: u32 = 0; + + outer: while (lines.next()) |line| { + var components = std.mem.tokenizeScalar(u8, line, '-'); + + const id_or_start_s = components.next() orelse continue; + const id_or_start = try std.fmt.parseUnsigned(u64, id_or_start_s, 10); + if (components.next()) |end_s| { + const end = try std.fmt.parseUnsigned(u64, end_s, 10); + try ranges.append(allocator, Range{ .start = id_or_start, .end = end }); + } else { + for (ranges.items) |range| { + if (id_or_start >= range.start and id_or_start <= range.end) { + accumulator += 1; + continue :outer; + } + } + } + } + + var buffer: [64]u8 = undefined; + var stdout_writer = std.fs.File.stdout().writer(&buffer); + const stdout = &stdout_writer.interface; + + try stdout.print("{d}\n", .{accumulator}); + + try stdout.flush(); } +const Range = struct { + start: u64, + end: u64, +}; + diff --git a/src/days/input/day05.txt b/src/days/input/day05.txt new file mode 100755 index 0000000..48c87c8 --- /dev/null +++ b/src/days/input/day05.txt @@ -0,0 +1,1188 @@ +383043617664892-389277822354893 +556611862043494-556611862043494 +274508378584282-275365868284529 +499760463992136-500194281740969 +335363684770098-335865042614837 +132634720972609-136359669646443 +48637321661303-49371405551775 +289676686766408-291111389458336 +303943030927953-306704491346224 +72469746402576-76411616096779 +213470662105150-216949824299804 +335143404585459-335363684770098 +399578330671204-399578330671204 +423815311181584-428736473854541 +445144803510287-450475034927663 +181924570350095-184942479621370 +271485824712069-272119732643846 +501293388994070-501917298951352 +280293924304972-280612305538679 +387921155483286-389277822354893 +523745234763291-529904321559580 +280882031803261-281040835409978 +253878259586647-255690900362946 +545817992397444-548353522955832 +13375369814081-14631630125490 +286294582520365-287822466835910 +252834580446673-254468831772362 +98465114456427-98465114456427 +12228039136539-13915138025262 +459599246188469-462148474611652 +40929475752145-41095688873688 +514481677515919-522052283658544 +372552279671743-380532329507059 +495747898914700-496239217264986 +445144803510287-450475034927663 +184942479621371-189893282293187 +355269573572126-361043406800642 +145895483963007-149084032274616 +132634720972609-136359669646443 +544112078199215-552308422037522 +123227766104553-129698395365540 +10461677332942-11836961644150 +340813918332263-341330378333639 +496955159338130-497245764430717 +336586550150990-336927856117398 +493049882830967-493109447275127 +287266811148818-288839477739527 +141366196542261-149084032274616 +272119732643846-272873072109998 +123227766104552-123227766104552 +112155548629760-115175234354525 +154468571812780-157529021590561 +40286573357265-40612307095761 +174618792440671-178815788893592 +247012607726392-247012607726392 +333356177754177-334065914876083 +455812227142315-458858748613589 +500417164095003-500763948107028 +42025428942785-42890376054888 +195345714499020-199584652326426 +34688333353698-35776359268938 +454681195201478-456960731309951 +365668317364738-370286692654646 +105069306787694-108838524679857 +18490308647192-19792160432495 +288529850303731-290273164429205 +40612307095761-41095688873688 +25565099187043-29593475700997 +258270070737568-259976986694005 +152648049560431-160352491362300 +204499947598129-204499947598129 +15440816839098-16721537628504 +1019895446399-8952882629921 +100779055297600-106796329437785 +41798741282488-42431061412672 +45429402841777-46147217415775 +498988795479729-499760463992136 +41095688873688-41798741282488 +476379351093569-480681365967756 +499528801044439-499760463992136 +45857577701417-46419023345771 +500996180483181-501293388994070 +256112214113470-257552216946051 +256996138128766-258718850514442 +525504990368081-530832048239839 +251393759499180-253135954124129 +314987921162437-320770154895676 +46550511185707-46845312955244 +92648961269062-98465114456427 +336430834819661-336927856117398 +436180553043627-441149444928459 +14170872634809-15763585636263 +337595325524462-338418995740198 +277835171988579-278576567581044 +276340584126128-276792795764007 +47864487617371-48637321661303 +235423151196542-240635379644761 +353911544954254-357378018069085 +293584088427629-300588172046519 +42025428942785-42539490320186 +281937323605666-283325879589132 +336927856117398-337354657663634 +332535120812828-332798466139408 +17325855539446-18811761671607 +11380415084781-12638788113428 +514481677515919-518384363807109 +337354657663634-337595325524462 +224260715369477-230169923667864 +22429887649575-25565099187041 +323705300495934-330964442033146 +272401237011618-272544321720670 +16274186474347-17939623008977 +465895735029872-468040320773378 +163256170073002-166621456395929 +323705300495934-330964442033146 +556611862043495-558773203848172 +64714055416425-69750583835498 +428736473854541-428736473854541 +334065914876083-334794429504338 +43953366578003-44513186640037 +273641379974974-273880022581695 +432696068994247-436180553043625 +494141003474494-494897438148545 +416403647885603-416403647885603 +278320885907866-278576567581044 +262312202320885-270266153429172 +3940822333862-8952882629921 +282672234384061-284445697043745 +81519604420762-88600354168439 +537979017541811-542190259401722 +342298759485142-349451681914728 +63072188556395-64714055416424 +402697630909427-411049459359407 +112155548629760-118031766787327 +285088649852784-286972160799936 +255096828989528-256662668629458 +362687300218095-365668317364737 +222465698465659-227098493518245 +279530156609905-280001731687777 +166621456395929-166621456395929 +485413048688003-491214744746921 +42890376054888-43421574776374 +56594066471249-56594066471249 +234079676806101-235423151196540 +42539490320186-42890376054888 +340366973534946-340813918332263 +280293924304972-280882031803261 +81519604420762-81519604420762 +534717613920203-542190259401722 +283829480200976-285815448901089 +506904022448461-508562101507076 +279282828355147-280001731687777 +332292582384400-333143987450814 +332535120812828-332798466139408 +174618792440670-174618792440670 +40929475752145-41095688873688 +259559888115770-260881509715864 +262312202320885-265651364676823 +204499947598129-207313970477954 +334453574986361-334794429504338 +334453574986361-334541997672872 +300588172046519-300588172046519 +342298759485142-346115775581584 +335143404585459-335865042614837 +306704491346226-309909930001793 +406275524050697-407777995021248 +274775967619349-275620794259767 +31901931864283-39948040427492 +465895735029872-465895735029872 +279866760146062-280612305538679 +54530198404363-56594066471248 +337354657663634-337595325524462 +274014473462125-274214648049888 +491214744746922-491214744746922 +474286663819299-476379351093568 +314987921162437-314987921162437 +452590291892970-455278406303253 +195345714499020-199584652326426 +41095688873688-41260943148414 +242287702355653-247012607726391 +392746171980879-399578330671203 +416403647885604-421384883221824 +500763948107028-501293388994070 +457664240413211-460179825583265 +336927856117398-337052971449932 +41095688873688-41552347128769 +337052971449932-337595325524462 + +383734537997532 +24657100611251 +520821331708771 +422039118247329 +484567139199568 +441837316387594 +516084780011049 +337572184313171 +79896717668504 +362407282827572 +262927749590281 +4600582446822 +20479725914605 +316673660085040 +150911045899499 +105793083518587 +505457825403767 +217326108682953 +401593355409508 +264110710812876 +539715328959720 +333894704810317 +167868431550961 +108073355996413 +358832271884875 +370083676710851 +144146356182316 +299326469939326 +451179040861621 +562797562440798 +261888227211711 +34513576935481 +431564042996054 +133540410840332 +400693129667043 +330871509870981 +162083894698322 +404340460811400 +452678699614448 +44700902544515 +207781513834135 +481637750058541 +303919698188041 +152233105325664 +170420375408707 +429632520313032 +118750054397205 +538233986166518 +336000607910588 +75573801239961 +474576990172830 +351313903771616 +293020346333501 +143219419908303 +376005310484509 +231798843180746 +302344335375095 +208775675371698 +466777208332944 +426795976312923 +296718834292226 +274891957797774 +245541505205485 +124574740840114 +361897915742034 +258258189422470 +18518755533412 +439288108198777 +284808369169565 +486909087444453 +341009201677274 +440989352590216 +211866810456223 +202895009339858 +169111557452125 +268953986364215 +291760825337574 +412811458758996 +561674155302938 +361489161940968 +491930484280582 +490908185729184 +160630856900700 +275611709854587 +288095649742859 +50739662946772 +105987613744783 +62287529288807 +369938388636371 +45646987835972 +190859650029807 +211229665184710 +303046540525604 +273446909703395 +326684255534029 +49590529469985 +460124869940713 +234764478699624 +561703888939008 +174990639813621 +216770394120701 +417180547531719 +484090531517134 +17076994812340 +402769222963846 +453538260592193 +142359890754765 +515364206588126 +560982922085901 +300522120781165 +528957423538037 +454581174017042 +374900421823171 +31168969639674 +451147905950855 +268084802186325 +305114863055113 +485515042275767 +10910610793510 +499081781644004 +395981448975716 +109146631518919 +69730176794261 +233439253893388 +533224204968275 +236523931235780 +440636340652100 +252171713333832 +419115214083894 +507036827784215 +43859397542964 +485469985921657 +300838530466639 +49678850355547 +492247440059312 +100775170893220 +305665431111379 +504599235314439 +29904524664304 +140973229320853 +94985117228765 +279046108541856 +422967626258093 +552172739506257 +417965246274069 +150812839762533 +404832824769276 +466104029662412 +57345161775161 +351941133588977 +321565455623375 +395949930346911 +446393722854681 +7975991655863 +235723304244290 +247242665022831 +48645496838839 +145958074189001 +51773806655410 +185863607273965 +118073941723132 +472126223130767 +538482922082609 +414028521316913 +36561594874136 +125746308801882 +70656847747334 +208538321437698 +71508136073660 +111684835650665 +180202240714917 +311978725556818 +401774364740939 +439177136261884 +85895262657238 +372435609328626 +532037261189189 +237092878620486 +33367883012982 +372391282950489 +756881735061 +461358646313547 +209151559112862 +221008624539412 +218570350866484 +203616187490813 +220101617958751 +489638312935106 +160654703432315 +5854169434300 +256373059491556 +149779800708356 +305847736305171 +242719831934602 +281472139269433 +180761425704804 +245567781747940 +533588701880960 +469304280541533 +52775759770152 +100347495365450 +526809860689965 +61410911007268 +310575549784728 +261516727282046 +132919305682310 +426248032350329 +178708754096908 +257024331140852 +242730967921712 +209185013310695 +530626687065411 +134105785538394 +296912138391915 +54884572034186 +363009281458079 +332478562331567 +43657735048134 +203249513302089 +217441456693662 +459747063383020 +400315700618415 +523144362531180 +277113720814972 +429301080050785 +114944478632886 +71765468746300 +558911367497670 +311102268927216 +157585515664228 +525670959905079 +12876676395945 +78532698527297 +6890871801054 +389116082327803 +302795211996640 +391303651142369 +272167393507092 +28592939139894 +510517105827321 +443296025896267 +532915474850160 +48433403532554 +353418812156563 +270140025788584 +532342878468542 +175930234877911 +63311672283067 +493586312047988 +510348321206031 +561310815293831 +511338659277641 +519912297102725 +52640298434779 +9202810587977 +482459982574791 +307122267366047 +131399240568796 +371444389542303 +44557809151292 +189282582645830 +561925474566360 +93620148923308 +409293332894137 +281628916803087 +162356541314864 +408611763283059 +326674607941136 +208634425419952 +112457648234441 +181368736427719 +505174325709854 +288137984317283 +525606968967212 +423551198367481 +36508119174343 +534233952270838 +20399547783320 +3297432777847 +161312366694779 +185431490286781 +153229877135848 +165858723697699 +158474810802293 +131869372054199 +268477009854332 +512579122390126 +477833862050494 +385737280063328 +238947924759691 +475368025489733 +487642874257156 +203458488324149 +521670209131705 +440793700602902 +236668308230329 +232109378086736 +461862457745289 +208974337806602 +302289612700100 +338881854856196 +222021329578885 +10240717111667 +249143780996779 +157107249719061 +533805289630629 +159957778281665 +429735242729736 +237816271124899 +383002616870859 +196960959029578 +348467158582950 +17229279576147 +226462964828072 +22910380143471 +135128664495602 +137258794174461 +372806203141904 +130498448106115 +523251162667005 +414311115144101 +318940745024731 +350097035094706 +463113024936945 +495291668922784 +330277122801271 +15478915611116 +249966051660397 +82785301692374 +414472212684736 +208249416629990 +59852303180748 +464818528137469 +555151251694886 +191731834963778 +253328065000900 +483225907591102 +504681509649351 +562045517632703 +274253994073954 +457416422443499 +297792309519256 +414570335751578 +491698855066333 +60918609674374 +233705628558806 +523378995342461 +449530420720802 +13398645100281 +217229607410791 +171301662363913 +348662842115526 +108337898366667 +277205099752611 +389098432191121 +128496645259620 +78547193483297 +507112615066297 +249472536573991 +537907959904270 +269731233036313 +278718662280667 +191166324691180 +273530625984318 +465628869933565 +201514473228051 +392887253451130 +82140148676463 +302117129403038 +53324020096506 +106208169380326 +465362292659627 +138376065037778 +241027690517745 +495490383992008 +91989313267425 +294333978114262 +482024840171541 +130796307737844 +133128838604984 +190763474971858 +143687990113080 +384494860336835 +432423440682176 +369800833936049 +161102254809593 +525106176225629 +385817053100598 +483353457674941 +397708720341617 +35588237587852 +443530690868356 +512553267766359 +84967716892581 +53811408041265 +515197061211344 +457804838290011 +534145602239649 +12954366749606 +213042154900701 +386646465867888 +68678508592455 +40595763557074 +459445627638382 +171953267941787 +13573157681032 +216265495483670 +191855854078552 +242565822186713 +454900271712532 +514501771001737 +124263566629649 +325098080915251 +271381437930703 +61907447188448 +278956692416095 +288258439124791 +475010668895353 +130334918593177 +505396887036634 +259441585373166 +411728291284175 +414330783923467 +136591267717513 +4363735265819 +109926107371469 +193514038157194 +412194925236342 +464561938809822 +474126188820101 +482575165825476 +135675415792402 +271161253947875 +438465544295717 +208946614506278 +132272529219438 +496525413813122 +109951821442400 +275164093836665 +368163614542744 +372220604306166 +539595722822843 +462705003642909 +501910034558484 +463905321229755 +35598383419608 +542260820147151 +250566795415156 +136408233829504 +88791016708630 +354361783276148 +57759090986357 +75717937300770 +372106175434854 +526367846899692 +300129626883014 +128084114675804 +412059224056521 +261321909299960 +179970383641907 +259990175878295 +552867925502496 +277444105749628 +475391902417422 +230044783568501 +30993099419568 +99683530712875 +325676783638864 +16589376608468 +463921942723503 +69421413215435 +559579714393237 +201186270764524 +272186807580565 +371044892968291 +249087086276855 +481923031602237 +26184811514958 +387602091166738 +552316125250657 +223943820987998 +245957473892998 +12295410595808 +339733261136634 +193276078613620 +309537494282344 +281929814229443 +392338008368639 +107390293854810 +120939221012354 +293029447599086 +537263224723185 +539324871160531 +434916388800758 +59572046578001 +179462844898693 +314877946120898 +92787658827638 +271747962601634 +520746912836569 +161558456761971 +412544392002995 +531836147848682 +243931747802472 +560323474368430 +184149907315037 +309782350201355 +120454266057457 +447307756487380 +141124443808246 +390934821939383 +20580204656160 +349437181998577 +71738197424095 +199492837059212 +418528391769880 +221904173517072 +459409003268039 +498811677759164 +389644325590195 +118054324142331 +50528298886481 +191958107721177 +301577306525236 +249227377977036 +184359642672167 +186152225734272 +112040079989106 +499776381648876 +473179744919177 +393459101735827 +157808301271390 +429927633925826 +453613779829382 +293348426922042 +439866288956759 +273370358600333 +186920548046308 +432033189901880 +506413848616898 +317784626063236 +526618901342266 +135412423371113 +532537851964474 +36987981154212 +76452975676684 +96893808352288 +22244803551777 +137633257563167 +160879099161099 +59160972646794 +480767411650953 +562848042395412 +61302335238112 +255870741721764 +290026397011868 +146423032813820 +100325037036431 +227621750081757 +35734852616962 +312492450517560 +547903134396409 +219714755595174 +254839173333357 +301897569437758 +161447565127690 +440251068624890 +160623538857338 +105795867619782 +559892668608177 +200127304618866 +481720687687539 +522422841779791 +462579742168310 +265523709125131 +360678822392342 +463352603764199 +233974362270135 +118166279666695 +44337456957807 +317085218702766 +523176317553155 +54520202049877 +213326426151125 +119557381951422 +91228858358972 +297762445086994 +396768499373452 +469958377460417 +62659296935569 +256529425472928 +113339335560057 +31399598289513 +532674975068261 +297818544652992 +272077145703249 +6497320296523 +366694973251823 +42677865360179 +86648046237297 +219907344506125 +264561515875943 +13394643979581 +410088715490376 +76433701344394 +152627063363901 +54189943348824 +426680955146715 +311683977938146 +484077078449953 +532822113582146 +482226966323441 +134289274451946 +238084567735009 +168378205511939 +546988213200293 +317690739194660 +390232291180994 +70482154786300 +369235308496517 +422516333714404 +2621201638162 +251246623379081 +74890367130401 +95539214294248 +253096015259097 +191895305999766 +285634908190855 +63276745899038 +388519316513914 +436689462262220 +83457821851473 +250702560149052 +402064941012349 +442891623656253 +366468839301996 +507978707961371 +413322288166380 +492367919945193 +138417896117325 +491574909843497 +277751141304913 +367978734068653 +517314085289339 +367330958322569 +351445211014867 +341830910856857 +539249879438846 +550030593228547 +113924623461852 +431686025860060 +355279595404149 +128071444642460 +530447081409276 +308710435965538 +484325074632182 +208896539719074 +122552121207950 +111747235419403 +282894944322968 +190077056402302 +463718323822083 +20879142159543 +501339186446726 +531899951014863 +59108509343155 +69505874570740 +279524744020252 +227868665748051 +264394926474625 +511647591660410 +323734687847543 +470225653767710 +280629220394710 +199203565913093 +172040146239398 +381261206085783 +369033595653620 +321547930913981 +432148645864399 +258347369368849 +128307831207205 +335204655460159 +320776760983462 +435262191518392 +50117083947769 +348554249461246 +104584946000702 +430575585986062 +59805462965410 +56999344465747 +267971130179650 +147083289642347 +156365567559281 +279157080398757 +250334313376384 +296076488581155 +276766033332896 +471251773309807 +369488365796381 +154903029934252 +288081276672405 +87865299346236 +364011094403504 +443400652162355 +500803911618581 +553260002233814 +362490170217471 +171790654951250 +230426059762031 +32473872963833 +54893581804654 +19592083188154 +561923067850166 +548906364202938 +432648485221617 +351357932231128 +333576392514433 +38933084153992 +191361981608459 +264145741889470 +33331196088135 +317262640800457 +59064872694944 +91039561884410 +86607114570325 +430962575232195 +278773136946353 +1985715131817 +121603137519040 +501792610563761 +54991631092420 +42495263913784 +53937429712083 +385996000231987 +557165020406485 +191772505444910 +107053026386033 +279646834503601 +17071157700860 +271831510545318 +163884205551172 +390649467937299 +26784457865443 +287768813773503 +411835363126246 +267835124635030 +551946076202310 +519484256316889 +367243186009789 +561147326535967 +56322492123443 +139614814049708 +256261487239911 +371275985470634 +356002876885556 +302815212434914 +408455934492507 +81873428540582 +436221719591682 +261706007659699 +395101607296215 +553395919218463 +368823712388433 +829047276522 +16443802796135 +79336876399927 +254583680824531 +320896183928257 +421796635318039 +240943968422652 +22324898952962 +186516291150614 +488174643102656 +482828943743969 +77064695066889 +80160387765654 +287022746386142 +561201053416356 +449734486788392 +262719995448380 +166920258546943 +405027515525024 +56684998364909 +512949172523142 +344543191240433 +315712077963465 +196529476013401 +257142085219691 +196268138108158 +552394114151627 +110978928749076 +54253661104419 +31443883048287 +214777125590375 +247830830273370 +560229105443710 +194052178935919 +534496793397155 +441725971445675 +498559808306180 +115396193120128 +192431921780352 +417018255748704 +355873340639124 +41590408585817 +495828255434463 +504833880036136 +186593540058833 +180410139255387 +366266136631953 +497270993910988 +155505624587107 +47107820459016 +34737209629695 +149987196611845 +456633764133030 +268733708690560 +558850635910498 +468332468934423 +510856908679418 +508736979767687 +346285396908839 +81184645470829 +31862019292602 +291568260872827 +223513142891329 +522613356093973 +437751783716785 +500972564704981 +218072472639480 +509706034873631 +69432118315834 +524182513995908 +514955920309888 +315762011338109 +481860897808585 +249914672370595 +393230552590629 +296491303392855 +405021696604877 +137178155167395 +218830693864481 +105651405169043 +317615067814014 +195467694422957 +447043272731955 +14921859722090 +295079033207804 +553954987547185 +321300253883909 +202047927001049 +364364587173789 +218280007534517 +50314230621509 +294038734682573 +313285507510859 +89475727727064 +547498166304792 +24146003835851 +341153210929728 +423076557404664 +311453407081231 +431036480808054 +136154650143397 +517821582949693 +196281199140555 +4455329473787 +85208303824421 +56564514529526 +496316487595221 +368640989254047 +198603534457478 +199418611346352 +422673698519629 +41078687395798 +305277450197615 +9392347953892 +411733573612194 +262911543970868 +516969563788755 +493029667163807 +59051132367351 +164477692813217 +227491857628611 +282975643542793 +116980635710207 +126382793221991 +45868046329400 +385932845649921 +502012643749540 +224966686240239 +478616574233217 +280202469400026 +233206667693426 +390082328867163 +158428503073131 +17084819058591 +233996388928420 +537517745160335 +418345689234253 +104239093836273 +71391573232757 +250577248409054 +336580021632192 +310318027588308 +125322623956859 +316241162668207 +284145331721800 +415702838363634 +122291677077994 +434202704642703 +308498186532424 +439753963270297 +157569548444900 +46404085961211 +489373521725863 +516077043442016 +150391303391468 +543345789273580 +104012927571321 +486909503459814 +369378728018550 +85731366867814 +505173293229711 +60733937432520 +450700659501492 +79827212120086 +76734684540290 +170674400895621 +192080000379306 +525993439494392 +526490509973181 +108969927586047 +350434132036937 +141559474118023 +269605773520280 +420221427478506 +136957128763620 +199483475643759 +299133262112166 +184883295883563 +105978978800188 +86119664134344 +548385093950703 +462420898461304 +426331446201711 +254559700585278 +2714813322222 +33764201131688 +246761815068661 +319717838451080 +276422158198540 +512826862109631 +519297857695538 +258691800180206 +514770376323392 +523404514619476 +260924347871383 +352900604306351 +179071167414548 +243371275416535 +67591554178339 +444233163503558 +153878101992389 +179286968391054 +535206217758692 +306442245493660 +65802725591966 +110664715283095 +193766389020854 +505025175297283 +150926272852711 +359274381343623 +521005974709000 +60580874133215 +540566571848039 +4051881833815 +69901248571427 +224681262459631 +478030466608308 +143250522754930 +517773545429866 +168101033688227 +172965958996633 +40336765032595 +367393816959467 +30855831842113 +425035888023254 +516904988674473 +220555393981581 +78616004155457 +119958157147178 +457444308012876 +335714151744465 +347099481023086 +275147610663180 +120650756056003 +52771011437859 +498301203715821 From e82fb0a304af771e2f9dce554f9fdd44f188073c Mon Sep 17 00:00:00 2001 From: ktkk Date: Fri, 5 Dec 2025 16:33:15 +0000 Subject: [PATCH 2/3] WIP: implement part 2 --- src/days/day05.zig | 142 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 113 insertions(+), 29 deletions(-) diff --git a/src/days/day05.zig b/src/days/day05.zig index 38f67ca..9a3ebf6 100644 --- a/src/days/day05.zig +++ b/src/days/day05.zig @@ -3,44 +3,42 @@ const std = @import("std"); pub const title = "Day 05: Cafeteria"; pub fn run(allocator: std.mem.Allocator) !void { - const input = @embedFile("./input/day05.txt"); - //const input = - // \\3-5 - // \\10-14 - // \\16-20 - // \\12-18 - // \\ - // \\1 - // \\5 - // \\8 - // \\11 - // \\17 - // \\32 - // ; + //const input = @embedFile("./input/day05.txt"); + const input = + \\3-5 + \\10-14 + \\16-20 + \\12-18 + \\ + \\1 + \\5 + \\8 + \\11 + \\17 + \\32 + ; var lines = std.mem.tokenizeScalar(u8, input, '\n'); var ranges: std.ArrayList(Range) = .empty; defer ranges.deinit(allocator); - var accumulator: u32 = 0; + var accumulator: u64 = 0; - outer: while (lines.next()) |line| { + while (lines.next()) |line| { var components = std.mem.tokenizeScalar(u8, line, '-'); - const id_or_start_s = components.next() orelse continue; - const id_or_start = try std.fmt.parseUnsigned(u64, id_or_start_s, 10); - if (components.next()) |end_s| { - const end = try std.fmt.parseUnsigned(u64, end_s, 10); - try ranges.append(allocator, Range{ .start = id_or_start, .end = end }); - } else { - for (ranges.items) |range| { - if (id_or_start >= range.start and id_or_start <= range.end) { - accumulator += 1; - continue :outer; - } - } - } + const start_s = components.next() orelse continue; + const end_s = components.next() orelse break; + const range = Range{ + .start = try std.fmt.parseUnsigned(u64, start_s, 10), + .end = try std.fmt.parseUnsigned(u64, end_s, 10), + }; + + const non_overlapping = try processRange(range, ranges.items, &accumulator, allocator); + accumulator += (non_overlapping.end + 1) - non_overlapping.start; + + try ranges.append(allocator, range); } var buffer: [64]u8 = undefined; @@ -52,8 +50,94 @@ pub fn run(allocator: std.mem.Allocator) !void { try stdout.flush(); } +fn processRange( + range: Range, + ranges: []Range, + accumulator: *u64, + allocator: std.mem.Allocator, +) !Range { + std.debug.print("considering {f}\n", .{range}); + + var overlapped = false; + for (ranges) |other| { + const overlaps = try range.overlaps(allocator, &other); + if (overlaps) |outside| { + defer allocator.free(outside); + + std.debug.assert(outside.len <= 2); + + overlapped = true; + + std.debug.print("- overlaps with {f}\n", .{other}); + + if (outside.len == 0) { + std.debug.print("- overlap is exactly equal\n", .{}); + return range; + } + + var previous_non_overlapping: ?Range = null; + for (outside, 0..) |r, i| { + std.debug.print("\t+ ({d}) {f} falls outside\n", .{i, r}); + + const non_overlapping = try processRange(r, ranges, accumulator, allocator); + if ((i + 1) == outside.len) { + return non_overlapping; + } + if (previous_non_overlapping) |p| { + std.debug.print("+ comparing ({f}) to ({f})\n", .{non_overlapping, p}); + if (!non_overlapping.eql(&p)) { + return non_overlapping; + } + } + previous_non_overlapping = non_overlapping; + } + } + } + + if (!overlapped) { + std.debug.print("- no overlap with other range\n", .{}); + return range; + } + + unreachable; +} + const Range = struct { start: u64, end: u64, + + const Self = @This(); + + pub fn format(self: Range, w: *std.io.Writer) std.io.Writer.Error!void { + try w.print("{d} to {d}", .{self.start, self.end}); + } + + pub fn eql(self: *const Self, other: *const Self) bool { + return self.start == other.start and self.end == other.end; + } + + pub fn overlaps(self: *const Self, allocator: std.mem.Allocator, other: *const Self) !?[]Self { + if (self.start <= other.end and self.end >= other.start) { + var l: std.ArrayList(Self) = try .initCapacity(allocator, 2); + defer l.deinit(allocator); + + if (self.start < other.start) { + try l.append(allocator, Range{ .start = self.start, .end = other.start - 1 }); + } + if (self.end > other.end) { + try l.append(allocator, Range{ .start = other.end + 1, .end = self.end }); + } + if (other.start < self.start) { + try l.append(allocator, Range{ .start = other.start, .end = self.start - 1 }); + } + if (other.end > self.end) { + try l.append(allocator, Range{ .start = self.end + 1, .end = other.end }); + } + + return try l.toOwnedSlice(allocator); + } else { + return null; + } + } }; From 3da92e4f2b6f0b8ca8d2895b48b8cb5dd32c6602 Mon Sep 17 00:00:00 2001 From: ktkk Date: Fri, 5 Dec 2025 20:09:09 +0000 Subject: [PATCH 3/3] Finish day05, part 2 --- src/days/day05.zig | 175 +++++++++++++++++++++++++++------------------ 1 file changed, 107 insertions(+), 68 deletions(-) diff --git a/src/days/day05.zig b/src/days/day05.zig index 9a3ebf6..27b185e 100644 --- a/src/days/day05.zig +++ b/src/days/day05.zig @@ -3,20 +3,24 @@ const std = @import("std"); pub const title = "Day 05: Cafeteria"; pub fn run(allocator: std.mem.Allocator) !void { - //const input = @embedFile("./input/day05.txt"); - const input = - \\3-5 - \\10-14 - \\16-20 - \\12-18 - \\ - \\1 - \\5 - \\8 - \\11 - \\17 - \\32 - ; + const input = @embedFile("./input/day05.txt"); + //const input = + // \\3-5 + // \\10-14 + // \\16-20 + // \\12-18 + // \\ + // \\1 + // \\5 + // \\8 + // \\11 + // \\17 + // \\32 + // ; + //const input = + // \\383043617664892-389277822354893 + // \\387921155483286-389277822354893 + // ; var lines = std.mem.tokenizeScalar(u8, input, '\n'); @@ -25,6 +29,7 @@ pub fn run(allocator: std.mem.Allocator) !void { var accumulator: u64 = 0; + var i: usize = 0; while (lines.next()) |line| { var components = std.mem.tokenizeScalar(u8, line, '-'); @@ -35,10 +40,13 @@ pub fn run(allocator: std.mem.Allocator) !void { .end = try std.fmt.parseUnsigned(u64, end_s, 10), }; - const non_overlapping = try processRange(range, ranges.items, &accumulator, allocator); - accumulator += (non_overlapping.end + 1) - non_overlapping.start; + std.debug.print("==> range {d}\n", .{i}); + + processRange(range, ranges.items, &accumulator, 0); try ranges.append(allocator, range); + + i += 1; } var buffer: [64]u8 = undefined; @@ -54,52 +62,64 @@ fn processRange( range: Range, ranges: []Range, accumulator: *u64, - allocator: std.mem.Allocator, -) !Range { + level: usize, +) void { + for (0..level) |_| std.debug.print("\t", .{}); + std.debug.print("recursion level = {d}\n", .{level}); + + for (0..level) |_| std.debug.print("\t", .{}); std.debug.print("considering {f}\n", .{range}); var overlapped = false; for (ranges) |other| { - const overlaps = try range.overlaps(allocator, &other); - if (overlaps) |outside| { - defer allocator.free(outside); - - std.debug.assert(outside.len <= 2); - + const difference = range.symmetricDifference(other); + if (difference.overlapping) { overlapped = true; + if (range.eql(other)) { + return; + } + + for (0..level) |_| std.debug.print("\t", .{}); std.debug.print("- overlaps with {f}\n", .{other}); - if (outside.len == 0) { - std.debug.print("- overlap is exactly equal\n", .{}); - return range; - } - - var previous_non_overlapping: ?Range = null; - for (outside, 0..) |r, i| { - std.debug.print("\t+ ({d}) {f} falls outside\n", .{i, r}); - - const non_overlapping = try processRange(r, ranges, accumulator, allocator); - if ((i + 1) == outside.len) { - return non_overlapping; + if (difference.left != null and difference.right != null) { + const left = difference.left.?; + const right = difference.right.?; + for (0..level) |_| std.debug.print("\t", .{}); + std.debug.print("- left = {f}, right = {f}\n", .{left, right}); + if (left.eql(right)) { + return; } - if (previous_non_overlapping) |p| { - std.debug.print("+ comparing ({f}) to ({f})\n", .{non_overlapping, p}); - if (!non_overlapping.eql(&p)) { - return non_overlapping; - } + + if (left.start == range.start) { + processRange(left, ranges, accumulator, level + 1); + } + if (right.end == range.end) { + processRange(right, ranges, accumulator, level + 1); + } + } else if (difference.left) |left| { + for (0..level) |_| std.debug.print("\t", .{}); + std.debug.print("- left = {f}\n", .{left}); + if (left.start == range.start) { + processRange(left, ranges, accumulator, level + 1); + } + } else if (difference.right) |right| { + for (0..level) |_| std.debug.print("\t", .{}); + std.debug.print("- right = {f}\n", .{right}); + if (right.end == range.end) { + processRange(right, ranges, accumulator, level + 1); } - previous_non_overlapping = non_overlapping; } + return; } } if (!overlapped) { - std.debug.print("- no overlap with other range\n", .{}); - return range; + const n = (range.end + 1) - range.start; + std.debug.print("- no overlap with other range, adding {d}\n", .{n}); + accumulator.* += n; } - - unreachable; } const Range = struct { @@ -108,36 +128,55 @@ const Range = struct { const Self = @This(); + pub const SymmetricDifference = struct { + left: ?Self = null, + right: ?Self = null, + overlapping: bool, + }; + pub fn format(self: Range, w: *std.io.Writer) std.io.Writer.Error!void { try w.print("{d} to {d}", .{self.start, self.end}); } - pub fn eql(self: *const Self, other: *const Self) bool { + pub fn eql(self: Self, other: Self) bool { return self.start == other.start and self.end == other.end; } - pub fn overlaps(self: *const Self, allocator: std.mem.Allocator, other: *const Self) !?[]Self { - if (self.start <= other.end and self.end >= other.start) { - var l: std.ArrayList(Self) = try .initCapacity(allocator, 2); - defer l.deinit(allocator); - - if (self.start < other.start) { - try l.append(allocator, Range{ .start = self.start, .end = other.start - 1 }); - } - if (self.end > other.end) { - try l.append(allocator, Range{ .start = other.end + 1, .end = self.end }); - } - if (other.start < self.start) { - try l.append(allocator, Range{ .start = other.start, .end = self.start - 1 }); - } - if (other.end > self.end) { - try l.append(allocator, Range{ .start = self.end + 1, .end = other.end }); - } - - return try l.toOwnedSlice(allocator); - } else { - return null; + pub fn symmetricDifference(self: Self, other: Self) SymmetricDifference { + const overlapping = self.start <= other.end and self.end >= other.start; + if (!overlapping) { + const left, const right = if (self.end < other.start) .{ self, other } else .{ other, self }; + return .{ + .left = left, + .right = right, + .overlapping = overlapping, + }; } + + var difference: SymmetricDifference = .{ .overlapping = overlapping }; + if (self.start < other.start) { + difference.left = .{ + .start = self.start, + .end = other.start - 1, + }; + } else if (other.start < self.start) { + difference.left = .{ + .start = other.start, + .end = self.start - 1, + }; + } + if (self.end > other.end) { + difference.right = .{ + .start = other.end + 1, + .end = self.end, + }; + } else if (other.end > self.end) { + difference.right = .{ + .start = self.end + 1, + .end = other.end, + }; + } + return difference; } };