From eadeb32376efcd58c758638c38307027a37f394f Mon Sep 17 00:00:00 2001 From: Alex van de Sandt Date: Tue, 9 Dec 2025 08:39:28 -0600 Subject: [PATCH] Solve day 8 part 1 --- Cargo.lock | 85 ++++ Cargo.toml | 1 + inputs/day_08-example.txt | 20 + inputs/day_08.txt | 1000 +++++++++++++++++++++++++++++++++++++ src/main.rs | 1 + src/solutions/day_08.rs | 76 +++ src/solutions/mod.rs | 2 + 7 files changed, 1185 insertions(+) create mode 100644 inputs/day_08-example.txt create mode 100644 inputs/day_08.txt create mode 100644 src/solutions/day_08.rs diff --git a/Cargo.lock b/Cargo.lock index ecfc882..71d0651 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -74,6 +74,7 @@ dependencies = [ "clap", "color-eyre", "itertools", + "petgraph", "rangemap", ] @@ -177,6 +178,12 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + [[package]] name = "eyre" version = "0.6.12" @@ -187,12 +194,39 @@ dependencies = [ "once_cell", ] +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + [[package]] name = "gimli" version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + [[package]] name = "heck" version = "0.5.0" @@ -205,6 +239,16 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" +[[package]] +name = "indexmap" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.2" @@ -274,6 +318,18 @@ version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c6901729fa79e91a0913333229e9ca5dc725089d1c363b2f4b4760709dc4a52" +[[package]] +name = "petgraph" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" +dependencies = [ + "fixedbitset", + "hashbrown 0.15.5", + "indexmap", + "serde", +] + [[package]] name = "pin-project-lite" version = "0.2.16" @@ -310,6 +366,35 @@ version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "sharded-slab" version = "0.1.7" diff --git a/Cargo.toml b/Cargo.toml index 7f5cdee..f6dd89b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,4 +7,5 @@ edition = "2024" clap = { version = "4.5.53", features = ["derive"] } color-eyre = "0.6.5" itertools = "0.14.0" +petgraph = "0.8.3" rangemap = "1.7.0" diff --git a/inputs/day_08-example.txt b/inputs/day_08-example.txt new file mode 100644 index 0000000..e98a3b6 --- /dev/null +++ b/inputs/day_08-example.txt @@ -0,0 +1,20 @@ +162,817,812 +57,618,57 +906,360,560 +592,479,940 +352,342,300 +466,668,158 +542,29,236 +431,825,988 +739,650,466 +52,470,668 +216,146,977 +819,987,18 +117,168,530 +805,96,715 +346,949,466 +970,615,88 +941,993,340 +862,61,35 +984,92,344 +425,690,689 diff --git a/inputs/day_08.txt b/inputs/day_08.txt new file mode 100644 index 0000000..743e5dd --- /dev/null +++ b/inputs/day_08.txt @@ -0,0 +1,1000 @@ +17501,13816,60954 +14182,69525,69278 +25642,15831,80833 +93712,12726,79083 +59859,38217,48809 +31274,76378,16751 +15562,28684,10678 +55360,65584,61543 +48679,93942,90156 +19571,24056,63254 +88943,5619,21677 +39936,42577,12873 +83246,10214,15667 +49629,51117,12884 +63819,91739,62754 +49821,97316,17253 +62183,39972,75358 +70546,29422,94333 +97579,68319,80952 +25275,98655,90266 +57839,95657,82162 +50277,70303,10120 +91884,65633,93192 +52632,73002,92396 +23588,57824,28101 +74038,95212,46620 +99903,21004,52675 +64438,85708,53554 +87948,88729,99539 +65514,30918,55044 +84196,8032,21862 +21458,44324,19670 +16112,11193,26043 +916,27095,55171 +31762,20158,83730 +89230,99073,56237 +99732,35529,28707 +5626,46482,31533 +52685,75187,16525 +31827,44290,23160 +22697,43101,86013 +19741,17747,8208 +364,56387,43075 +4474,76506,10986 +32757,89753,78890 +59635,53019,18615 +33270,39134,48280 +63762,52029,95944 +76057,44179,81173 +84631,35583,62772 +42526,93256,52823 +50488,68882,5361 +59425,60455,19560 +52711,59567,40587 +46841,53587,89040 +74034,8323,65735 +40373,27911,79663 +48172,19389,7640 +80399,22514,58063 +19356,41490,42451 +89549,89844,96392 +23405,80175,52997 +92567,96309,54324 +55617,92258,37003 +68466,62186,50632 +82118,25037,97991 +36483,83813,33067 +89470,51657,28561 +45949,68018,36463 +62881,45705,53507 +41078,33773,13873 +32871,39391,80190 +80356,80109,48847 +59838,80263,11481 +55426,82342,64220 +44552,79469,54328 +97455,94655,29104 +46697,77091,36458 +91651,31409,83703 +22374,98694,30108 +33020,50842,51281 +84987,85264,34775 +12616,32346,14542 +29332,16122,99423 +8054,35358,17027 +87445,6858,24087 +51003,69526,76211 +4984,89376,56473 +96968,33623,78185 +40880,50450,83518 +68947,58573,61113 +64522,39190,33973 +5131,92267,27320 +43671,62761,5922 +81591,21174,19799 +4868,29237,79834 +22957,64701,87093 +84306,88210,86867 +57431,1047,5019 +98475,25658,92355 +85942,14958,13820 +37025,76361,745 +54577,3821,66220 +55678,63805,25724 +71651,37999,81026 +16259,72899,30375 +60477,91284,83566 +12088,72021,56791 +69345,18289,71140 +55460,50085,22844 +26634,31620,82499 +52896,29864,38912 +90546,35710,21904 +30090,52464,47933 +56641,275,66647 +17057,6097,9347 +59759,49051,16277 +55532,9078,85889 +40789,69386,74690 +44612,38254,17984 +55705,44827,86715 +65060,36308,84872 +82608,99969,92970 +95484,87400,91572 +22023,52660,16218 +21524,78640,13854 +29297,23063,13200 +592,58970,78247 +51055,59755,47494 +80056,96901,20015 +69863,30964,97739 +21135,2005,50875 +69443,35046,69415 +93080,64496,48753 +71235,94568,23540 +21452,36620,8089 +35074,19705,96437 +8460,7570,34568 +76217,29273,1010 +79284,63779,52109 +42818,93068,25190 +36446,71452,49825 +29135,81310,72577 +6115,56171,50393 +43562,62462,74756 +60688,95595,50254 +39831,34754,65510 +63157,36722,91504 +5566,99414,48350 +7131,76138,67871 +57369,12501,18266 +86445,17707,16552 +98044,93421,97885 +5901,18404,27879 +37793,82713,94138 +70352,92807,68160 +99360,74902,6266 +33989,71631,52060 +40396,85583,749 +63066,64552,25791 +32005,70428,674 +88656,71069,20784 +32582,68637,20643 +52429,16371,45731 +95752,62445,72576 +46154,25639,4382 +81130,96657,34459 +35798,41634,57231 +11710,91019,53981 +20018,5771,15232 +37864,73708,52186 +85006,59476,73805 +42261,32674,5457 +65202,39737,39240 +18812,48714,14421 +16070,40359,6058 +14790,39041,28838 +25646,88028,61728 +30128,45931,49521 +24256,43077,34603 +36299,1306,69017 +95126,64856,32307 +11703,70830,75497 +36802,12545,48572 +38075,2428,5882 +35881,30698,7644 +74523,48179,79445 +98560,85971,36236 +66990,22816,23937 +62369,17716,53836 +72754,90153,40647 +37925,9093,43644 +36337,13080,46260 +64634,34674,82225 +22070,10344,45008 +51433,27632,88690 +43599,43818,17819 +87134,54365,77001 +96129,66561,63515 +2625,19099,30234 +45639,83311,55516 +45070,25106,60164 +71016,58044,91597 +3416,91961,73021 +79749,52790,57019 +5600,90292,31639 +58995,27351,11795 +50767,52018,22121 +18933,21248,84181 +70668,3700,39394 +67667,34964,1614 +36734,16840,47922 +24982,50369,39872 +10400,11701,37929 +26524,26099,50768 +61691,19232,51885 +97337,99839,17869 +30161,41252,12598 +51398,89894,26838 +26880,49055,30918 +29437,86415,76217 +33863,99659,3072 +28299,96045,71331 +98637,32051,76432 +58214,30826,15646 +24185,10088,90169 +24819,62949,65917 +50095,75770,43862 +93574,66396,10051 +65021,87706,96943 +11603,73911,63498 +41560,40671,25973 +20684,56010,58262 +10149,3409,44934 +53224,78146,74565 +84874,32164,24239 +92808,20356,902 +67255,94323,39985 +11083,35010,65046 +3915,93019,57384 +50688,13607,67549 +39925,7816,95930 +67462,31717,98112 +99146,90169,74950 +76806,52848,5144 +48721,14352,38251 +5288,4808,15408 +12247,93685,61257 +90982,67240,54862 +32362,86373,29897 +61269,56968,39991 +72711,95509,55859 +24966,51665,31015 +32306,17981,86574 +58388,95813,17306 +64993,91276,69674 +46607,99289,49910 +59486,92575,74827 +37863,47435,25516 +46776,79237,10274 +93143,27054,20477 +75901,92371,31210 +70095,61713,52857 +58882,17562,18914 +83471,68856,51646 +21412,70428,90045 +71262,30288,88017 +19113,25999,68889 +12257,81335,37337 +7108,69262,38113 +78381,63122,16970 +77668,43656,37761 +46582,17498,30091 +40561,2622,21759 +5285,1611,93914 +14390,34042,82402 +96687,71424,14196 +59302,12094,52161 +78064,1146,18890 +78661,7280,57995 +75247,73187,92060 +20736,47351,91843 +17609,64157,34766 +54631,51713,2057 +89712,23753,30787 +28074,88231,56167 +33635,96113,62552 +87612,747,78872 +85292,54608,4705 +90906,54856,40893 +27517,46565,47607 +34549,21764,54840 +14232,92399,63204 +8565,25807,46444 +76944,69446,48195 +21971,91888,62053 +2837,13917,48614 +87255,77099,34116 +24104,30791,80095 +70663,8236,46863 +10129,16997,57241 +25129,50467,33957 +89408,26527,41261 +6399,79482,87435 +70634,76544,46948 +20097,78253,60665 +36757,71608,93991 +41641,21042,74639 +24388,37066,39739 +24981,15037,56775 +74385,37791,30121 +22646,61049,63712 +6272,41362,88627 +24730,19762,13323 +61593,58571,99477 +70209,90560,29547 +76892,53886,89357 +77107,74614,50549 +28179,73913,41514 +48466,14013,60248 +71688,93716,32083 +7099,31746,26180 +96315,46688,33571 +14276,78629,45723 +53396,99881,42558 +96755,21080,69169 +17859,69064,1842 +87263,61238,8998 +15539,57369,41387 +66322,92393,73066 +21601,67302,38595 +36562,43311,65901 +77675,78717,11885 +4179,74251,77541 +70640,63626,23540 +71468,8864,16665 +73853,69281,68812 +6723,18669,88930 +99643,25336,61223 +8062,2606,83466 +87224,76893,41746 +24042,32164,52558 +73049,14601,58795 +38395,8102,28218 +60233,3480,56924 +41940,25355,70253 +39876,93028,79002 +71092,67006,62000 +81092,19595,21947 +39086,9927,26917 +68415,58094,97671 +27414,3347,93111 +44507,96886,89283 +42992,34877,38760 +8157,23684,69610 +42442,32380,36078 +24570,49917,21094 +28075,45591,93296 +28446,63879,94496 +31743,86424,5182 +8320,41047,71670 +90898,17739,15336 +28864,31711,68236 +76309,43104,58876 +83442,51293,90776 +43994,22243,53740 +58715,36934,84957 +57028,81223,16220 +77559,99078,75440 +62480,12652,47987 +49346,17359,10563 +30266,50715,83332 +20360,8059,27066 +23687,48212,50713 +78872,95191,6834 +92080,34227,61568 +64815,86975,21202 +5448,16523,69055 +3078,56042,32707 +85352,5563,44194 +17636,8556,58401 +64747,51829,52359 +84756,84592,83874 +10246,22539,24477 +45665,47490,22620 +21652,23056,95329 +63755,28004,48198 +94386,39027,58315 +59508,83616,84888 +65690,340,32961 +37924,32449,98231 +15706,69030,3104 +6351,84716,16755 +64107,11654,78971 +61423,94772,57739 +39329,77069,9801 +2095,84008,98380 +96827,15995,8475 +30535,31330,81116 +99336,19903,80579 +77599,56580,39524 +95554,14049,81912 +4658,47646,54743 +55140,99370,32830 +76399,81414,99898 +89848,46716,60242 +92000,87444,15737 +51561,23337,57133 +74968,8447,16210 +37099,89751,12391 +7029,55932,89620 +2334,25448,5012 +96352,88024,85079 +9806,37718,1706 +18497,24312,89449 +78120,49315,1842 +81668,84154,83640 +78518,17553,8042 +10085,83992,70092 +89609,92677,34202 +31392,42695,2939 +82371,92673,17464 +77609,2334,81478 +42076,76204,49530 +95647,2017,99829 +13349,66843,82748 +79299,14802,95192 +52225,39368,67635 +2169,68783,47153 +62043,2278,5123 +90000,27913,42074 +8149,42199,20451 +64378,8796,45000 +52920,38584,36085 +72127,88581,37040 +20395,97818,32809 +10565,25715,48986 +24339,21374,77461 +62195,75857,72433 +37937,93173,24374 +42358,76675,36967 +13358,3502,27593 +14483,85224,97202 +73196,2302,34980 +39007,40976,21633 +85468,73074,95825 +36093,40411,29256 +10940,21520,53286 +19090,58547,81986 +94757,44224,80154 +69982,87023,58792 +37318,83733,4982 +97552,60555,26920 +77717,46188,72529 +24573,92532,26100 +67522,50407,42013 +967,52162,74830 +23387,89023,51095 +36744,11485,6648 +28426,56132,70870 +43821,83285,76433 +40118,19195,21548 +76424,28914,15868 +50518,49638,85539 +12993,68377,76412 +63807,2654,43297 +28944,91563,86160 +80605,55087,91043 +44301,31387,92102 +49721,57747,87655 +9681,90534,47865 +62093,72910,45661 +15690,52669,33691 +28218,74511,21697 +94516,2642,16273 +66520,65555,35027 +85886,55652,36164 +18846,93352,44437 +70077,5205,98812 +51836,81743,57801 +8768,72525,64912 +15125,15893,52981 +86540,91945,64098 +77413,75211,31034 +83714,79340,77141 +18208,98380,21195 +10933,69592,80025 +10701,68725,61459 +16337,56028,13403 +98555,46596,98084 +43821,56764,27390 +7940,10380,16674 +65449,49742,87114 +54622,26953,97826 +52155,31614,22696 +63534,11959,24690 +18406,49107,75181 +62644,16451,58323 +46047,43001,56685 +76109,54245,30864 +43117,90716,66008 +35240,92544,95067 +59390,63891,39779 +30317,83706,14403 +10335,50426,29592 +34242,69556,6538 +90636,94987,81530 +3212,11609,71026 +11432,33182,61036 +87849,1251,85306 +89499,33105,56451 +63093,99203,79942 +35680,83759,47948 +8560,18096,24569 +92000,81401,84546 +82616,70859,10055 +36258,43619,93627 +78759,54718,56267 +75608,68632,91432 +61761,26506,67572 +48504,77941,22872 +89469,48555,17701 +29450,50311,93376 +79727,22148,22338 +18428,73081,22320 +76122,78610,76374 +73884,16742,58681 +27417,84937,67885 +18736,44144,50530 +77147,35997,85411 +67312,28982,33693 +28103,20918,7262 +36606,11019,58050 +47282,21265,36489 +65019,33942,43047 +26960,38353,17080 +98592,69199,9450 +31141,91748,95817 +40091,81059,6495 +18907,38003,22182 +88216,49419,8183 +53833,2834,77976 +96048,24697,84423 +16902,39887,26212 +19298,82083,12827 +16722,16469,38659 +36594,65070,19755 +22331,11425,44729 +59645,43337,57305 +17532,77724,61655 +62709,64788,82770 +8086,7253,157 +85527,98443,66479 +6577,73970,18477 +29951,3933,18330 +30546,10824,76630 +66035,93820,96475 +74074,2543,86230 +68939,71996,11100 +46036,1868,29988 +79975,5140,41618 +58375,41549,95824 +85307,75239,16607 +71948,43133,77863 +6930,78558,88064 +9956,78032,28154 +58457,90578,95075 +34126,51212,98805 +82390,13325,70518 +21715,29758,89931 +33711,66564,45951 +16133,67662,81012 +86848,14275,719 +90236,56610,47624 +93501,45146,86360 +38573,91811,31804 +46146,84430,94026 +45185,98642,21172 +29339,8896,83361 +68021,50165,81093 +49620,52941,68199 +32013,77159,87575 +57879,93121,22150 +85425,20094,46434 +61086,18692,32452 +55989,28432,96007 +7674,4502,29041 +37926,68794,25915 +71830,91349,16967 +59728,5613,83989 +85399,62834,25571 +90330,20109,18002 +63905,90480,15995 +70561,30476,20767 +34624,3147,48721 +72122,89997,46181 +54236,10370,70365 +94188,23626,6755 +60555,6608,60665 +51750,90723,69901 +36693,18699,97248 +65063,8976,73684 +80820,52553,91601 +35607,59466,63102 +40322,56440,72134 +77253,18298,60556 +6009,24866,11679 +87658,20372,25884 +89398,5584,67081 +71411,55339,36662 +55234,2189,94167 +78364,33386,78706 +18628,83410,94898 +60979,28292,9170 +4421,54836,24381 +64485,46508,1889 +47570,77444,93362 +49696,5391,8870 +57286,96433,45031 +27476,87600,48362 +70045,47044,1366 +66047,514,75184 +54621,72727,91849 +29216,32690,54392 +90709,74572,69703 +52790,51724,42451 +68811,79192,27121 +89047,43961,5802 +85337,91715,14616 +3215,3554,6322 +68062,24498,3490 +73604,35894,9849 +77057,94639,76890 +29230,47367,50922 +96671,55141,76617 +22826,83509,83062 +12505,31304,81352 +95207,32449,56952 +26951,3761,25361 +63720,32975,55614 +45415,2391,27680 +32090,84639,92957 +52258,17618,70848 +81601,47039,31947 +85854,54077,18633 +45088,73990,25216 +2513,4592,32074 +46366,14057,65482 +25288,6780,99381 +96609,96430,99452 +53195,48408,42946 +70029,1111,69227 +42636,33003,49400 +96139,57420,81603 +75802,75199,28662 +15831,74953,71837 +67950,91836,24071 +58752,15658,50273 +6142,43308,84763 +1586,14912,53902 +79317,43309,78993 +12808,2233,14026 +30449,6984,74102 +77186,19911,36667 +28078,96908,47873 +90306,32100,59216 +56880,12485,1584 +92997,67482,5629 +87734,12900,61638 +26158,69870,94221 +29377,98468,7193 +55381,38549,48231 +17290,67097,42594 +85429,28582,40067 +97658,35470,55194 +70859,63762,551 +51840,12147,98200 +71253,5987,13062 +70117,77179,39071 +69841,59771,34874 +51375,2381,10610 +38669,1474,71509 +31713,81870,29314 +75013,79641,38100 +65437,37205,40584 +92668,82699,56382 +98948,49341,31373 +92050,45002,92408 +58063,72362,35093 +57241,79387,35525 +4928,8090,84450 +66703,59712,87303 +58966,76573,60405 +88018,27889,89849 +19122,29579,74880 +40708,74922,28942 +51637,5663,25375 +81519,86108,10506 +32111,39952,76270 +72784,84862,9200 +75990,45031,15875 +37797,47635,6023 +80663,56366,48714 +71072,20041,222 +8474,10139,58380 +9650,27073,40957 +73085,61900,31757 +8993,46945,87739 +58992,46352,28013 +23545,1575,76689 +18263,59914,88457 +75226,72665,58923 +20889,14181,52501 +15053,10233,99993 +61514,46820,84553 +4731,29493,96100 +7185,88897,56431 +25394,80700,24713 +10948,86921,63995 +39801,90982,64879 +73922,82389,12993 +88582,61760,45816 +40459,81293,79635 +6664,94123,50327 +84159,15571,88160 +68557,60618,10206 +99678,26858,7864 +87423,27385,9351 +63872,6948,10761 +17993,7281,96575 +28107,36092,68845 +72615,42840,9396 +76964,76760,27523 +52543,36469,98794 +27285,73764,63710 +4084,74438,93862 +32568,5962,87685 +10740,4811,19597 +68879,98327,48893 +48971,92053,752 +88930,99299,90391 +87480,60375,69700 +21866,23124,91724 +75538,1144,3108 +38138,25861,49384 +41985,89565,52126 +43262,29265,84402 +52409,55826,94870 +21683,97036,23739 +35456,67625,92583 +54675,28379,53500 +41135,94825,13100 +14022,69274,6789 +12848,92105,59168 +92989,41614,55112 +54245,26965,33735 +18590,60128,95292 +12692,39999,32667 +85214,1227,31334 +68080,88519,61774 +95778,53506,254 +41585,39393,31698 +23395,4262,59834 +2471,7568,33833 +5734,61002,43922 +50663,13729,33576 +59911,33605,16378 +53155,40174,79654 +19962,47785,84198 +71802,80952,90 +12789,75500,34399 +40918,95545,76655 +56195,47536,26272 +72279,38267,32994 +20914,39900,66353 +72388,23620,38964 +79733,92332,53549 +15473,80006,46085 +28072,35202,66932 +99409,3092,24237 +61212,41599,86113 +21067,38615,70936 +69789,44667,83689 +49765,99230,68446 +77535,58048,31481 +59859,38276,74084 +46311,63331,93120 +81541,95685,22355 +43588,99740,26555 +21666,89223,91819 +15445,87850,56979 +57780,21030,86290 +82688,27267,95394 +52572,55287,42963 +19100,70248,43599 +58923,8012,65894 +17822,59533,19774 +12640,73915,51598 +99043,79729,97662 +63012,97378,17179 +39279,11596,38072 +16005,50759,2443 +32997,42762,15941 +13850,2650,87810 +89576,1316,29709 +23312,32455,44310 +56704,96520,13742 +69177,98067,91209 +32853,57973,336 +49393,67813,60725 +9221,18587,5299 +49174,30481,78395 +24321,83415,44302 +63316,74632,81455 +87991,84524,10091 +90607,73222,55446 +43229,21945,67613 +7933,81075,70451 +88411,6924,73733 +57733,22257,10949 +60380,87513,69849 +8503,75293,40964 +89890,81083,86320 +86243,81278,93038 +76101,69213,46518 +96759,52601,58004 +49134,25351,39392 +58241,41886,49780 +61055,6730,55516 +5971,85432,48944 +22185,84448,43747 +3653,97374,84347 +96678,86071,37216 +45268,62977,62828 +75216,77618,72476 +27026,58863,23142 +6965,41558,23725 +89363,54120,62730 +21951,24985,84996 +43122,41108,3707 +40220,25964,38831 +58670,19052,72396 +83402,78568,32526 +28411,34592,11011 +2333,75617,58264 +11596,12554,301 +16587,78843,4945 +9658,51675,58929 +30127,69348,11452 +31207,57993,99382 +94059,69715,18859 +58102,91801,48955 +1840,49149,41932 +38766,14624,81667 +73445,35496,96898 +97690,23965,59999 +42232,96187,75818 +30326,86068,44366 +76232,84046,52812 +82595,3240,85669 +66720,29179,70386 +44885,39795,49809 +22686,85746,77167 +18949,20667,22358 +34959,6913,84957 +98056,27618,37719 +40885,50162,87627 +8841,80688,10904 +62151,59915,84347 +38074,87877,93127 +67920,3652,93751 +28821,90387,66778 +52833,1596,26527 +18318,19823,71994 +18600,2157,89127 +49481,38241,63142 +15486,28184,55863 +58272,2546,96803 +53006,32097,72220 +65632,13727,54072 +48796,25605,48641 +23744,87986,62113 +39344,87236,71807 +36965,11627,57703 +77149,98843,18561 +64319,19270,11085 +24750,54389,13690 +97136,61789,65427 +91745,1936,73555 +57099,29451,81485 +84891,24113,97729 +38129,35650,84508 +58681,93802,35876 +93148,81110,45244 +29351,60089,99875 +86393,18332,66110 +46554,34521,32371 +53341,21655,59630 +24703,84736,69327 +91890,100,59900 +96757,72398,75894 +33577,96000,39765 +10007,17730,66800 +36938,8800,52124 +17932,6286,52051 +92090,37847,51193 +92266,96298,83347 +46909,27673,57870 +86711,7616,40746 +35259,40839,69022 +91850,26660,90690 +42223,66765,35109 +54376,84166,80556 +78158,73987,19460 +22845,63522,74552 +97785,70779,71063 +47479,98540,35580 +34364,50129,7752 +17835,84205,30099 +2110,82301,64423 +31946,92666,14806 +83376,23047,13095 +976,38593,82148 +26872,96518,89118 +20630,26694,8236 +40514,6141,44401 +79005,77123,63334 +65672,27726,48586 +27651,35244,19505 +8980,75622,88492 +84160,59494,59750 +64581,6428,74504 +45090,39921,45728 +52960,46207,53165 +23679,3707,94051 +2427,10129,62516 +5508,37459,6820 +70592,57457,89897 +66818,23236,20449 +76649,49955,29982 +24646,90990,63488 +92121,5956,93283 +58222,34369,48761 +50170,11582,52760 +33097,20326,17050 +44413,91214,52778 +53319,33875,90847 +65442,90916,63765 +86539,5200,66631 +73412,13543,30422 +46220,8065,2781 +2845,26134,52444 +11845,93992,49061 +86274,16436,45495 +74498,64846,39868 +92949,72573,73616 +86832,21354,76882 +99275,39823,10175 +79262,73439,39601 +64377,14200,15202 +26181,13786,81053 +44497,10961,67051 +70612,61592,57368 +93616,69804,98929 +91885,62980,17 +24649,92892,96784 +81923,28724,17945 +30076,21637,4935 +47837,87682,21755 +67994,73414,67972 +90868,93148,47230 +69359,39372,29770 +88852,16086,28767 +60852,50829,33503 +30911,21868,92506 +56628,70653,98830 +43047,89146,89616 +77684,16993,19224 +87558,73290,13535 +20961,76077,20224 +64697,2542,64548 +44343,36362,49861 +43600,12255,89234 +4792,62609,60745 +35573,95928,12120 +45730,67185,43935 +77269,37448,88390 +16676,33131,94343 +19128,55988,31830 +98060,86734,56178 +7312,68859,12663 +20869,41642,80949 +3423,58632,84432 +22560,5684,65796 +69420,12207,10595 +13457,31427,13290 +70330,69696,83474 +20467,57413,36703 +62702,21806,40603 +3089,16129,13494 diff --git a/src/main.rs b/src/main.rs index fd04ce1..201a64d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -54,6 +54,7 @@ fn main() -> Result<()> { 5 => solver!(Day05, raw_input), 6 => solver!(Day06, raw_input), 7 => solver!(Day07, raw_input), + 8 => solver!(Day08, raw_input), _ => bail!("invalid day: `{}`", args.day), }; println!("Parsed input int {input_build_time:#?}"); diff --git a/src/solutions/day_08.rs b/src/solutions/day_08.rs new file mode 100644 index 0000000..12a5c78 --- /dev/null +++ b/src/solutions/day_08.rs @@ -0,0 +1,76 @@ +use std::collections::HashMap; + +use itertools::Itertools; +use petgraph::prelude::*; + +use crate::solution::Solution; + +type Graph = UnGraph; + +#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)] +struct JBox(i64, i64, i64); + +impl JBox { + fn parse(line: &str) -> Self { + let (x, y, z) = line + .split(',') + .map(|n| n.parse().unwrap()) + .collect_tuple() + .unwrap(); + Self(x, y, z) + } + + fn distance_to(&self, other: &Self) -> f64 { + let sum = [self.0 - other.0, self.1 - other.1, self.2 - other.2] + .iter() + .map(|n| n * n) + .sum::(); + (sum as f64).sqrt() + } +} + +#[derive(Debug)] +pub struct Day08 { + boxes: Vec, +} + +impl Solution for Day08 { + fn with_input(input: String) -> Self { + let boxes = input.trim().lines().map(JBox::parse).collect_vec(); + Self { boxes } + } + + fn part1(&self) -> String { + let mut map = HashMap::with_capacity(self.boxes.len()); + let mut graph = Graph::with_capacity(self.boxes.len(), 1000); + + for jbox in &self.boxes { + let node = graph.add_node(*jbox); + map.insert(*jbox, node); + } + + let mut distances = Vec::with_capacity(499500); + distances.extend( + self.boxes + .iter() + .tuple_combinations() + .map(|(a, b)| (a.distance_to(b), a, b)), + ); + + distances.sort_by(|(dist_a, _, _), (dist_b, _, _)| dist_a.partial_cmp(dist_b).unwrap()); + + for (_, a, b) in &distances[..1000] { + let node_a = map.get(a).unwrap(); + let node_b = map.get(b).unwrap(); + + graph.add_edge(*node_a, *node_b, ()); + } + + petgraph::algo::kosaraju_scc(&graph) + .into_iter() + .map(|scc| scc.len()) + .k_largest(3) + .product::() + .to_string() + } +} diff --git a/src/solutions/mod.rs b/src/solutions/mod.rs index cb2fe8b..c8590d5 100644 --- a/src/solutions/mod.rs +++ b/src/solutions/mod.rs @@ -5,6 +5,7 @@ mod day_04; mod day_05; mod day_06; mod day_07; +mod day_08; pub use day_01::Day01; pub use day_02::Day02; @@ -13,3 +14,4 @@ pub use day_04::Day04; pub use day_05::Day05; pub use day_06::Day06; pub use day_07::Day07; +pub use day_08::Day08; -- 2.51.2