From 93d609a25e34d5d0655d3298d219fd0657f8b7df Mon Sep 17 00:00:00 2001 From: Wesley Moore Date: Sat, 7 Dec 2019 16:11:25 +1100 Subject: [PATCH] Day 6 part 1 --- 2019/input/day6.txt | 859 +++++++++++++++++++++++++++++++++++++++++++ 2019/src/bin/day6.rs | 105 ++++++ 2 files changed, 964 insertions(+) create mode 100644 2019/input/day6.txt create mode 100644 2019/src/bin/day6.rs diff --git a/2019/input/day6.txt b/2019/input/day6.txt new file mode 100644 index 0000000..beb8e85 --- /dev/null +++ b/2019/input/day6.txt @@ -0,0 +1,859 @@ +Z9G)Q7N +D1W)7G9 +FP7)F5P +L8W)55T +YZC)1HN +1DQ)QKD +4RD)38D +8V7)DC8 +95Q)33Q +Y8N)G7L +X25)7YN +5QH)JWW +ZWL)HGG +H4Y)RWG +N38)XWR +PWP)F6Y +6XB)QX1 +G3W)PKM +5G5)439 +V1Z)CBZ +8X1)5R5 +6LJ)QHD +V9Q)N7G +WRP)XBW +61Z)7KN +FQR)371 +KD8)GSS +FMM)B8R +QXD)4ZG +7JC)5SB +VGH)XCZ +VSN)C2H +W76)12B +R4Y)W7R +L8H)V1Z +BHB)1T9 +7S2)1V6 +338)MYS +ZM3)RN1 +3P8)WW7 +GVG)FPQ +43B)HKJ +QN3)KK9 +728)KSW +QBV)J45 +XTS)WW1 +Q2C)HM8 +X25)9TL +V63)WR1 +DP1)PX5 +GNV)J4Y +672)BY5 +CK1)WD2 +5R5)TZR +4JW)MKF +KMR)Y8K +HDY)YZC +CGS)ZL4 +RCT)238 +ZNZ)J3L +17F)8LJ +YG5)YVS +1Z9)CK5 +HFN)GZV +V15)97D +5NP)6XB +K9D)J32 +Q36)KN8 +91X)85T +XRY)LLV +ZL4)CK2 +JLC)DLX +99Q)8LK +P3R)X6R +ZNZ)SH8 +H7C)669 +V7K)43B +Y9T)7VF +X5L)54F +RLX)TKF +5XJ)H69 +7FB)MXS +D74)24S +MDV)VSN +C1Y)J7T +P8Q)BPJ +LF7)JCM +77T)XYQ +JYP)DCX +WZ6)GB3 +4YN)1Z9 +5FS)Y9Z +HXD)MWF +XLS)CRC +C93)9SN +STQ)3FL +D81)NLP +T7T)8V7 +K6N)YSF +7ZB)73P +8NT)28S +F1F)1L8 +1HN)WL1 +TWS)D1W +6WG)2DS +FPN)FBN +CK2)NW8 +2RS)DG7 +N6F)G5L +CCK)C6M +7B9)KRX +TXD)7FB +J45)C32 +CG2)V7K +6YL)S4C +PVN)CX9 +BTW)4FQ +6SL)CC5 +S97)3GM +47N)R5J +T9R)5NP +3FL)HXF +HF1)DSX +RWJ)33Z +NGS)JRF +T74)D5R +9SQ)747 +Z7S)S4D +WHS)XQ2 +PTF)1PW +KW2)RCT +4Z7)K9D +9TV)N5N +GJP)91Y +RQB)WS7 +14X)Y9T +D1W)6ZH +Z5M)M52 +HMM)JY4 +H64)SAN +V3N)FT8 +1ZQ)FTD +WJG)516 +YQP)MK9 +79F)GMS +NC9)CKH +VMD)W32 +GMS)385 +XPP)RDH +JCM)8MB +ZKH)CMV +HYY)SK7 +NYN)JDY +FTD)6WG +G8K)Z4P +5NK)RRG +GKY)3Z4 +Z9W)BWG +LS6)3D4 +HZF)X5L +3NV)9TG +2HB)GLS +8N9)842 +T95)S6F +4PZ)338 +NC9)HYS +VGM)VBR +X9G)855 +GGP)WTG +DRJ)HFY +SXT)49K +71R)P99 +49K)4VN +B4P)G3W +DS1)CC6 +PTX)Z69 +19D)2V8 +2DM)2VY +CNT)CH4 +WD2)L5Y +VFV)NGN +BV6)8MQ +HMS)NJ1 +V39)355 +8B6)63R +N6V)N8S +X9X)BPV +H5L)HW5 +QX1)8XJ +BGB)2XW +8P1)99V +3H8)9TV +Z2Q)XDQ +385)QS2 +3D4)FMM +BL3)J3T +L6P)YG5 +JV4)6SL +VL5)N6F +BPV)SG7 +HLX)LB6 +KSW)SSF +HKJ)KW2 +VYP)YGK +4RZ)KQG +X8Q)X25 +CM4)XF4 +ZSG)C9Q +XXP)CG2 +9LS)YRN +L4W)9SZ +98B)XJQ +C9W)HMS +SSF)9SQ +21W)J3F +4PH)H2J +PKM)SHR +35M)G4D +8FT)9LH +3RW)VX8 +SSX)VZG +BHH)BL3 +RTD)RNZ +RD6)KMT +YSL)1N8 +X1B)BH8 +LHB)HNN +73P)LHB +TGY)Z2L +JPD)HK3 +SN6)BTD +FW3)T7T +CBZ)1PM +HV3)CM4 +2DP)TX4 +6P4)FWL +HNN)BDH +51S)YS5 +3VP)GZC +3D4)DDR +MWF)66Z +M52)TWS +7XM)V9Q +XQ2)KQH +4XN)H8Y +QKD)FP7 +FPQ)VC3 +91Y)16Y +752)6P7 +RZN)T3D +YS5)Z7S +V1D)19X +14P)7WH +KQT)FLS +WVC)ZSG +JXC)4JJ +B8R)KD8 +6S7)2MS +NJH)S75 +S75)4Z7 +8LJ)Y19 +C5K)57N +SH2)HSR +CJJ)13S +1HN)WVJ +H3M)HLX +N1R)Z9W +S4C)XLS +HP7)7LK +WVJ)7JX +GY3)SKW +HSP)8X1 +VX8)2JT +S4D)6CQ +9TM)752 +J3L)G1K +5LT)G4W +HFY)6SN +4X9)VGY +VMD)YK2 +66Z)PWP +HGP)YM7 +JDY)BDM +ZSF)P2V +MK9)XXP +JRF)RFM +RNZ)QRW +7QF)NJY +BWN)YD5 +9SS)X9V +H69)GNV +ZZH)LL9 +CM7)NYN +J24)BGB +RY9)5QL +CCK)H5L +J5M)DRJ +7LK)T74 +373)RZN +WQ1)7JC +DG7)QBV +LSR)PMX +6ZH)PYL +MFL)4X9 +LTB)Z5M +36D)P7S +63P)DP1 +38D)DVK +D2P)XL6 +1SZ)T3Q +N27)F1F +F9Q)BV6 +ZDS)SDJ +JW6)61Z +7YN)Y14 +BXV)9LS +JY4)VT4 +GVG)8FT +HJW)3RW +K39)GYC +14F)NCB +MXS)2DM +24S)98N +TKZ)CJJ +XCZ)3NV +NLP)X1B +87T)RL7 +JBF)SQV +3MZ)R56 +7JX)ZNM +2S8)MPH +MTL)LVS +M87)3W9 +HXF)2L3 +751)WG5 +4ZG)65P +28R)DS1 +LPT)HYY +ZGT)HKP +W63)QXH +ZL6)C4K +W66)LVF +QSN)9BR +8LY)BTW +TP7)YTG +SWG)BJ2 +8MB)373 +CS8)ZDS +34F)N1R +P1S)W66 +BWG)H2K +G9T)ZM3 +DHJ)672 +H6G)V2T +FCY)S1M +XVM)4WM +N6F)N27 +LZ3)HDY +9D8)6P4 +2L3)PSK +5HS)SH3 +4FQ)MDQ +QXD)JPD +6H1)2JH +GNV)WXS +RRG)Z2Q +SQV)HQ1 +GCN)JL5 +LG6)SH2 +ZXK)PTF +2JT)3H8 +SKW)HMM +Q46)T95 +2XW)71R +DBL)35T +T7D)NT9 +PJ7)PMC +M6X)DBK +PZT)7P1 +G9H)5LT +1V6)D1X +MDV)M6G +WVC)9D8 +T6X)NJG +Q44)SSX +BY5)Q44 +Y8K)DKH +DLX)H64 +NJ1)79F +3ZH)R9Z +PYP)CW6 +N38)728 +3SC)NBL +XWR)4RC +BPJ)X24 +FCP)WQ1 +8XJ)NJH +6V6)2TK +M7H)PR6 +65P)XM7 +9R1)D74 +MBZ)VX3 +XJQ)P8Q +HM8)HSP +5W2)MPV +DVK)17F +8LK)5XJ +BP2)6FD +C6M)QLL +ZXJ)KMR +8QS)YTH +W35)3R1 +1N8)HKQ +4VN)H6Z +2VW)3V9 +HYS)VFV +YZ3)ZK5 +KNV)3VP +FWL)YSL +NRN)P38 +MFX)PVN +MZ7)3P8 +LLV)PYP +MGY)7H8 +N26)KCC +4ZK)2DP +HJS)ZSF +HTV)JXC +3J3)W4G +4GG)JNB +X6R)HY5 +GLS)FQR +9LH)H4Y +F4P)TV5 +HLY)V39 +HM8)LG6 +F6Y)JHK +VPC)NN3 +YWT)X8T +JV5)NQS +7FL)3ZH +MKY)P3R +SCR)RY9 +5FR)T47 +BJ2)5FR +NJY)MZ7 +BTD)JLC +516)PXS +G8K)K3T +9SZ)PTX +MYS)47N +Z4P)CRS +J84)V63 +6P7)VYP +YGK)596 +SF4)VL5 +PX5)4SJ +2V8)F4W +XSC)FDN +RBZ)35M +XL6)4KJ +K9M)R47 +Q7N)LZ3 +DJ2)Q36 +HY5)X8Q +35T)PHH +C3Q)6V6 +SH3)CTS +X8T)DHJ +3K4)W76 +LF1)KTP +GB3)2RS +RL7)HLL +G1K)9TM +63R)F4P +LR9)Q2C +XM7)6YL +9TG)P67 +C32)4GG +5NP)L1Z +3V9)1TL +GJP)ZGT +N5N)L71 +VX3)7C8 +Q8Q)95Q +Z3T)1N1 +57N)HJS +QS2)3SC +PV8)8FF +63P)8QS +PBV)JV5 +KQG)TXL +7P1)X9X +ZK5)M28 +JVF)P1S +DL8)JTY +9D8)91X +4WT)XCJ +S6F)TPQ +FDN)KPT +KS4)2VW +NGN)7NQ +WW1)XSC +HP7)YOU +KTP)MV8 +49K)2VD +2CJ)CCK +J4Y)YSY +Q2Q)MWV +YTH)J5M +26H)CXL +MWV)SCR +W4G)9TT +Y19)K6N +5QL)GKY +R5K)BBQ +C2H)M74 +WW7)Q8Q +YSF)J84 +9BR)14P +6FD)CM7 +7G9)XTS +TV5)ZKK +X24)Y8N +CSK)3YD +HSR)H3M +211)CK1 +92P)BHH +MGZ)MDV +5ZR)Q2Q +P7S)2FV +JWW)Z9G +99V)ZZH +WXS)S97 +PVN)HP7 +6CQ)KXK +RZF)RD6 +M87)RLQ +Y9Z)DT2 +PR6)GNR +WL1)VGH +LG6)6Z2 +C4K)HV3 +WS7)KD5 +98N)XCT +CKH)BHB +8CH)TGY +GMS)99Q +7VF)K39 +D54)LF1 +4SJ)PV8 +BDM)JW6 +3YD)ZL6 +BBQ)5NK +9BR)GCN +73L)D54 +MDQ)TP7 +C9Q)2S8 +2TK)77T +PR5)LS6 +L5Y)FHX +VZG)4PH +NCB)D31 +H6Z)PBV +6YD)26H +XCT)63P +BDH)8KZ +VX3)ZNZ +7PM)3MZ +F4W)R4Y +HKQ)PZT +HKY)QN3 +TQY)FCY +NJG)QX8 +CMV)8NT +NN3)HK9 +7P1)5ZR +697)YQP +RV3)69K +QX8)G9H +R5J)RWJ +13S)T2D +NT9)NC4 +RLQ)BR6 +M24)CS8 +YSY)2HB +VGY)DBL +QQN)CCC +RWG)X76 +SSX)F9Q +FT5)N38 +6QQ)SY4 +JL5)L4W +2VD)211 +5BF)36D +JV4)L6P +RDH)XW8 +61C)LC1 +85T)FCP +4H6)LPT +CH4)F8G +BB7)RZF +JHK)T6Z +SHR)LTB +HK9)JB4 +6QQ)TQY +5WX)KQT +7G9)L8H +4T5)CNT +T3D)92P +7NQ)77J +DDR)8M3 +DBK)X9G +CGQ)9J8 +G5L)3WM +YVS)M6X +SG7)JK2 +CK5)V1D +NQS)26M +C32)TXD +51G)FKP +X8T)5BF +XW8)6LJ +CBZ)87T +Q5J)NGW +3YD)VGM +WR1)C1Y +2MS)H6G +JK2)9R1 +YM7)21W +W32)6WP +4T5)CV6 +CW6)D2P +DSX)7XM +YDG)7ZB +T13)Z3T +P67)2JF +XGK)SX6 +NFB)DCW +KN8)KZH +TXL)14F +KD5)HGP +2VD)S9X +TQV)D81 +TRM)75P +PXS)T13 +BH8)HJW +48P)2CJ +H2J)RLX +XYQ)NGS +FKP)14X +SK7)7PM +LVS)D56 +DT2)J24 +439)M5S +4Z7)4ZK +HGG)7MR +VC3)6QQ +3W9)DDZ +842)YWT +PHH)RV3 +B3V)JVF +7C8)WHS +9TT)61C +ZNM)RTD +48Y)6S7 +PRW)HV6 +LC1)HTV +75P)34F +MPH)MTL +2X4)4H6 +F8G)N6V +VC3)WRP +MLR)SKV +7WH)1GY +CZC)NFB +9SN)DL8 +COM)HXD +XZV)9SS +YTG)4RD +6SQ)MFL +3GM)K9M +1N1)4XN +PS3)FW3 +HK3)CGQ +N7G)ZWL +28S)NRN +GNR)BXQ +DKH)LSR +Z69)T6X +M74)1ZN +J3T)MLR +SH8)1ZQ +L1Z)WVC +CXL)M49 +GGP)BWN +7MR)NX2 +1GY)6SQ +KQH)HKY +LL9)V15 +TNS)HZF +Y6X)6YD +9VN)TNS +K3T)YDG +48P)XRY +G7L)5FS +HV6)7S2 +7H8)SF4 +4RC)MBZ +BH8)48P +K3N)7QF +YM7)FT5 +1T9)M87 +PYL)DJ2 +Y14)9VN +12B)LF7 +C9Q)48Y +X9V)T9R +MPV)ZKH +MDQ)2X4 +GVY)XGK +G4D)8ZH +T47)4PZ +M49)MGY +RN1)V3N +8KZ)K3N +211)TRM +69K)BP2 +7LK)PS3 +NX2)6H1 +D5R)GJP +S9X)PJ7 +D1X)Y6X +GZC)19D +8M3)QQN +YNN)PR5 +33Q)5QH +YK2)GVG +4JJ)751 +GSS)5G5 +MKF)KNV +3WM)VQH +QSX)VPC +FLS)MKY +MKF)4RZ +33Z)BXV +CC5)FPN +RJT)28R +YD5)TVW +H2K)HF1 +TKZ)1SZ +Z4Y)JBF +X76)FJW +VT4)4YN +Q44)M7H +L71)M24 +RBN)CS1 +DLL)M81 +DDZ)G8K +1ZN)Z4Y +KK9)8CH +TZR)JV4 +9Z4)GY3 +596)BB7 +WG5)JYP +RDH)VMD +JNB)C5K +XF4)GGP +SKV)NJS +FBN)71F +9J8)1KP +NBL)9Z4 +6Z2)L8W +16Y)N26 +DC8)4WT +FT8)4JW +97D)8LY +NDH)QSN +VQH)LR9 +PMX)3Y2 +T3Q)Q46 +M6G)XSB +8LK)51G +J12)T7D +FHX)XVM +77J)5HS +9WM)RQB +HKP)CSK +CGH)RBZ +9TL)QSX +KCC)H7C +SDJ)SWG +SY4)YF8 +2FV)C9W +Z2L)PRW +W7R)WZ6 +72C)STQ +YRN)B4P +1PM)8B6 +T6Z)C93 +CRC)XZV +8MQ)RJT +J3F)CGS +238)8N9 +19X)JN8 +QXH)ZXK +6P7)X3M +ZKK)RBN +P2V)DLL +J32)3J3 +NJS)8P1 +6WP)MGZ +NW8)B3V +9J8)Q5J +FKP)TQV +P99)C3Q +M28)KS4 +98N)9WM +CJ9)R5K +DCX)J12 +2V5)QXD +JTY)SXT +HW5)XPP +2VY)W35 +1KP)G2Y +747)1DQ +BR6)CGH +J7T)MFX +FJW)HLY +MGV)4T5 +PMC)TKZ +S1M)7B9 +KXK)5W2 +GZV)DLW +YF8)72C +1L8)7FL +JB4)98B +DCW)W63 +D31)DTG +CRS)ZXJ +D56)CJ9 +43B)WJG +WTG)YZ3 +KPT)2V5 +G2Y)HFN +R9Z)3K4 +7KN)51S +JN8)NC9 +2JH)697 +55T)73L +3R1)5WX +5SB)GVY +CX9)YNN +P38)CZC +1PW)SN6 +2JF)G9T +QRW)9MD +LVF)MGV +RFM)NDH diff --git a/2019/src/bin/day6.rs b/2019/src/bin/day6.rs new file mode 100644 index 0000000..b1622b2 --- /dev/null +++ b/2019/src/bin/day6.rs @@ -0,0 +1,105 @@ +use std::{fs, io}; + +#[derive(Debug, Eq, PartialEq)] +struct Orbit<'a>(&'a str, &'a str); + +#[derive(Debug, Eq, PartialEq)] +struct Node<'a> { + name: &'a str, + parent: Option, // Only COM should have None at the end +} + +fn main() -> io::Result<()> { + let input = fs::read_to_string("input/day6.txt")?; + let orbits = parse_input(&input); + + println!("Part 1: {}", number_of_orbits(&orbits)); + + Ok(()) +} + +fn parse_input(input: &str) -> Vec> { + input + .lines() + .map(|line| { + let mut parts = line.trim().split(')'); + Orbit(parts.next().unwrap(), parts.next().unwrap()) + }) + .collect() +} + +fn number_of_orbits(input: &[Orbit<'_>]) -> usize { + // Build the tree from the input + let mut nodes: Vec> = Vec::with_capacity(input.len()); + + // Except for the universal Center of Mass (COM), every object in space is in orbit around + // exactly one other object. + for orbit in input { + // Try to find the parent of this object + let parent_index = nodes + .iter() + .position(|node| node.name == orbit.0) + .unwrap_or_else(|| { + nodes.push(Node { + name: orbit.0, + parent: None, + }); + nodes.len() - 1 + }); + + // See if this object is already in nodes. If it is, then ensure its parent is + // set, otherwise insert it. + nodes + .iter_mut() + .find(|node| node.name == orbit.1) + .map(|node| { + if node.parent.is_none() { + node.parent = Some(parent_index); + } + }) + .unwrap_or_else(|| { + nodes.push(Node { + name: orbit.1, + parent: Some(parent_index), + }); + }); + } + + // Now traverse the node and sum the orbits of each one + (0..nodes.len()) + .map(|index| count_orbits(&nodes, index, 0)) + .sum() +} + +fn count_orbits(nodes: &[Node], node_index: usize, count: usize) -> usize { + let node = &nodes[node_index]; + if let Some(parent) = node.parent { + count_orbits(nodes, parent, count + 1) + } else { + count + } +} + +#[cfg(test)] +mod tests { + use super::*; + + const TEST_INPUT: &str = "B)C +COM)B +C)D +D)E +E)F +B)G +G)H +D)I +E)J +J)K +K)L +"; + + #[test] + fn test_number_of_orbits() { + let orbits = parse_input(TEST_INPUT); + assert_eq!(number_of_orbits(&orbits), 42); + } +}