From 83a3acbc059f0338b7d0d96e5bb9c1e88285e04a Mon Sep 17 00:00:00 2001 From: Adam Wick Date: Mon, 16 Dec 2019 17:34:05 -0800 Subject: [PATCH] Initial bits for day6. --- inputs/day6 | 1438 +++++++++++++++++++++++++++++++++++++++++++++++++ src/args.rs | 25 +- src/main.rs | 6 + src/orbits.rs | 138 +++++ 4 files changed, 1603 insertions(+), 4 deletions(-) create mode 100644 inputs/day6 create mode 100644 src/orbits.rs diff --git a/inputs/day6 b/inputs/day6 new file mode 100644 index 0000000..a173cdf --- /dev/null +++ b/inputs/day6 @@ -0,0 +1,1438 @@ +H1R)Z5F +R6L)JYJ +QVZ)B3R +ZD8)Y6T +FWC)F2N +3HH)HSX +2PQ)NXT +C7Q)7HM +6KQ)B1V +CVJ)SXY +ZZR)627 +HWF)5Q2 +7QR)BHQ +1FF)SBD +F9B)XXF +415)C8L +K38)LZ2 +Q3R)61L +Q8V)TDC +H5W)52V +PQY)BDX +C54)QSK +PHC)JPX +ZLS)CRN +PSR)T5C +FWK)Q48 +BNL)FWC +ZPV)CR3 +HM5)C5J +Y4F)X6L +FX1)1LX +D7W)P4X +5Y6)L55 +L2R)2WD +F26)TPF +YYH)F3Z +XQB)GPY +8W7)6PH +53X)K5N +MFG)KP7 +YTT)DJS +NDT)NN3 +S7X)8HH +5CR)BS6 +QH8)MKW +8FY)LG7 +SC1)CC6 +8DX)N55 +T71)M2G +SBD)T4B +9B1)K4M +KXB)YRK +H3S)DP9 +Y71)MW5 +43G)9NB +YFT)BFG +GSZ)H37 +QP8)VT7 +3CC)KJL +8VN)Y5S +CP6)GQB +BX3)DQ4 +P4X)XJT +ZMK)7WW +RVX)J55 +S9X)7MC +ZYY)T4P +X6L)126 +T1W)H6H +BS6)S7X +YNK)KKR +2BD)SM3 +PR8)MJ8 +L2H)2PQ +KM2)1WX +V8F)FX1 +92J)NWF +CF4)XMV +7G6)KXB +ZHP)K75 +9T5)Q7Y +X71)HV5 +KK5)1X2 +JCB)DWH +T8W)S9X +2S6)J6M +53K)H87 +F3J)JLL +5Y6)VY5 +CQD)2ZY +8W4)PX4 +4H2)KR4 +GWY)SNB +F8J)5T9 +S3G)54J +PQV)PKY +96C)L67 +CP6)R66 +H5P)6SZ +P9V)686 +CP8)S8Y +6CQ)QRM +PZK)DVV +DK5)QWQ +BPM)52D +V8R)YYS +CM7)2NF +H8P)F11 +TC5)KXG +7QK)6XG +D9F)NZ7 +1D5)86C +ZP5)C54 +C6T)Q7K +9KM)QPC +LBC)HFX +DK6)LZW +WXC)2FC +BX4)2XY +6H7)2HJ +DZ2)5RD +KYB)H6T +2QW)PVV +2MD)BNP +VMX)SLG +D6K)RXB +GHS)HGB +QCT)T29 +X1B)VT4 +BN9)M79 +SXK)CSF +SG7)YPY +ZPK)GHS +6X4)L59 +B89)LP3 +9TZ)HW9 +YPY)M5P +LS2)92L +Z2T)QQM +CK7)NKB +3PY)VS8 +2MQ)NT7 +C6Z)8F9 +NWF)35C +GYR)4NR +ZQG)W9H +7D1)V8R +Y2X)F26 +8X8)7KF +CN1)PZC +BPW)PBY +9WC)H8V +ZXH)GKH +CF4)N5L +C54)YJS +RY1)GZC +WMT)8CW +MZP)9SH +VZC)SKL +Y7T)C7V +SYG)R14 +ZLS)MLH +MZT)G1Z +NPR)VTV +LCQ)PZK +RNW)SXK +8CW)8YN +XXM)MFD +YL3)8WB +DTK)JFZ +TKC)J8R +MVL)TYJ +QR7)SKG +9GZ)BXM +M4Y)P9V +4XY)8QP +9XC)X52 +CVF)PTH +52S)D9L +TCP)SBL +SPG)KSV +MTN)GWY +VJL)N74 +4RT)LHJ +RG6)5X3 +Q7Z)CP8 +5X3)3PY +PVQ)TCF +JR1)7QK +DGV)YFL +BQ9)B2Q +W75)6KQ +13H)QYX +HQT)G2V +HDV)7RG +GV3)HFT +627)Q5F +YYS)RVQ +CQH)BPW +W3X)VXF +SZN)SLF +C7Q)8X8 +3SY)X64 +JG5)C6S +4C3)PSR +Q1W)RNW +T6J)NPL +T4L)D7L +L8P)27X +R66)TRQ +PKY)YCL +GQX)JVG +2NM)RWX +MP5)MR4 +5R2)GRN +JRM)M34 +THK)RPR +GKN)46X +1D1)8YS +XYN)6SV +SRV)GB3 +F9N)8FY +SLG)72G +J2Y)W6P +3RZ)K2W +W85)CY9 +MJ8)2FT +9B5)XW8 +PJD)6WB +DBX)V2T +M6X)VBM +XX2)BTC +1MN)XXM +DLD)3Q2 +4SH)BPL +T8Y)ZPV +3T9)HMW +C3Z)GDS +YJ4)L2Z +VJ7)Q7H +D72)K1T +5ZP)QP8 +XZD)894 +67Y)BKF +ZLD)YST +NQ1)F5H +2QB)M99 +WZ9)XC9 +COM)RR1 +F3J)G1X +SCR)L66 +46X)QT3 +4ZN)JDX +JYJ)2QB +XTB)349 +LM1)83X +29M)L2H +D5Y)VV1 +YTK)BKW +N72)GD4 +1PB)8ZM +V31)99V +RR1)68N +BM3)99C +XRT)VM9 +6FK)675 +5P9)CMQ +DSM)SJ5 +YST)KB5 +83N)6VW +ZCQ)5SM +V1Q)2S6 +LZR)QBL +H3G)9S1 +88G)YTK +NPL)ZHP +W44)NWY +5KZ)1MC +52V)9B5 +WL2)5P9 +JDX)V8F +R16)ZWZ +FVT)596 +8J4)FRL +2HC)986 +NFM)KWB +F2L)Y5X +VPS)43K +VX8)G8C +DMH)RCD +NCH)TPZ +9KG)MMP +RPR)CFW +JWY)SC1 +XTB)H3G +7FP)FMV +HGB)6JL +1P4)ZPK +WCF)11H +ZR1)Y75 +NP5)MNZ +GNT)8W7 +NGD)GNL +Q98)F6V +F32)7L4 +CFW)684 +T5C)QWC +VV6)SDZ +9QW)VKG +7WZ)R16 +LZ2)NYL +G2V)ZXH +VL4)9LX +9F5)CS5 +FYD)VX8 +R7C)2HC +LQS)54R +33W)F8J +N9C)ZGL +9ZB)5S8 +MLJ)8VY +LVY)T1W +1FC)JG5 +K75)LZR +LZ9)2XS +9P8)75M +LW6)TWM +K71)DGV +R2C)GKX +99C)ML2 +CM5)YKW +5YK)HM5 +9D9)G9V +2BT)74Z +TCP)NDT +L59)N3C +3FG)ZH5 +3S8)96C +JBB)9KG +QHN)CS4 +9TZ)PRZ +SM2)MHJ +Z5J)5QY +BNP)7HZ +HDY)LBC +QMV)7SK +GT4)SN7 +1MC)MZP +5C3)9WC +596)L1H +ZNZ)CM5 +PBN)KLS +2K7)BN9 +YJL)2VV +MJX)TDX +K2W)5ZP +1F9)6KC +BM8)D72 +79Q)ZTP +7RC)88G +7WW)JBB +43Z)7G1 +FKV)3W9 +T1W)911 +5RD)D7C +XBZ)NQ1 +C8L)F3M +M79)YFY +G2Q)LXS +F6V)T8Y +6XG)127 +CCV)2LJ +D9T)Q5L +ZTP)XL3 +LG7)X1Q +JHG)WBL +8F9)3DB +FNV)W7B +HS2)PR8 +6PL)WPM +HQH)9NT +WV2)3FL +1YM)Z51 +FCL)4KM +VBM)8DX +JXJ)MQD +H6C)K46 +72G)9XC +L66)Y2S +HMW)XPP +29T)LM1 +BPL)F3J +VTV)TX8 +9WW)L2R +Z51)GL2 +YD1)DZC +4TY)BPM +C84)GV3 +SFV)1ZV +XJT)17T +RK5)ZR8 +71K)DK5 +LTM)71K +QNL)XQB +WYV)N6B +JDX)5JC +6X9)CMF +TRQ)RMY +2S6)29M +4CJ)CTD +KG4)7BX +JLL)LCN +QYX)DMC +1P4)C6T +ZVW)RKM +XCQ)V31 +WM3)G6P +HFX)TD9 +7RC)Y4G +M5F)4WV +6GP)2K7 +PYL)5XS +88C)JMT +VB3)Q1D +RQS)JBS +SMJ)VSH +2WM)9RK +9SJ)1D5 +SP5)MLJ +9RK)2QW +1JZ)R6X +N4S)WGR +XWS)J1K +FGY)N79 +LM1)6DS +NVW)323 +LSM)46Z +97D)M6X +256)V8V +RCD)DHR +3B4)3RR +R49)8W6 +6BS)49C +C29)BM8 +NFG)9WW +9HC)F2L +DVV)N4S +CCP)R3W +DF9)ZN9 +W16)BDD +RND)CLC +CMF)HST +X1Q)C52 +MS4)5CY +BSM)W2H +971)482 +6JV)CBP +NB8)HG6 +LQM)ZMK +64H)DQJ +81H)2WM +P18)1QN +1Z3)RH9 +Q84)QH1 +SJ5)QBB +83X)W28 +XF3)D9T +L7W)BPN +PH6)81H +Q5F)4GJ +8DT)FKL +55R)F4L +R5T)5YJ +TDC)VHJ +WHB)FVT +TX8)7WX +RF8)35N +GD4)K2S +1ZV)2ST +T19)7FP +D6M)CYW +5XL)NK4 +5JC)JWY +G9X)CCV +Z1J)4C4 +PQZ)HD9 +VY5)6LJ +3HX)459 +H37)S1V +Z7P)G78 +YTV)YKQ +1QN)ZLD +BFD)THK +F52)FCQ +R44)XRT +YH7)YYH +DMC)R7Z +R5M)D12 +1MJ)XSC +85C)CVJ +7V2)K43 +M82)1H7 +8XZ)5PP +NJJ)Q17 +XS1)M82 +HJQ)P6K +MY4)NKS +L83)3NW +7HM)9G6 +3NP)S2N +175)927 +99V)ZJN +23H)PZW +1BK)R5M +QSK)XH1 +HPH)Z3Y +KVK)P5K +YKQ)WT5 +G6P)MFG +RYK)8JP +F2Q)BRM +GNT)XS1 +YHQ)8W4 +HTH)KQM +J72)JF2 +XXF)67Y +8VD)VFG +XL3)3HX +LL8)36C +FCK)KVN +X64)3NN +1HL)7Q3 +Y5X)1MF +T5K)YL3 +FSZ)QNL +P6K)DZN +B3P)KYB +1X2)ZNZ +TBN)V48 +BXM)1PB +8SD)GP8 +SLB)7BY +911)Q9X +DJ2)QN6 +3NR)YJL +8HB)SAN +L3L)52S +GZC)R1M +STY)H1C +H8G)GSK +DY6)L3L +C27)4SH +2MH)ZG7 +9SH)W8T +23L)C7Q +VK8)MGC +Y2C)9P8 +ZNR)DLW +RQS)G9X +PTH)NFM +XJ8)83C +WW5)2R2 +GMD)LVC +WBP)KSQ +XLH)Y71 +14T)9ZB +QQM)VZX +MJ8)H6Z +RMX)WBP +ZD1)3CB +BQZ)MY4 +TWK)53X +JK1)F7Q +7SK)85C +FS9)CTK +3Q2)9D7 +4KM)QMV +GK6)9FK +192)VRR +HJJ)YHQ +N5L)HS2 +GNL)LXK +KSV)DMH +9FK)YFT +K7B)KXZ +6DS)SRV +K5T)L1L +PH6)BVN +K43)9T5 +KWW)5FF +118)CN1 +2HJ)XJD +NYL)STY +MMP)9F5 +94C)W3X +CP9)NJZ +124)1MN +3DK)3RZ +1WX)4ZN +P7Q)F52 +8T5)2FV +CSF)4KZ +R14)R4C +KLS)F4H +G6Y)CLB +VHJ)ZCQ +CLB)MS4 +Y2Y)NCY +FCL)J9N +7L4)LTM +YMP)D5Y +K4M)5LW +C8B)3PF +2P5)VPS +1ZZ)GMD +T5G)H6R +HW9)S9J +VBX)FNN +894)3NR +JZJ)ZR1 +598)333 +P5K)8TP +LHM)B4Y +YV1)48F +QWC)NMQ +V8X)LH5 +53K)6FK +9T5)YTT +T46)PQZ +5RD)38X +Q1B)R2C +8LB)SYG +MCG)9CD +F9H)N6R +MCB)36H +R55)ZQG +KLL)NWG +N79)3NP +S65)D6K +L6R)2LX +NP2)XHX +MPZ)2HT +JFZ)C8X +HT7)9XL +KXZ)Q84 +6WB)WMM +N84)DTK +3FL)JHF +CY9)DSM +1QW)1YM +JLD)4CJ +6SZ)B6J +B2Q)F44 +D3M)HQH +FFP)PS9 +57T)1CV +BL7)7V2 +691)M7Z +CC6)7PS +JBS)HTH +LRC)3Z1 +7WX)1P4 +RH9)4JD +MJK)KZC +JJD)691 +XV1)8DG +G7S)X5S +7LW)6BS +KP7)D7W +BKV)6MQ +SBX)1JX +MR4)Z1M +L2Z)97T +8QP)NPR +C7V)9X7 +PWQ)TWK +MQD)WV2 +LCN)4QK +3KP)T46 +8J4)PYV +BPL)D8P +42C)V5D +83C)C2W +F4H)ZNR +BYW)MP5 +61L)CQH +RZB)T4S +FMV)2P5 +J6M)FYD +HTV)J3P +D3G)JLD +WGR)J1M +NXT)PV2 +TD9)3L1 +TYJ)8KG +BRN)RDX +LHJ)V8X +Q11)FGY +Y6T)F47 +L55)42C +94C)23L +R3P)DM5 +172)QFK +N3C)T5K +2VB)57T +T4S)PWQ +LZ4)JLG +TRQ)RL4 +J9N)SCR +T4P)LT4 +3NN)3X8 +FCQ)HCF +LR7)D6M +2R2)P7Q +9XL)69G +JVD)5XL +953)RZB +L9Z)YXK +HCF)YYB +L7P)X71 +L99)QM8 +9R3)VKY +NHP)ZD8 +S2N)DHN +66J)175 +9LX)K6N +V48)Z46 +6H7)WR6 +JCD)RG6 +8DG)7QR +D7L)HGP +JXJ)53P +YJS)F32 +F32)T4L +TCF)XF3 +73N)CXF +GKX)ZVW +VT1)75D +M7Z)BL7 +323)K7B +QVZ)D3G +Z4H)3CC +R5M)HY2 +PYY)WXC +6JW)PZR +2QL)WYV +4RX)XFS +7KF)3WD +1Z5)QHN +YH7)8F1 +6JL)N41 +132)V1Q +CMQ)118 +Q5J)JCD +WH9)PKS +7G1)LQM +XLV)HJJ +G8C)37T +JML)8LB +B3R)4RT +RNQ)FTV +XC5)SLB +MSJ)VW7 +HHB)QCT +46Z)PBN +H1C)VT1 +JNL)1ZZ +NN3)2PL +4QK)JZJ +8JP)QR7 +JB8)FFP +L99)J72 +7PS)G2Q +5T9)FTP +WPM)MZT +8RQ)G3H +65G)2H7 +NXB)9DR +K5T)F9N +FNN)YTM +G1K)XV1 +6MQ)5R2 +74Z)WCF +2VV)3H9 +649)Q8V +VZX)HT7 +11H)66J +KTF)H8G +KB5)FKV +G7G)MZZ +CTD)44K +3VR)C92 +G2V)7YL +VWK)172 +9S1)R49 +15X)24K +VJM)6TQ +1SP)XLH +GQH)1X3 +NJZ)PYY +YWG)BX3 +HQH)HJQ +VQS)3B4 +6CW)X3D +NT7)83N +1YQ)JM3 +2XY)HDY +TJV)92J +JPX)PJD +J1M)9K2 +C92)VS7 +ZWZ)NP5 +1JX)W5Q +NMS)FD9 +FVY)R5W +PS9)T8W +V2V)BSM +SD3)Y2C +68N)88C +RJR)VBX +M2G)LL8 +CRV)NCH +8LW)7MJ +675)2BD +9NT)BQ9 +2H7)T6J +CBP)KNW +ML2)Y94 +KQM)HPH +15K)N5F +CS4)N95 +G3H)S3G +WW2)34B +8PD)H6C +PZS)W99 +S9J)F2Q +LT4)R6L +PX4)Q7Z +5PP)9GZ +FXT)DTX +R5W)64H +HGP)BM3 +ZG2)FZH +MHV)W6G +YYB)4L5 +24K)WL2 +Y2L)TCP +FRL)C84 +RWX)ZJM +K87)LQS +PQY)5KZ +FKJ)STT +X7P)FQG +CM7)415 +HG6)9S8 +C2W)FS9 +G1X)J7B +WM6)RCB +PYV)LHM +QN6)14T +WT5)2MD +RL4)H3S +VTV)NB8 +8ZM)MD4 +XMY)NLX +CXF)NHC +8F1)G6Y +YFY)3DK +YJ4)LZ4 +9FK)CVH +FT7)9HC +ZH5)1JZ +3Z1)Q98 +GYG)971 +JLG)FQ9 +H6Z)8DT +J8R)NFG +N6R)HQX +FPT)97D +6MT)FSZ +NCY)LZ9 +W2R)CJ9 +LYK)PH6 +RCB)SM2 +SBL)C16 +X52)W44 +SDZ)2FG +H7Q)TBN +RV6)7TR +43K)GQX +2SM)4C9 +C6S)7G6 +NVF)9TZ +M34)CM7 +WS6)R2D +JHF)L83 +DZC)HTV +RCD)3PN +9NB)98D +G1X)699 +VLZ)2MH +MNZ)CCR +787)3K3 +JCB)1BK +6SV)D9F +DP9)L99 +R4C)9KM +T29)RYZ +R1M)PYL +T2B)RGB +NK4)J2Y +L1H)CRT +3PF)6CQ +Y5S)F9B +986)CP6 +C16)B5H +9GB)S65 +333)VV6 +P18)KVX +LXS)98L +S5C)4XY +PRZ)R44 +8W6)JR1 +B4Y)12G +349)Q77 +D9F)KM2 +T3C)QMD +N6B)9PQ +9G6)7XJ +D12)NVF +SN7)D82 +H8V)SSP +BPN)5YW +3CB)KFG +BTC)TVN +QT3)2KK +SXY)T19 +R2D)1JG +2VS)BN1 +R6X)JK1 +KFG)G5G +LZR)F9H +5QY)FWK +Y2S)WW5 +YJF)SF8 +94V)YMP +XGT)KVK +57S)S2G +4JD)CCP +118)G8D +TPF)FV1 +LTM)JNL +NVF)B89 +F44)94C +F4L)8HB +MS4)192 +NHC)RF8 +5YW)8LW +DNB)S5C +RTT)YQ4 +3RR)DF9 +GYG)8H4 +2DJ)PYS +XNG)1QJ +D7C)1YN +9CD)XBZ +86C)KF1 +RSF)NVW +4KZ)SFV +YTM)5SS +W3X)Y2Y +X52)FKJ +BR7)58V +JNQ)DB9 +R3P)13H +BDD)TC5 +Q83)LSM +FCK)7RC +1YN)19K +2KK)MCB +QBV)NMY +JF2)6VF +HQX)5Y6 +QWQ)MSJ +Z35)MHV +KF1)LR2 +3DB)LQ3 +127)X1B +LQM)DBX +ZG7)W85 +GVL)M4Y +482)MJK +YFL)RTT +Z46)MJD +L9L)1W9 +8GQ)D2G +44V)MTN +XH1)5C3 +F3M)QBV +F47)6P8 +YM7)6JV +2R5)W2R +N5F)5MM +4NR)C6Z +NKB)Y1C +KSQ)PY2 +QFK)JXJ +5S8)7D3 +C6T)FZB +LZW)VJ7 +XMV)KWW +VWK)CVF +ZCR)79Q +X3D)G1K +J1K)H7Q +K46)Y7T +H3G)53K +YCL)5Y3 +WHB)1YQ +BDX)GYG +MKW)RNQ +KJL)HDV +9SL)B3P +T46)RV6 +KXG)M24 +34B)Q1B +HJM)J8J +C8X)ZCR +PZR)65G +9YP)JML +3DK)GN9 +6PH)W75 +69G)4CS +Q48)HHB +1CV)XNV +D8P)JCB +NMP)LJZ +PZW)33W +6VD)SM1 +NZ7)HHQ +XW8)9SJ +CRT)MH9 +C8L)HQS +LQ3)H8P +9S8)ZZR +BFG)LYS +Q17)2R5 +WR6)5CR +49C)ZG2 +CRT)DK6 +5JC)QH8 +5YJ)2VB +5SS)GYR +1W9)L8P +35C)DJ2 +4CS)1HL +GG4)VWK +1MC)T5G +Z5F)5MJ +Y8P)XNG +Q98)Q83 +W99)VZC +DB9)RQS +L1L)F23 +8B4)LYK +YV1)YD1 +VW7)XZD +L28)6VD +PY6)XCQ +KVX)MCG +8VY)2SM +H6Y)X7P +Q7Y)LVY +M7Z)HWF +PP2)PY6 +CTK)CF4 +BVN)PZS +36P)6X9 +SSP)RY1 +GP8)YTV +3NW)8ZK +FWK)RKG +CCB)HZQ +MJX)WH9 +G92)JRM +7XJ)H1R +8H4)BLZ +2HT)7NY +TPZ)8SD +V2V)WHX +VSH)WM6 +LR2)649 +D9L)RVX +W2H)HJM +PV2)HFQ +43Z)GFF +1TD)FPT +NHL)SHF +8F9)8VD +GFF)1FF +Y1C)RMX +8KG)DY6 +6ZR)SD3 +LVC)NYT +HQS)X9N +Q1D)BYW +YD3)LW6 +R3W)H5P +FV1)XLV +LYW)VD4 +DZN)GV8 +1N3)C3Z +JCD)R5T +X9N)8VL +WV2)Q3R +17T)124 +8C2)VB3 +B1V)SZN +NMQ)GT4 +BRN)55R +X1B)9SN +5LW)Y2L +SRJ)RSF +CCV)PP2 +SJQ)LRC +RDX)XWS +QM8)8XZ +X3P)MN6 +GDS)V2M +X5S)4CZ +TDX)XGT +GV8)NJJ +BRM)1MJ +2ZY)L9L +W6P)BRN +QMD)FCK +W28)8DZ +HZ8)XYV +B5H)YOU +GL2)3HH +2WD)VL4 +NYT)6ZR +CSF)C8B +V7N)8VN +21R)N9C +XC9)94P +FD9)5BS +J3P)ZNH +HZ8)V2V +QYM)8PD +VT7)9GB +XHX)RM5 +YXK)43G +53P)G92 +HY2)953 +1N3)TKC +F2N)3S8 +FTP)2YT +VS8)RB5 +HD9)JR6 +XRX)VJM +MN9)LYW +M24)6JW +QD7)B5B +G6B)K38 +S2G)8RQ +BN1)29T +43G)6PL +4WV)H5W +RCB)CHQ +H6R)4TY +LP3)33B +CVH)C29 +C5J)YNK +3Q2)H65 +1QJ)KLL +VKG)L9Z +D2G)36P +HFT)NHP +VS7)Z2T +36C)X3P +4BM)1DG +GN9)ZMW +RGB)48B +K38)1N3 +YRB)T71 +4R7)BNL +Z63)4R7 +5Q2)4C1 +V4D)3VR +DTX)1F9 +R6C)3LL +2FC)H6Y +YYS)YJ4 +34B)XMY +7NY)KC7 +LYS)XTB +JR6)V4D +M5P)L28 +CR3)PHC +VFG)LCQ +Y3G)23H +G5G)FXT +2FV)NGD +BQ9)QD7 +5FF)N84 +RB5)YRB +QBL)YZ9 +7BY)K5T +NWY)D6H +YRK)MN9 +DM5)FT7 +1LX)QYP +KM8)3FG +92L)NMP +QCK)4RB +MLH)JJD +5CY)Z5J +V2T)D3M +4C4)SG7 +J7B)FFL +VKY)WS6 +VT4)JNQ +Y4G)YNQ +MBP)QCK +4C1)CRV +JBB)KTF +GMD)2MQ +NWY)1Z5 +BHQ)C27 +MZZ)R55 +9D7)74F +SKG)3T9 +1H7)DQY +F7Q)JVD +WPM)R6C +2QL)256 +BKF)7LW +3H9)15X +VXF)6X4 +PN3)3KP +DK5)VQS +V5D)ZD1 +4C3)1TD +CHQ)CCB +9HC)CQD +97T)WHB +953)1FC +3PN)GG4 +323)1SP +DF7)T3C +Z46)G7G +F5H)DNB +J2Y)XYN +G9V)FKK +HHQ)GSZ +Q9X)ZR9 +Q5L)PN3 +STT)BKV +7F9)CK7 +JML)7D1 +CQH)BQZ +H8P)HQT +RMY)WZ9 +C92)QKY +9DR)RND +QPC)K87 +74F)HZ8 +4RX)R8C +TWM)44V +6TQ)L6R +7MC)6YR +DMC)73N +ZR9)NHL +8YS)VMX +NZ7)KK5 +WMM)VLZ +SM1)YD3 +VV1)MQM +7BX)VK8 +1QW)SRJ +HWP)YM7 +48B)5NF +3PY)1Z3 +J55)9YP +PKS)LS2 +NP4)SP5 +NWF)V2W +DY7)DVK +FRC)KM8 +Q77)6H7 +7Q3)15K +KKR)NP2 +6KC)G7S +4RB)YR1 +KC7)Y4F +ZGL)FD4 +T4B)QD6 +Q83)BFD +5LW)C1T +G8D)SMJ +5Y3)Q1W +Q7K)4BM +SM3)LR7 +BX4)SKH +12G)SPG +DQ4)SJQ +216)1D1 +1MN)J24 +SF8)DZ2 +FQG)YWG +HST)R3P +F3Z)3SY +5BS)4H2 +QBB)Y2X +W8T)48T +M4P)6CW +JMT)6GP +KVN)5S4 +H65)8C2 +GVX)WMT +WVY)N72 +1DG)L7W +MGC)FRC +MFD)XJ8 +RKG)BX4 +NKS)4FP +QH1)2QL +7YF)PVQ +4C9)2VS +QKY)R7C +83C)KG4 +V4H)2DJ +GQB)DF7 +R7Z)GNT +KZC)JHG +5SM)W16 +2NF)6JN +SHK)94V +X2N)216 +RVQ)X2N +DJQ)NP4 +8VL)Z7P +KWB)8T5 +HJJ)MPZ +K2S)CP9 +NMQ)Z63 +7YL)21R +6LJ)8GQ +58V)VJL +3K3)PQV +V2M)Z4H +SLF)5H8 +S8Y)132 +PQZ)9QW +CLC)L7P +K6N)Q11 +HZQ)K71 +SKH)XX2 +HFQ)Q5J +2ST)WVY +D82)BR7 +CS5)DY7 +9K2)Z1J +J24)PQY +PVV)GVL +HV5)P18 +T4L)GKN +2FG)YJF +DHN)FCL +JM3)4RX +SNB)DJQ +C1T)QYM +5MM)M4P +N74)RJR +6P8)XRX +QYP)6MT +ZMW)7YF +8TP)GQH +XFS)9R3 +FQ9)9B1 +H87)Y8P +MH9)8B4 +4CZ)NXB +DHR)7F9 +GB3)T2B +8SD)1QL +44K)57S +2LJ)FVY +XYV)GK6 +3LL)TJV +5S4)9D9 +BKW)HWP +DJS)ZYY +8DZ)G6B +699)WW2 +XS1)WM3 +48T)YV1 +7RG)Z6B +FKL)9SL +J8J)598 +DQY)1QW +WR6)MJX +K5N)5BV +FZB)4C3 +PBY)ZP5 +D6H)Z35 +Z35)2NM +6JN)787 +38X)NMS +V1Q)5YK +W6G)XC5 +N5F)V4H +ZR8)M5F +L7W)DLD +DWH)7WZ +9QW)Y3G +QRM)MBP +TD9)QVZ +RTT)43Z +H6T)FNV +1X3)VHW +N41)SBX +MN6)MVL +XF3)RK5 +8WB)2S4 +V8V)2BT +T19)8J4 +F11)13C +2PL)GVX +GL2)JB8 +54J)ZLS +2XS)V7N +G1Z)SHK +GKH)RYK +YZ9)YH7 +7TR)VC9 +8HH)LFL diff --git a/src/args.rs b/src/args.rs index 01be7ee..fc16670 100644 --- a/src/args.rs +++ b/src/args.rs @@ -1,5 +1,6 @@ use clap::{App,Arg,SubCommand}; use crate::machine::Computer; +use crate::orbits::UniversalOrbitMap; use crate::wiremap::{Wire}; use std::fs; use std::iter::FromIterator; @@ -10,6 +11,7 @@ pub enum Command { ComputeFuel(Vec), RunComputer(Computer), WireMap(Vec), + Orbits(UniversalOrbitMap), PasswordCrack(u32, u32), } @@ -63,6 +65,14 @@ impl Command { .required(true) .validator(is_file)) ) + .subcommand(SubCommand::with_name("orbits") + .about("compute the given orbit map") + .arg(Arg::with_name("MAP") + .index(1) + .help("The orbits to run.") + .required(true) + .validator(is_file)) + ) .subcommand(SubCommand::with_name("crack") .about("crack a code in the given range") .arg(Arg::with_name("START") @@ -77,7 +87,7 @@ impl Command { .validator(is_number)) ) .get_matches(); - + if let Some(problem1) = matches.subcommand_matches("fuel") { match problem1.values_of("NUM") { None => @@ -88,7 +98,7 @@ impl Command { } } } - + if let Some(problem2) = matches.subcommand_matches("compute") { let start_pos_str = problem2.value_of("START_POSITION").unwrap(); let start_pos = usize::from_str_radix(&start_pos_str, 10).unwrap(); @@ -120,7 +130,14 @@ impl Command { return Command::PasswordCrack(start, end); } - + + if let Some(problem5) = matches.subcommand_matches("orbits") { + let file_contents = fs::read(problem5.value_of("MAP").unwrap()).unwrap(); + let str_contents = str::from_utf8(&file_contents).unwrap(); + let res = UniversalOrbitMap::from_str(&str_contents).unwrap(); + return Command::Orbits(res); + } + panic!("Failed to run a reasonable command."); } -} \ No newline at end of file +} diff --git a/src/main.rs b/src/main.rs index 5e66af0..ced342b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,6 +2,7 @@ mod args; mod endchannel; mod fuel; mod machine; +mod orbits; mod wiremap; use crate::args::Command; @@ -102,5 +103,10 @@ fn main() { // 353 is wrong (low) println!("Successful digits: {}", count); } + + Command::Orbits(uom) => { + println!("Got orbits."); + println!("Base map has {} orbits.", uom.num_orbits()); + } } } diff --git a/src/orbits.rs b/src/orbits.rs new file mode 100644 index 0000000..6741806 --- /dev/null +++ b/src/orbits.rs @@ -0,0 +1,138 @@ +use std::collections::HashMap; +use std::fmt; +use std::str::FromStr; + +#[derive(Clone,Debug,Eq,Hash,PartialEq)] +pub enum Object { + CenterOfMass, + Object(String), +} + +impl fmt::Display for Object { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + Object::CenterOfMass => write!(f, "COM"), + Object::Object(n) => write!(f, "{}", n), + } + } +} + +impl FromStr for Object { + type Err = (); + + fn from_str(s: &str) -> Result { + if s == "COM" { + Ok(Object::CenterOfMass) + } else { + Ok(Object::Object(s.to_string())) + } + } +} + +pub struct UniversalOrbitMap { + orbits: HashMap> +} + +impl FromStr for UniversalOrbitMap { + type Err = (); + + fn from_str(s: &str) -> Result { + let lines = s.split('\n'); + let mut orbits: HashMap> = HashMap::new(); + + for nextline in lines { + if nextline.trim().len() == 0 { + continue; + } + let mut splits = nextline.split(')'); + let obj1str = splits.next().unwrap_or_else(|| panic!("Bad orbit line: {}", nextline)); + let obj2str = splits.next().unwrap_or_else(|| panic!("Bad orbit line: {}", nextline)); + let obj1 = Object::from_str(&obj1str)?; + let obj2 = Object::from_str(&obj2str)?; + if let Some(prev) = orbits.get_mut(&obj1) { + prev.push(obj2); + } else { + orbits.insert(obj1, vec![obj2]); + } + } + + Ok(UniversalOrbitMap{ orbits }) + } +} + +impl UniversalOrbitMap { + fn orbits(&self, obj1: &Object, obj2: &Object) -> bool { + match self.orbits.get(obj2) { + None => false, + Some(items) => { + items.contains(obj1) + } + } + } + + fn indirectly_orbits(&self, obj1: &Object, obj2: &Object) -> bool { + let mut search_stack = vec![obj2]; + let mut history = vec![]; + + while let Some(nextobj) = search_stack.pop() { + if nextobj == obj1 { + return true; + } + + if history.contains(nextobj) { + continue; + } else { + history.push(nextobj.clone()); + } + + match self.orbits.get(nextobj) { + None => + continue, + Some(newitems) => { + for item in newitems.iter() { + search_stack.push(item); + } + } + } + } + + false + } + + fn objects(&self) -> Vec { + let mut res = vec![]; + + for (key, vals) in self.orbits.iter() { + if !res.contains(key) { res.push(key.clone()); }; + for val in vals.iter() { + if !res.contains(val) { res.push(val.clone()); }; + } + } + + res + } + + pub fn num_orbits(&self) -> usize { + let mut result = 0; + + for obj1 in self.objects().iter() { + for obj2 in self.objects().iter() { + if (obj1 != obj2) && self.indirectly_orbits(obj1, obj2) { + result += 1; + } + } + } + + result + } +} + +#[test] +fn examples() { + let input = "COM)B\nB)C\nC)D\nD)E\nE)F\nB)G\nG)H\nD)I\nE)J\nJ)K\nK)L"; + let map = UniversalOrbitMap::from_str(&input).unwrap(); + assert!(map.orbits(&Object::Object("B".to_string()), &Object::CenterOfMass)); + assert!(map.indirectly_orbits(&Object::Object("B".to_string()), &Object::CenterOfMass)); + assert!(map.indirectly_orbits(&Object::Object("E".to_string()),&Object::CenterOfMass)); + assert_eq!(map.num_orbits(), 42); +}