From 6cf9a4e55757e61c15bb4efd5e2dc4358ae27f4d Mon Sep 17 00:00:00 2001 From: Ben Kyd Date: Sun, 2 Nov 2025 16:42:01 +0000 Subject: [PATCH] 2024 Day 1 (and framework). Doing 2025 in zig --- 2024/1.txt | 1000 +++++++++++++++++++++++++++++++++++++++ 2024/2.txt | 4 + {2025 => 2024}/Makefile | 0 2024/README.md | 1 - 2024/aoc | Bin 0 -> 243840 bytes 2024/aoc.cpp | 107 +++++ 2024/aoc.hpp | 161 +++++++ 2024/day1.hpp | 65 +++ 2025/aoc | Bin 38800 -> 0 bytes 2025/aoc.cpp | 15 - 2025/aoc.hpp | 42 -- 2025/{day1.hpp => zig} | 0 12 files changed, 1337 insertions(+), 58 deletions(-) create mode 100644 2024/1.txt create mode 100644 2024/2.txt rename {2025 => 2024}/Makefile (100%) delete mode 100644 2024/README.md create mode 100755 2024/aoc create mode 100644 2024/aoc.cpp create mode 100644 2024/aoc.hpp create mode 100644 2024/day1.hpp delete mode 100755 2025/aoc delete mode 100644 2025/aoc.cpp delete mode 100644 2025/aoc.hpp rename 2025/{day1.hpp => zig} (100%) diff --git a/2024/1.txt b/2024/1.txt new file mode 100644 index 0000000..ec0133e --- /dev/null +++ b/2024/1.txt @@ -0,0 +1,1000 @@ +77442 88154 +71181 76363 +49755 69158 +38798 22488 +89857 49242 +96168 60034 +68503 43760 +52053 29173 +27070 63754 +78107 13305 +18422 95805 +34555 59209 +52260 83075 +35963 65961 +92308 56524 +25352 19586 +87921 76287 +21112 20450 +40251 20187 +66316 47227 +10872 77651 +78694 67481 +80223 15216 +69732 81168 +38939 38777 +34636 24551 +10066 49751 +21755 21498 +59907 37042 +40042 20430 +10479 30302 +92724 56653 +49261 18139 +14450 41684 +20138 54577 +49196 76287 +78226 77472 +55352 47752 +73181 76363 +88373 44539 +55224 13454 +78343 39913 +50215 26340 +93394 81365 +12421 17637 +30218 22488 +60899 27070 +53443 63193 +78769 76287 +34837 64955 +57703 90260 +84563 61551 +95968 61321 +18237 59051 +88136 22597 +75094 61551 +14017 58846 +18973 79651 +45202 81168 +67888 36454 +58743 65364 +65978 66336 +27877 47227 +23703 90563 +63594 76363 +19101 52928 +49192 16770 +78677 33277 +74303 76324 +56874 47227 +90161 64736 +39443 58067 +59419 76363 +16790 61551 +23505 93360 +70298 20187 +64391 61321 +62270 61551 +12823 57714 +83131 23208 +29372 81168 +21121 63648 +22012 74365 +42673 20187 +81026 63754 +96443 74839 +30527 16770 +88227 80574 +43550 81327 +83170 87067 +97480 59239 +57306 33168 +12562 19586 +70051 69573 +23409 59209 +98618 36335 +55824 77218 +26417 29173 +47973 28702 +88458 23040 +78792 26612 +49946 81708 +80977 82477 +64506 76324 +51584 19586 +74305 17617 +29886 13430 +66682 81168 +25165 48749 +58380 53467 +69518 61551 +13253 54169 +47096 90256 +30095 92342 +53753 74679 +18402 68884 +96146 54906 +78431 82348 +58498 30348 +48373 28719 +84718 49196 +60072 54268 +82045 81168 +11287 73806 +37090 34498 +38432 59686 +13148 69158 +29704 68950 +45645 76324 +68457 60034 +66349 78117 +72212 54196 +16845 53315 +49997 16770 +56793 64874 +27128 43619 +92355 71300 +76013 43778 +20620 81868 +23056 37042 +82567 61327 +13147 79444 +70591 58074 +68310 63193 +36484 52913 +97410 78373 +31951 44983 +65334 30896 +14656 59209 +91768 61551 +56457 27850 +57141 42263 +18561 31760 +75233 81868 +73250 95805 +14002 12467 +42157 47227 +34516 26033 +55035 81168 +13086 73119 +43301 41775 +38864 65779 +95169 31728 +73367 69158 +53500 63193 +81688 63754 +93934 95142 +54841 30896 +66614 76324 +52867 34526 +92062 65386 +74176 79531 +75046 76363 +64084 28284 +17516 91401 +58314 14259 +30184 48803 +82359 33277 +83956 16770 +87246 96540 +66231 34404 +42526 87428 +96228 96903 +70702 63193 +72108 20187 +62377 59209 +72553 10468 +57600 56860 +16563 57459 +35342 33277 +29419 27070 +22242 37042 +81264 45944 +27706 18763 +11777 17623 +96931 30714 +27765 80535 +65779 66518 +82921 19432 +87744 43619 +85543 40341 +56196 81132 +34774 97741 +93073 61787 +37699 62712 +45701 81380 +60801 76363 +66024 25646 +38321 50162 +32244 10468 +95866 29173 +91365 37520 +96047 11889 +60690 63193 +40819 47227 +19229 63551 +56978 27070 +84539 43393 +50724 59209 +90639 67420 +70374 28146 +83465 27150 +67309 61321 +56678 42545 +91876 78117 +11246 81868 +66054 83337 +40614 69158 +56899 37042 +65744 20551 +80749 37042 +74619 10468 +60988 76287 +84866 60034 +45318 49196 +14541 60910 +79263 35253 +48847 58067 +73082 24937 +79835 48742 +62446 39600 +62036 62719 +13498 71733 +18172 81168 +35258 59209 +60068 38731 +43622 33109 +23059 12770 +61060 43807 +45296 76363 +31310 72036 +69945 10468 +89043 62946 +44661 96601 +32843 10468 +83953 61321 +44774 43897 +47310 48153 +96064 35936 +79098 27177 +11333 76324 +31875 27736 +92000 60034 +60969 96903 +37597 73631 +97194 20187 +90624 70413 +15881 59845 +29211 22488 +19865 95805 +37093 27070 +85746 17347 +88886 46767 +94576 81868 +59784 19770 +98263 75790 +47612 62157 +27380 91120 +33552 16758 +72012 80611 +18549 85133 +23250 70963 +43410 85770 +55986 33277 +62202 20187 +86252 81868 +76363 81168 +39103 67989 +94626 14656 +11792 43619 +62872 29173 +66617 16770 +76923 37042 +54667 22488 +80651 76324 +24898 98262 +78913 43619 +86226 39913 +41730 29173 +62228 39913 +20570 14090 +48070 61321 +89609 73535 +21233 69158 +67520 27006 +69207 66474 +80773 76363 +98652 82728 +77753 65779 +61668 40001 +49504 65779 +90868 87612 +50836 27501 +34661 98114 +36590 31091 +29788 95805 +36309 46751 +45305 33147 +77866 89262 +26091 95805 +73725 75617 +89578 71004 +62919 78373 +18631 61551 +65733 91526 +63976 31808 +57363 54799 +63193 35481 +93512 11640 +22455 32469 +12710 33277 +80568 61321 +82907 31518 +70300 76363 +65593 58067 +66452 68846 +81168 19586 +81230 95805 +15461 78373 +99354 27070 +97780 16770 +11597 36795 +86142 60034 +22929 58067 +72577 16770 +87562 11734 +15882 17423 +18782 78117 +21443 53759 +97662 66320 +26467 10468 +12181 60034 +99202 76363 +92349 72225 +20986 25419 +85821 58067 +70172 92060 +54212 59209 +42712 76324 +90995 90226 +62165 20187 +70665 81168 +23358 63754 +82477 84396 +71987 23192 +95504 51191 +40799 41278 +35361 95805 +10730 51728 +43173 61551 +28181 33277 +23939 35592 +38685 60717 +36349 88861 +38913 47227 +36681 54470 +34231 80208 +84150 32348 +53592 31390 +90048 13692 +56334 66336 +92955 73054 +26500 20187 +11840 75286 +23430 42085 +79148 63193 +60469 19586 +15750 66336 +51639 16201 +66378 76287 +33011 19586 +74383 18079 +13342 71848 +43984 27950 +78415 45783 +37553 58067 +86775 68642 +34408 60406 +53067 58239 +83096 30991 +59779 47641 +92173 31090 +93789 84819 +34804 35005 +86853 98556 +19023 69269 +24014 78373 +88189 76324 +96897 80598 +71969 16770 +57758 60034 +84236 19912 +39543 74542 +45629 61518 +46405 23011 +88155 56357 +39913 69880 +58055 19586 +67449 33277 +97296 41994 +11979 74945 +97896 11294 +16406 47227 +33210 16770 +22366 19586 +14047 99638 +62524 35305 +85153 11167 +35374 52130 +76324 97224 +50715 66545 +30446 95805 +75098 54539 +60654 14555 +92593 10468 +37954 23752 +67845 49196 +18665 95058 +46953 20187 +22488 13898 +76756 95805 +52973 20187 +88681 61321 +67431 37042 +58093 59209 +61522 58067 +19692 22314 +55686 78373 +75663 88193 +75619 70326 +83139 34779 +96583 66996 +76437 13367 +19832 35599 +32727 43276 +64900 37042 +99403 70388 +20217 83512 +68879 39957 +55020 39913 +22732 61321 +70441 48560 +35671 30896 +87206 77391 +15719 65627 +70843 68981 +80802 77969 +60385 54937 +68163 27874 +51564 60034 +14231 59293 +10468 69158 +58531 33277 +89365 96591 +65598 49196 +30226 67781 +13423 29173 +43242 87650 +45581 39913 +55879 81168 +28959 84631 +67482 78373 +21358 13041 +40107 60034 +56957 66336 +68981 42504 +45865 67267 +83968 32642 +36082 29173 +51895 92287 +97489 19909 +13164 23658 +43619 32643 +80054 68277 +43543 10468 +21603 54219 +29392 81168 +79097 91391 +91813 76324 +27744 43619 +66902 41779 +84610 27070 +63644 23335 +63408 68981 +71224 33277 +48293 47227 +57365 48719 +13590 33277 +34822 59209 +90168 71625 +88698 88553 +59044 71011 +64826 60877 +46286 85678 +49565 52138 +89303 29173 +57427 76287 +84546 75928 +68856 99211 +44748 59209 +18252 70479 +32823 91526 +36238 56724 +34436 69158 +25905 83377 +11310 49196 +71865 29173 +31257 41046 +82139 76324 +66945 47714 +23390 33277 +95805 81168 +53931 19586 +46434 95805 +75144 41705 +88419 10648 +99702 63193 +38898 53110 +83475 59209 +57700 37042 +42255 16770 +68559 69158 +48622 30896 +48063 60034 +36896 58465 +61761 38881 +45534 23509 +84197 40976 +10741 60540 +57029 78300 +61058 76363 +16955 76324 +95154 29173 +20941 43072 +76420 10654 +57350 57933 +37339 33049 +11022 33630 +11086 39913 +64945 97536 +95125 27070 +70646 78373 +70553 20187 +52129 76287 +35583 76287 +52407 32158 +21537 45488 +49682 24598 +20290 47227 +66261 44764 +90484 31261 +25358 29173 +59209 88778 +21520 49196 +46692 41896 +83918 13692 +68641 78373 +93012 68295 +10186 63414 +84383 19586 +33576 99070 +42089 59209 +76287 61321 +63821 55986 +17944 38193 +57972 81168 +51596 61321 +22418 95805 +68055 76287 +19554 29173 +59117 14656 +17210 65375 +61968 34453 +22768 44020 +22419 92236 +33546 83847 +34755 58136 +17956 31634 +19543 59209 +85916 34705 +66761 93059 +30911 50479 +12158 32771 +91771 29981 +87708 60034 +70837 67717 +27584 78373 +67642 61551 +62273 19018 +16352 61551 +41901 29173 +25732 81298 +75816 29212 +25681 63754 +86396 12643 +44190 56820 +58070 19742 +44532 83582 +47227 35357 +36638 44159 +15632 76363 +72120 47309 +32764 47227 +51180 78117 +49739 14656 +66274 78739 +61723 43619 +59015 19586 +21891 85648 +18747 61551 +86144 58938 +39681 69158 +38150 68516 +61321 10468 +38754 30896 +70627 83718 +91724 74971 +91330 29173 +38159 73587 +78498 78373 +24641 61551 +12550 83211 +70711 83416 +17338 65779 +56076 39000 +21353 27070 +61551 85619 +42398 85167 +80835 63559 +69604 71196 +76284 81168 +73817 65125 +35170 23254 +52139 95805 +40826 81168 +85479 46622 +56430 33363 +67747 31755 +25739 13587 +17558 39762 +89499 93764 +78373 73981 +95268 46534 +33958 28798 +12195 66209 +63380 76287 +60034 27070 +80467 76324 +98506 95805 +58067 99459 +75075 60524 +43692 26965 +17039 37042 +97439 76324 +79297 29173 +68473 35985 +47630 17932 +61662 58771 +86027 39235 +62403 81835 +24100 54006 +87270 47227 +35793 39913 +91493 19398 +55623 19898 +82673 78117 +15863 91070 +57779 66587 +45405 49196 +93780 61551 +99320 65779 +40036 47227 +33370 83360 +82692 90756 +78117 19586 +68580 64705 +57478 69158 +15588 64663 +73700 39913 +81481 78593 +49442 28165 +61061 20187 +37624 78760 +90983 30919 +60057 61171 +80319 60632 +99544 63754 +14572 32678 +35131 83311 +90273 78373 +19621 19897 +88549 43398 +90170 60034 +35057 61321 +34283 61551 +24485 16250 +41063 95805 +47154 45332 +87986 16770 +36053 29173 +20687 60034 +66575 30896 +81371 95805 +91665 78117 +51369 51581 +19220 59209 +45158 39913 +61595 98095 +79096 75715 +72662 59209 +10875 44090 +99736 16480 +85897 65779 +83776 52163 +40755 19553 +80969 76363 +53053 76363 +58468 76324 +68895 30896 +10193 19586 +51578 42226 +59446 27070 +98969 73952 +15913 88063 +95191 69158 +27476 27070 +94851 58067 +47345 56070 +35791 59209 +56194 62759 +71120 31064 +42599 76860 +33848 20187 +68814 60034 +25584 51942 +85338 71636 +77668 99601 +82555 35041 +44609 16770 +73386 61321 +30553 29173 +35913 76363 +70145 95805 +99873 19236 +32644 24024 +15974 19406 +70045 47227 +37614 14925 +70738 66336 +96972 69158 +71948 76363 +18962 63193 +22983 27070 +50419 60034 +92422 18415 +29173 94253 +17365 35447 +76649 65307 +72431 40771 +46431 45281 +25817 42605 +83620 61152 +83434 76363 +25031 24195 +31968 42631 +31604 71439 +94886 72284 +88754 27196 +14709 25431 +40906 27070 +89846 44931 +29736 78373 +62109 76363 +41649 82052 +13672 35541 +58161 31191 +63752 55104 +22495 47227 +55699 81868 +69083 14656 +20079 36929 +34505 27070 +70644 33277 +18606 80975 +90720 65841 +33445 14656 +66398 76324 +22680 47227 +27166 43619 +94319 27070 +19586 62041 +51374 52608 +28183 59545 +49601 60267 +45765 51736 +57265 29173 +77954 77288 +81735 27070 +17145 10232 +62809 52565 +38935 53430 +26249 78373 +86870 42850 +49988 91893 +57756 60034 +69866 85817 +38276 95805 +65159 78373 +88269 78117 +18994 47227 +89894 88633 +19078 27070 +13692 58448 +34577 76324 +93672 39465 +66156 33277 +52761 75778 +71038 95805 +59876 23131 +95962 85623 +33277 13436 +22237 76435 +42882 27070 +42825 27070 +44396 19594 +89726 78373 +16770 65779 +44209 15242 +98471 40691 +63754 30896 +52305 55759 +21085 35037 +84268 33277 +23150 60228 +60140 62491 +96903 10468 +94329 75565 +26226 36931 +74515 63754 +68426 57490 +36722 76287 +91076 59209 +10149 82403 +49208 56685 +64396 93619 +35021 76363 +10780 30896 +86680 54460 +65532 35338 +35181 83328 +85405 10723 +91632 63754 +75023 72435 +37042 63193 +53779 19586 +37585 39913 +23603 90041 +88436 83914 +69158 68981 +70402 94227 +44083 65227 +82394 14656 +27746 16770 +19624 45804 +97957 71000 +30896 28091 +78374 26479 +66971 16770 +96748 49196 +47956 30896 +84663 80516 +89157 82477 +12228 65947 +42362 53557 +93195 51572 +75162 89269 +45009 61551 +39320 49305 +67273 41190 +65163 30289 +18734 74713 +73297 82175 +91431 13090 +14963 46180 +71185 16770 +42321 48403 +64599 67069 +53334 34468 +20187 57178 +83616 10468 +66914 20187 +81279 20187 +99419 37042 +79294 31121 +28220 76363 +80676 61551 +24797 25016 +35108 35246 +65643 66828 +36523 57465 +33040 46127 +81868 23412 +53306 90826 +47740 15732 +37843 22642 +98695 87173 +51321 38561 +95514 61551 +26419 35706 +20382 64457 +18337 76324 +24862 42585 +96800 57680 +88316 78955 +93747 40607 +89689 78373 +86418 13271 +37119 98421 +98276 61657 +37447 56593 +41319 41419 +43040 40781 +44573 69158 +93294 85174 +37495 99697 +33107 16770 +54548 62282 +54445 80876 +88038 88090 +66613 65779 +64729 18816 +81937 14656 +86560 49196 +90763 79218 +10930 80489 +52132 37042 +93840 96903 +14381 46862 +23038 59209 +12809 69134 +28706 53283 +35811 47227 +64368 16770 +14652 55002 +24290 95805 +35618 61879 +76669 65779 +65052 63193 +27533 84394 +37756 60034 +28054 78373 +56969 59374 +83129 27070 +81613 16770 +75625 78373 +17846 70557 +77897 20442 +93086 30896 +73969 96869 +87726 16313 +88858 78373 +65550 37042 +60065 61551 +91526 59209 +15647 20187 +40208 60034 +45614 81345 +56409 48982 +14733 73493 +50641 83354 +60500 30643 +66336 39913 +52887 80280 +72997 39913 +44985 61551 +79421 34868 +36332 36878 +69182 95805 +59092 67571 +29363 98020 diff --git a/2024/2.txt b/2024/2.txt new file mode 100644 index 0000000..6c3d2a7 --- /dev/null +++ b/2024/2.txt @@ -0,0 +1,4 @@ +this +is +the +inpu,that,has,commast diff --git a/2025/Makefile b/2024/Makefile similarity index 100% rename from 2025/Makefile rename to 2024/Makefile diff --git a/2024/README.md b/2024/README.md deleted file mode 100644 index b3b8f17..0000000 --- a/2024/README.md +++ /dev/null @@ -1 +0,0 @@ -... oops diff --git a/2024/aoc b/2024/aoc new file mode 100755 index 0000000000000000000000000000000000000000..3e1e75d741d54ae1a29bea74ca3ef6d8a6d6fa38 GIT binary patch literal 243840 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 Kc*tu{@A!Y-eETT? literal 0 HcmV?d00001 diff --git a/2024/aoc.cpp b/2024/aoc.cpp new file mode 100644 index 0000000..3c885e2 --- /dev/null +++ b/2024/aoc.cpp @@ -0,0 +1,107 @@ +#include + +#include "aoc.hpp" +#include "day1.hpp" + + +int main(int argc, char** argv) +{ + std::cout << "Advent of Code 2024 runner" << std::endl; + std::cout << "©Ben Kyd 2025, All Rights Reserved" << std::endl; + + // Very shit command-line parsing :tm: + int run_day = 0; + std::filesystem::path base = "./"; + + for (int i = 1; i < argc; ++i) + { + std::string arg = argv[i]; + + // Day flag + if (arg == "-d") + { + if (i + 1 >= argc) + { + std::cerr << "Error: -d requires a day number\n"; + return 1; + } + ++i; + run_day = std::atoi(argv[i]); + std::cout << "Selected day to run: " << run_day << "\n"; + } + + // Path flag + if (arg == "-p" || arg == "--path") + { + if (i + 1 >= argc) + { + std::cerr << "Error: " << arg << " requires a path\n"; + return 1; + } + ++i; + base /= argv[i]; + std::cout << "Selected base path: " << base.string() << "\n"; + } + + // Help flag + if (arg == "help" || arg == "--help" || arg == "-h") + { + std::cout << "\nUsage:\n" + << " -d [day] Run a specific day\n" + << " -p [path] Set a base path for input\n" + << " help Show this help message\n" + << " (no args) Run all days\n"; + return 0; + } + + // Unknown argument + if (arg != "-d" && arg != "-p" && arg != "--path" && + arg != "help" && arg != "--help" && arg != "-h") + { + std::cerr << "Unknown argument: " << arg << "\n" + << "Use 'help' for usage information.\n"; + return 1; + } + } + // + // Run days + if (run_day == 0) + { + for (auto& [num, day] : GetRegisteredDays()) + { + std::cout << "Running Day " << num << ":\n"; + + std::string filename = std::to_string(num) + ".txt"; + std::filesystem::path path = base / filename; + + std::cout << "Reading " << path << "..." << std::endl; + File file{path}; + + int partOne = day->PartOne(file); + int partTwo = day->PartTwo(file); + + std::cout << "Part 1: " << partOne << "\n"; + std::cout << "Part 2: " << partTwo << "\n"; + } + } else + { + for (auto& [num, day] : GetRegisteredDays(run_day)) + { + std::cout << "Running only Day " << num << ":\n"; + + std::string filename = std::to_string(num) + ".txt"; + std::filesystem::path path = base / filename; + + std::cout << "Reading " << path << "..." << std::endl; + File file{path}; + + int partOne = day->PartOne(file); + int partTwo = day->PartTwo(file); + + std::cout << "Part 1: " << partOne << "\n"; + std::cout << "Part 2: " << partTwo << "\n"; + } + } + +} + diff --git a/2024/aoc.hpp b/2024/aoc.hpp new file mode 100644 index 0000000..15bc13a --- /dev/null +++ b/2024/aoc.hpp @@ -0,0 +1,161 @@ +#pragma once + +#include +#include +#include +#include +#include + +struct FileFragment +{ + int Line, Col; + std::string Data; +}; + +class File +{ +public: + File() = default; + + explicit File(const std::filesystem::path& path) + { + Load(path); + } + + void Load(const std::filesystem::path& path) + { + if (!std::filesystem::exists(path)) + { + throw std::runtime_error("File " + path.string() + " does not exist"); + } + + std::ifstream file(path.string()); + if (!file.is_open()) + { + throw std::runtime_error("Failed to open file " + path.string()); + } + + _lines.clear(); + std::string line; + while (std::getline(file, line)) + { + _lines.push_back(line); + } + } + + /// Split each line by a multi-character delimiter + void SplitBy(const std::string& delim) + { + _tokens.clear(); + + for (size_t lineIndex = 0; lineIndex < _lines.size(); ++lineIndex) + { + const auto& line = _lines[lineIndex]; + std::vector lineTokens; + + size_t start = 0; + int colIndex = 0; + + while (true) { + size_t pos = line.find(delim, start); + if (pos == std::string::npos) + { + lineTokens.push_back({ + static_cast(lineIndex + 1), + colIndex, + line.substr(start) + }); + break; + } + + lineTokens.push_back({ + static_cast(lineIndex + 1), + colIndex, + line.substr(start, pos - start) + }); + + start = pos + delim.size(); + ++colIndex; + } + + _tokens.push_back(std::move(lineTokens)); + } + } + + + /// Access tokens for a given line (1-based) + const std::vector& TokensForLine(int line) const + { + if (line < 1 || line > static_cast(_tokens.size())) + { + static const std::vector empty; + return empty; + } + return _tokens[line - 1]; + } + + /// Iterate through all lines and their tokens + auto begin() const { return _tokens.begin(); } + auto end() const { return _tokens.end(); } + + /// Access raw lines (before splitting) + const std::vector& Lines() const { return _lines; } + +private: + std::vector _lines; + std::vector> _tokens; // [line][token] +}; + +class AOCDay +{ + public: + // The "driver" will expect the Name + // to have the same string as the input + // return 1 -> 1.txt + virtual int Day() = 0; + + virtual int PartOne(File&) = 0; + virtual int PartTwo(File&) = 0; +}; + +inline std::unordered_map& GetRegisteredDays(int day = 0) +{ + static std::unordered_map days; + + if (day != 0) + { + static std::unordered_map single; + single.clear(); + auto it = days.find(day); + if (it != days.end()) + single[day] = it->second; + else + std::cerr << "Warning: requested day " << day << " not found.\n"; + return single; + } + + return days; +} + +template +struct AOCDayRegistrar +{ + AOCDayRegistrar() + { + auto* instance = new T(); + int day = instance->Day(); + + auto& days = GetRegisteredDays(); + if (days.count(day)) + { + std::cerr << "Duplicate registration for day " << day << "\n"; + delete instance; + return; + } + + days[day] = instance; + } +}; + +#define ADD_AOC_DAY(DAYCLASS) \ + static AOCDayRegistrar DAYCLASS##_registrar_instance; diff --git a/2024/day1.hpp b/2024/day1.hpp new file mode 100644 index 0000000..8124339 --- /dev/null +++ b/2024/day1.hpp @@ -0,0 +1,65 @@ +#include "aoc.hpp" + +#include +#include + +class Day01 : public AOCDay +{ +public: + Day01() {} + ~Day01() {} + int Day() override {return 1;} + + std::vector col1; + std::vector col2; + + int PartOne(File& f) override + { + f.SplitBy(" "); + + for (const auto& lineTokens : f) + { + for (const auto& token : lineTokens) + { + if (token.Col == 0) + col1.push_back(std::atoi(token.Data.c_str())); + + if (token.Col == 1) + col2.push_back(std::atoi(token.Data.c_str())); + } + } + + std::sort(col1.begin(), col1.end()); + std::sort(col2.begin(), col2.end()); + + int res = 0; + for (int i = 0; i < col1.size(); i++) + { + res += std::abs(col1[i] - col2[i]); + } + + return res; + } + + int PartTwo(File&) override + { + // Num of times each number appears in col2 + std::unordered_map hits; + + for (int i = 0; i < col2.size(); i++) + { + hits[col2[i]] += 1; + } + + int res = 0; + for (int i = 0; i < col1.size(); i++) + { + res += (col1[i] * hits[col1[i]]); + } + + return res; + } +}; + +ADD_AOC_DAY(Day01); + diff --git a/2025/aoc b/2025/aoc deleted file mode 100755 index a63ab4d0514cba2da163909d6883316579b30b23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38800 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 diff --git a/2025/aoc.cpp b/2025/aoc.cpp deleted file mode 100644 index 5279120..0000000 --- a/2025/aoc.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include - -int main(int argc, char** argv) { - std::cout << "Advent of Code 2025 runner" << std::endl; - std::cout << "©Ben Kyd 2025, All Rights Reserved" << std::endl; - - std::cout << "\n\n Usage: -d [day] (omit for all)" << std::endl; - - // Parse command line - - // Find days - - // Run days -} - diff --git a/2025/aoc.hpp b/2025/aoc.hpp deleted file mode 100644 index 620e0c4..0000000 --- a/2025/aoc.hpp +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once - -#include -#include -#include - -struct FileFragment -{ - int Line,Col; - std::string Data; -}; - -class File -{ -public: - // loads full file into memory RAII style - // AS BLOB - File(std::filesystem::path path); - ~File(); - - void SplitBy(char delim) - { - - } - -private: - // Tokens are garunteed to be in-order - std::vector _tokens; - -}; - -class AOCDay -{ - public: - AOCDay(); - virtual ~AOCDay() = 0; - - virtual int PartOne(const File&) = 0; - virtual int PartTwo(const File&) = 0; -}; - - diff --git a/2025/day1.hpp b/2025/zig similarity index 100% rename from 2025/day1.hpp rename to 2025/zig