From cc0f18f48f367f7a5b4b27ed0159a6e8b9e524ea Mon Sep 17 00:00:00 2001 From: Nick Thomas Date: Fri, 6 Dec 2019 20:11:27 +0000 Subject: [PATCH] Day 6.1 --- 06/build.zig | 14 + 06/input | 1062 +++++++++++++++++++++++++++++++++++++++++++++++ 06/src/main.zig | 102 +++++ 3 files changed, 1178 insertions(+) create mode 100644 06/build.zig create mode 100644 06/input create mode 100644 06/src/main.zig diff --git a/06/build.zig b/06/build.zig new file mode 100644 index 0000000..7300f55 --- /dev/null +++ b/06/build.zig @@ -0,0 +1,14 @@ +const Builder = @import("std").build.Builder; + +pub fn build(b: *Builder) void { + const mode = b.standardReleaseOptions(); + const exe = b.addExecutable("06", "src/main.zig"); + exe.setBuildMode(mode); + exe.install(); + + const run_cmd = exe.run(); + run_cmd.step.dependOn(b.getInstallStep()); + + const run_step = b.step("run", "Run the app"); + run_step.dependOn(&run_cmd.step); +} diff --git a/06/input b/06/input new file mode 100644 index 0000000..2364732 --- /dev/null +++ b/06/input @@ -0,0 +1,1062 @@ +XNR)9W1 +VGS)XCW +WS5)5XM +T9F)RTN +RQ8)67Q +1WV)YS3 +V69)VCK +65J)756 +ZLV)DZ2 +1GM)JCS +SW3)DFT +LF8)P6Z +VDS)W5H +RMK)5BK +48J)VGR +LQF)LGD +KRW)FVR +BDP)TRT +D7B)SHH +LB4)1SJ +4ZH)127 +YFJ)RQP +KS1)93V +L2J)MRG +VXQ)NR2 +HNL)9HZ +RRK)B98 +KM5)86H +DSW)DRS +XXB)KQT +YDQ)VQ3 +RX9)V7D +CFJ)RHM +4MD)SW3 +7G4)LZ8 +Z34)NTS +RW1)89Y +X5Q)1GM +NVY)TC7 +4TR)PV8 +T28)1QV +PMM)62K +NG1)KKT +B7N)RH4 +T1F)3QJ +19P)V2V +2SB)SY2 +PV8)J3H +TRP)RMK +RWW)9TY +3N7)9F8 +92D)C1N +GLC)TNW +LF8)W7C +TT3)YHN +RKK)NK6 +SL6)ZCH +K4V)NXP +SXT)VQT +VQV)QDJ +PQ4)K84 +KXN)GMT +JN9)SBR +84X)QPY +HQM)SS4 +H1T)W18 +ZRQ)LVY +NY1)BLY +DRS)71Q +F26)RQ8 +TH2)THY +T35)ZC1 +TBH)LQF +2NK)2XM +PY5)N5Q +M69)345 +99P)92S +C22)3YW +Q9T)N5N +KQJ)1CV +FCK)VDS +43S)SQY +FTZ)T1G +57L)GVB +RG5)QSW +7LJ)HWL +VF4)HXG +XZ6)MDZ +5HS)M6Q +YSY)BCZ +GJZ)1DH +SSB)WXT +T1G)K39 +8QC)8RX +H7M)8G3 +PB9)BS3 +518)1X8 +4V7)2S6 +4V3)MH3 +BLY)XXB +XJL)DD4 +WMM)3VV +XTW)77B +ZKJ)VXJ +FVR)CFJ +G54)SGB +YHN)5LW +5CK)V4J +LVY)339 +V6S)QX3 +GQ5)4MB +GXH)ZGD +YPX)S1G +5PH)1BX +THJ)2NK +9ND)K9D +89Z)52F +79P)S6R +DH9)XHZ +8RX)4MD +T1L)GL4 +7TT)5K2 +V81)6CP +22F)ZD2 +ZXC)QWZ +QLT)VH6 +4SG)HDF +N82)S9Y +MQM)6KF +KDX)BKX +471)1KX +4JL)Y5R +XQX)RLC +Y9L)X4G +V9J)89P +H5V)MZ2 +TNX)1JM +694)KWK +C5W)D6Q +SZL)XB3 +CY8)4ZL +NCW)NVY +J75)L2J +KQT)35G +Z6V)DD2 +NZ7)DN6 +P56)PW3 +1VY)41W +MFN)SQQ +2H1)LPH +NTW)DSW +KRK)LTQ +71R)LF8 +9ZM)PW7 +11J)WW6 +1Y9)V6K +T71)XZK +5PH)PVL +4ZL)TYX +ZMY)FBQ +KTY)D7B +MR3)SG4 +3P6)1ZN +XV9)P46 +RHG)J6S +JWF)22F +H1T)J6R +1JT)NB7 +T4V)Z34 +8NV)P3V +RLR)KZ7 +24G)KQJ +H7S)WRN +QC2)D8G +T7N)3KM +QVG)RX9 +Y94)XXN +MZ2)G54 +P46)MHZ +VKC)WMM +M8M)F5C +Q43)DLM +8S2)2B6 +8NG)QT4 +YRY)NMB +HCB)S93 +K3N)Z9G +2MM)KYH +H64)DQR +9TY)RZ7 +8SY)4SV +QWZ)W6P +Q39)4XQ +NKW)VL3 +HDF)B1K +NC3)QGY +645)VHG +CK3)M3J +MZS)7W1 +P5B)C85 +3VV)9LD +62K)ZQS +T7R)V5L +5YC)JTD +VD6)TQ9 +NB7)7Z8 +1SL)CWF +ZM9)Z31 +LMH)RWP +SQD)H64 +JXG)TH2 +5VN)J51 +F9T)4WH +LGD)2J5 +37P)47V +K2H)FD2 +82L)7Z1 +TYF)C22 +NTG)V3H +NB4)4DW +83C)53T +CNS)KM5 +FZT)XXJ +SD2)WPL +PC4)4WZ +CK3)P5Z +M82)TNR +F1V)PB9 +T1X)LX5 +8P1)V9H +1SL)K3N +V69)ZG2 +52F)YPX +1X8)NY1 +1CV)L2S +SG4)DZ4 +Y1X)PRC +RRJ)NTG +BDD)8M6 +V4J)2FB +LTM)84B +NMX)RDY +3CD)YMW +47V)YGN +JBH)DXW +36G)XQX +XF1)D8R +8M6)L2Q +YKC)5CK +92S)LBP +B3R)W31 +CLR)MMQ +WRN)QLT +2KG)FZQ +TL4)71R +7DQ)KDX +M3J)W6Q +S23)PC4 +2XM)Z78 +S1G)8YY +H7M)8P1 +SC9)SXT +1JM)XV9 +XN5)M69 +58B)ZM9 +9N6)YKC +4DW)ZLV +1D7)4YN +ZQ5)6RM +PRT)371 +PVX)WNN +VCK)CP4 +VH2)CZN +T1W)J32 +3V2)HCP +G2Y)TML +BN2)ZY3 +J75)PBS +LX5)DHB +9P9)KM3 +1CG)KG7 +NMT)72B +KZ7)YZC +82G)1Y9 +ZTM)8P3 +1TD)645 +1D3)LMH +W45)YXR +XB1)TFX +RTC)5N3 +W7C)2KG +GJB)92D +SMG)63B +TJV)P4Y +CB1)HN8 +PV8)V5P +PBS)7YW +GWK)9P9 +V3N)DX6 +TQ9)K4V +QT6)KXN +H58)1TD +YGN)ZTM +DY1)3N7 +HLB)SZL +LK7)TJV +NNW)LG3 +284)11J +RZD)84X +K1M)HG8 +RH4)MS8 +29Q)HNL +ML6)JQY +8NG)38H +Z31)HQM +M6P)B4S +FR2)B6Q +BCZ)MVV +9TY)BKD +Q3P)315 +76Q)XJL +V9N)ZNH +992)78T +P16)329 +CQB)H4N +984)SVB +V6K)SQD +LTQ)V8Q +7Z1)NSJ +C4R)ZZF +QSM)RC3 +LGC)GTH +SHH)4BH +PW3)HVJ +BG7)DCT +MB8)S23 +XJ9)C78 +P3V)GJB +CQ4)64Y +84B)8J3 +F97)DPQ +KYH)TYF +5KL)LVD +F5C)TRP +YK8)211 +Q8Z)NPK +TC7)65K +BR5)XFS +CP9)3B5 +RRK)Q8Z +W6Q)WW2 +5RH)Q43 +82P)ZKJ +211)96N +NXP)JY5 +CY3)C5W +WLB)1JD +X19)LDD +6PN)T7R +HXG)GP4 +PCW)82G +B5B)K4S +3QJ)694 +57J)7TT +KXS)GTP +GWM)NDV +BVX)3S8 +ZQS)RZD +77B)T9F +6GT)FFP +N37)TW1 +GNC)KRW +WC5)213 +GYV)FG9 +KKT)G9L +SSB)X2Y +SBR)2FC +LPQ)BB7 +84R)9MV +CVD)R26 +7YJ)SS3 +T1M)9TG +WBF)2T4 +Z8H)L93 +339)TNX +V5P)XTW +YYP)YTS +5N3)9MM +WR3)RFV +BR5)18Q +NC3)35Y +MS8)PHX +65K)9FR +HL5)MR3 +Z95)9X1 +QDH)SF4 +5WG)WLJ +TRT)1V3 +P29)Q3P +K64)CVX +5XB)KMV +V4J)YV5 +RR1)6FT +NDV)D1L +DD2)QT8 +CQB)XNH +DP1)YY8 +5CK)SC9 +LL4)RW9 +V5L)SMG +XJL)5XB +156)R6L +6QH)V69 +SS4)VR1 +VXJ)5KL +RXH)471 +T12)HZZ +YVF)6WP +JVF)S1B +FBQ)2RT +B1Z)GXH +C38)L96 +QX4)WG2 +TML)GDW +9FJ)RR1 +FD2)PVQ +KHL)28C +BM4)4J5 +QHT)SD2 +1PF)BDF +VJW)8GJ +ZY3)7RJ +7BN)13W +RW9)QV5 +QVG)1VY +BQZ)V9N +BB7)VWM +J51)NCL +KGL)W1F +RWP)VD6 +XXJ)6V2 +P6Q)WQT +P6N)Y8N +BKX)WJH +DRW)B7N +LX9)G7D +J3H)DRW +WXT)3V2 +JRV)K2H +PC3)DSV +PDR)KS1 +F7M)9N9 +LVD)6ZT +QX4)4YT +RJB)DSK +94Y)G3K +VW2)H5V +QT8)P5B +18Q)LGC +V9H)QT6 +GQL)CLR +NSN)CBT +LX9)S71 +KMV)NB4 +ZGD)51C +1SJ)6SN +KYH)WL3 +2N9)36G +KXV)WC5 +THQ)LX9 +77K)CQ4 +WW2)THJ +YZC)R9C +1V3)FZT +12H)NC3 +SK7)ZH7 +LJ7)JBH +BS8)ZQG +YHX)649 +Y5R)JH9 +RWY)2M8 +3YW)7W6 +X6L)6QH +K9D)V6S +K4S)33C +GMT)5CY +XWD)PQS +24H)WLB +CCL)Z12 +87W)5HS +2WV)YYP +1DH)8S2 +JCS)1NL +X4G)9T2 +JC7)XK9 +RFR)PCW +J6S)WR3 +RB2)GQL +SF4)TH3 +CVX)284 +JQY)R2P +ZCH)HF1 +6S4)NTW +WQT)RVP +FZQ)F1V +K92)DJC +H5V)8GF +DVP)CM5 +KM3)2KZ +YS3)LH7 +RVP)2WV +WLW)DVP +93V)M2R +QL1)CQB +N41)VRS +Z78)WLW +ZZG)JWF +NSJ)PDR +PVQ)C4R +CWF)MWD +DC5)4F8 +4WZ)56P +KMC)KZ6 +7QB)87W +HNR)TL4 +WLZ)CB1 +WJH)J2B +K6P)ZKM +L2L)H3G +2KZ)4M2 +B1K)KMC +984)XZ6 +D8G)5VN +4ZL)8Q8 +18J)V9J +7QT)6M5 +1JM)G2Y +P6Z)PDZ +WPL)24H +WY3)BGP +18Y)4V1 +C85)GYH +N5Q)HM2 +2LL)VGS +J3N)6RW +NTS)LL4 +4V1)L2L +FVY)KXS +1QQ)PC3 +2KZ)8NG +3KM)2DR +83B)T7N +SD2)V81 +SGB)93K +DZK)CVD +9WS)6S4 +7Z8)LBV +41Q)NSN +SCJ)ZRQ +Z29)QC2 +DX6)QLL +KST)CMK +MXR)5Z9 +Y9Z)8RY +45F)Y9Z +YY8)V3N +NCL)63Z +527)CP9 +WNN)RRK +DP1)MB8 +6V2)FC9 +9N9)7WG +6WP)V58 +WW2)C38 +DSK)3CD +N7R)KHX +2B6)QVG +BN1)8LC +4XQ)N5S +MMQ)H58 +41W)6PW +TX5)NMT +C4R)T1W +VHG)VJT +8ZM)WH1 +71Q)KTY +38H)NNW +J86)PBZ +8H2)4L4 +9MM)FKP +PVL)82L +LBP)3X1 +MTN)QL1 +67Q)FCK +P56)DZK +HG8)BG7 +GPN)YK4 +6N5)776 +Z25)NZY +GKK)37P +GVB)9YM +Y8N)Y94 +7MP)3T6 +3VV)PMM +5Z9)JN9 +RLK)7RB +G4T)HXR +BDM)B6P +NNT)NCW +9F8)6HN +33C)5YV +DG4)BN1 +3T6)VGM +RC3)KJ9 +7RB)1PF +3D7)PS1 +8RY)T35 +R2P)K92 +6HN)6PN +84M)MXR +MH3)YFJ +ZQ5)P56 +YXR)J3N +2QN)YDQ +QGY)NKW +DFT)C6Z +DD4)H8T +756)984 +15H)9WS +FVJ)P16 +127)48J +SQY)HLB +4J5)Y1X +V1X)Q9N +MMT)MZS +K84)RWY +THY)FH5 +776)VXM +276)YRY +DCT)2MM +2FB)PD8 +RFV)8X1 +2J5)T1M +76S)GQW +5K2)RNM +44V)GWM +XP8)ZXC +WC5)6GT +72B)7RL +5JV)FG8 +VQ3)GFT +QDJ)X19 +HC9)126 +D7B)PQ4 +Y4Z)ZMY +SVB)LKF +YQL)436 +VR1)18Y +35Y)VH2 +7W6)CNS +8GF)T92 +4MB)FR1 +JPK)9DF +6RW)H1T +LKF)G2K +4F8)8HT +DXW)BM4 +BS3)N82 +CP4)89K +339)Y9L +FG9)5WZ +JK9)3ZV +ZC1)8LW +8YY)CY3 +W18)WLZ +NZY)HD8 +35G)5RH +213)9C5 +DN6)G4T +FH5)WFN +H1B)Q4H +8J3)BDM +9FR)TDJ +GQW)M8M +SLN)VJX +1ZN)7XL +6ZT)HF9 +KJ9)2JV +7XL)X6L +LB4)Q39 +1RW)57L +DJS)YVF +4YN)SCJ +C1N)GKK +YK4)LK8 +7BK)83C +371)JK9 +6X3)PB5 +TVK)G5P +H51)FTZ +1GP)SNH +5LT)RBX +5XM)1TW +6SN)QHT +78X)5LT +4WH)N41 +DZ2)MJV +5YV)KXV +6YP)RZ4 +H4N)QX4 +S1B)V1X +HXR)97J +DLM)B3R +VRS)3P6 +Z19)FR2 +B6Q)2QN +5XM)XY5 +TJV)CCL +BXC)J1L +89P)Q6W +J3N)RLK +X4Z)F9T +ZNM)18J +15S)M41 +ZZF)XP8 +2N1)M6P +ZNH)W2N +3HQ)F26 +R9C)SSB +M6Q)WBF +P5Z)6N5 +WW6)YHX +KQJ)G15 +DJC)4NG +ZY8)9N6 +HVJ)Q9G +DVN)B1Z +PS1)JZV +6PW)CVW +LPH)Z19 +6KF)K1M +QT4)94Y +1GM)3CS +GFT)PCP +6PW)X9L +4NG)8H2 +KN5)VXY +WP9)84R +VJT)Y4Z +7RJ)99P +KZ7)BD5 +K39)ZNX +RZ4)VF4 +6CP)K64 +RQP)Z3F +JTD)T1X +XNH)Z6V +TH3)RKK +DXC)RW1 +1JD)T4V +1FX)15S +63Z)JPK +QKV)6JH +Z3P)SAN +G15)4V7 +6XM)P62 +TNW)N37 +QM4)G1T +YV5)3HQ +VQT)4SG +SS3)R12 +K1M)WP9 +S71)7LJ +7JY)2SB +JZV)7QV +BVX)D56 +RXH)LK7 +SF1)8JV +ZNX)YSY +SWP)QQ7 +89Y)78X +6FT)YBY +VJX)YK8 +M2R)TWF +V3H)2LL +4J5)DP1 +XFS)Z25 +Z3F)DVN +KTY)2XG +1VK)ZQ5 +4L4)KR3 +XY5)BDP +TNR)43S +1BX)DXZ +HF1)8SY +8P3)HL5 +LL4)KST +DSV)6XM +2FC)3RK +Y27)RLR +HF9)JRV +6RM)HZ9 +G2K)SWP +ZQG)XWD +1TW)46P +YTS)YOU +636)KP2 +MXR)MTN +T92)F9H +XB3)1GQ +8HT)T28 +9YM)Y27 +8Q8)JRY +R6L)TT3 +QPY)JVF +D6Q)X5Q +LDD)45F +636)RTC +X9L)B5B +B7B)7QB +CMK)276 +7YW)P6Q +WG2)8ZM +WFN)LYB +Z12)FWP +276)992 +5DK)15H +WL3)4FV +G3K)9WW +X2Y)LB4 +J4H)L8G +WH1)M82 +JH9)JXG +7QB)2H1 +3RK)1GP +L2S)7MP +JVC)ZNM +LZ8)DH9 +B6Z)SF1 +RHM)T1L +LYB)2N1 +D8R)7YJ +K8Q)24G +DXZ)156 +BDM)4TR +L96)PVX +RLC)BXC +BDF)58B +GTH)DXC +W6P)ZY8 +XCW)K6P +Q4H)VJW +56P)WY3 +2RT)VQV +1KX)Q9T +78T)FVY +X6C)G5Q +HWL)4M5 +W31)4V3 +BD5)GNC +LZ8)KCC +M41)3D7 +P6G)BN2 +DHB)DJS +G9L)964 +T1G)TBH +471)RS6 +VL3)LTM +V7D)1D7 +N5N)XN5 +MDZ)GJZ +86H)FWL +315)NG1 +6FT)Q8S +5PD)F97 +HD8)T1F +NPK)1JT +KZ6)CY8 +YMW)TVK +PBZ)DC5 +RS6)GLC +PCP)6YP +KM5)B7B +8LW)BR5 +9T2)Z3P +Q8S)5YC +VGR)W45 +YZC)9FJ +L93)83B +TYX)5PH +J32)K8Q +QC2)QM4 +RZD)BDD +G5Q)SK7 +THB)5WG +FR1)QSM +NDV)57J +DQR)1D3 +YBY)9YW +XMQ)BQZ +B4S)82P +3S8)LJ7 +XHZ)H51 +JRY)TX5 +7WG)77K +4DR)B6T +3ZV)J86 +9YW)VKC +1GQ)NZ7 +RS4)5DK +CM5)1CG +VXM)J12 +VZS)GPN +G7D)GYV +S9Y)RXH +R2Q)QKV +ZM9)9RZ +GJB)Z95 +G5P)X6C +D4W)47X +4YT)1FX +CVW)1WV +ZJZ)T71 +R26)12H +4M2)L21 +MRG)7G4 +HNJ)VW2 +3B5)RJB +H3G)XMQ +G1T)7BK +PW7)65J +ZD2)3RP +XXN)84W +FWP)KN5 +5BK)GCC +V2V)7FC +VGM)SL6 +NK6)7BN +SQQ)YQL +FKP)1VK +47V)6ZH +J1L)RB2 +J4F)5JV +LG3)527 +MS8)TN8 +JTH)THQ +DXW)QDH +TRP)461 +5LW)N7R +RTN)HNJ +97J)SLN +L8G)FVJ +F9H)5PD +HN8)518 +51C)1QQ +PHX)P6G +63B)2N9 +Q6W)THB +J6R)H7M +K6X)JTH +46P)83D +13W)VZS +RWP)W4D +Y9L)BNG +9WW)KYT +HZ9)89Z +J2B)636 +RNM)7QT +PCP)T6S +NXP)9ZM +V9S)RG5 +7W6)41Q +7MP)WS5 +CBT)GLM +6JH)VK2 +2S6)XF1 +SY2)V2S +7W1)19P +V8Q)BVX +TW1)KHL +28J)NJ2 +PB5)Q4T +3CS)KGL +VK2)79P +W4D)4PK +GCC)XJ9 +NCG)MQM +V58)H7S +1NL)BS8 +GTP)ZJZ +Q9G)ZZG +3YX)Z29 +PQS)6XK +8LC)84M +ZH7)PRT +KWK)HCB +18Q)Z8H +4BH)76Q +QV5)T12 +G4T)P6N +TWF)RFR +8JV)GTZ +LBV)RWW +C6Z)1SL +9C5)MFN +QSW)7DQ +PD8)D4W +RLR)KRK +PDZ)76S +Z9G)8NV +WLJ)VXQ +96N)GWK +345)4ZH +NR2)HNR +P4Y)CK3 +D1L)J4F +JY5)NNT +9TG)28J +HCP)44V +BNG)X4Z +8GJ)4JL +329)J75 +5WZ)L62 +Q8S)MMT +PRC)3YX +KCC)29Q +GLM)26P +KR3)R2Q +1QV)J4H +8G3)XB1 +S6R)DG4 +CZN)8G6 +5CY)GQ5 +V2S)1PV +4V1)LPQ +N5S)H1B +3RP)1RW +4PK)NCG +COM)V9S +3HQ)8QC +9RZ)NMX +BKD)RRJ +GP4)XTN +28C)JC7 +4M5)DY1 +L21)9ND +QM4)7JY +RKK)HC9 +9HZ)PY5 +2JV)ZYP +84W)6X3 +S93)RS4 +P62)K6X +53T)5VM +KP2)B6Z +R12)JVC +2XG)ML6 +26P)XNR +GWM)4DR +GDW)F7M +DQR)P29 +89K)RHG diff --git a/06/src/main.zig b/06/src/main.zig new file mode 100644 index 0000000..029737e --- /dev/null +++ b/06/src/main.zig @@ -0,0 +1,102 @@ +const std = @import("std"); + +const Link = struct { + a: [3]u8 = [3]u8{ 0, 0, 0 }, + b: [3]u8 = [3]u8{ 0, 0, 0 }, +}; + +const Node = struct { + name: [3]u8 = [3]u8{ 0, 0, 0 }, + depth: u32 = 0, + parent: ?*Node, +}; + +const Links = std.ArrayList(Link); +const Nodes = std.StringHashMap(*Node); + +fn parse(alloc: *std.mem.Allocator, stream: *std.fs.File.InStream.Stream) !Links { + var list: Links = Links.init(alloc); + var buf: [8]u8 = undefined; + var i: u32 = 0; + + while (try stream.readUntilDelimiterOrEof(&buf, '\n')) |line| { + std.debug.assert(line.len == 7 and line[3] == ')'); + std.debug.warn("{}\n", line); + + var out: Link = Link{}; + std.mem.copy(u8, &out.a, line[0..3]); + std.mem.copy(u8, &out.b, line[4..7]); + + try list.append(out); + } + + return list; +} + +fn getOrCreateNode(alloc: *std.mem.Allocator, nodes: var, name: [3]u8) !*Node { + if (nodes.get(name)) |kv| { + return kv.value; + } else { + var node: *Node = try alloc.create(Node); + node.parent = null; + node.depth = 0; + + std.mem.copy(u8, &node.name, name); + + var kv = try nodes.put(name, node); + return node; + } +} + +pub fn main() anyerror!void { + var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); + defer arena.deinit(); + + const alloc = &arena.allocator; + const file = std.io.getStdIn(); + const stream = &file.inStream().stream; + + var links = try parse(alloc, stream); + + std.debug.warn("Part 1: {} links\n", links.len); + + // name -> node + var nodes = Nodes.init(alloc); + + // The input isn't ordered, so we need to pass over it several times + + // Pass 1: create all nodes + for (links.toSlice()) |link| { + var a = try getOrCreateNode(alloc, &nodes, link.a); + var b = try getOrCreateNode(alloc, &nodes, link.b); + } + + // Pass 2: link all nodes to their parents + for (links.toSlice()) |link| { + var a = try getOrCreateNode(alloc, &nodes, link.a); + var b = try getOrCreateNode(alloc, &nodes, link.b); + + std.debug.warn("\t{} ) {}\n", a.name, b.name); + + std.debug.assert(b.parent == null); + b.parent = a; + } + + // Pass 3: The tree is fully constructed, so we can count parents + var count: u32 = 0; + var iter = nodes.iterator(); + while (iter.next()) |kv| { + var node = kv.value; + + // Count number of orbits + var n: *Node = node; + while (n.parent) |p| { + node.depth += 1; + n = p; + } + + count += node.depth; + } + + std.debug.warn("Part 1: {}\n", count); +}