From 746349953d09bb13a53b60d42434b4d72a3158e9 Mon Sep 17 00:00:00 2001 From: Gard Spreemann Date: Fri, 8 Dec 2023 23:33:17 +0100 Subject: Day 8, part 1 --- 08/Cargo.toml | 14 + 08/input.txt | 788 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 08/src/part-1.rs | 56 ++++ 08/src/stuff.rs | 48 ++++ 08/test-1.txt | 9 + 08/test-2.txt | 5 + 6 files changed, 920 insertions(+) create mode 100644 08/Cargo.toml create mode 100644 08/input.txt create mode 100644 08/src/part-1.rs create mode 100644 08/src/stuff.rs create mode 100644 08/test-1.txt create mode 100644 08/test-2.txt diff --git a/08/Cargo.toml b/08/Cargo.toml new file mode 100644 index 0000000..56de1ce --- /dev/null +++ b/08/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "day-08" +version = "0.1.0" +edition = "2021" + +[[bin]] +name = "part-1" +path = "src/part-1.rs" + +#[[bin]] +#name = "part-2" +#path = "src/part-2.rs" + +[dependencies] diff --git a/08/input.txt b/08/input.txt new file mode 100644 index 0000000..b53187e --- /dev/null +++ b/08/input.txt @@ -0,0 +1,788 @@ +LRRLRRRLLRRLRRLRRRLRLRRLRRLRRRLRRRLRRLRLLRRLRLRRLRRLRLRLRRLRRLRRRLLRLLRRLRLRRRLRRRLLRRRLRRLRLLRRLRRRLRLLRLRLLRRRLRLRRRLLRRRLRRRLRRLLRLRLLRRLRRLLRRRLLRLLRRLRRRLRLRRRLRLRRLRLRLRRLRRLRRLLLRRRLRLRLLLRRRLLRLRRLRRRLRRLRRLRRRLRRRLRRLLRLLRRLRRRLLRRRLRLRLRRRLRRRLRRLRRLRLLRLRRLLRRLLRRRR + +LRV = (NNC, BHD) +KBR = (MLH, XGR) +BJB = (RCR, LBC) +SXL = (HTF, LTX) +BLV = (TXF, SPK) +FCH = (DMS, HVX) +GPM = (HJV, JLK) +BRQ = (BLR, BTD) +LNT = (XDS, GTJ) +CHP = (TRF, PQM) +CMF = (CLT, NBM) +HNT = (SGQ, BLP) +GXG = (JFP, JHQ) +NDD = (GTJ, XDS) +KBJ = (FXP, VBJ) +RKM = (HTT, DPG) +GCQ = (CDT, TSQ) +XQX = (CCD, TVG) +BJF = (NHQ, MPM) +SFD = (MJD, MMH) +SGQ = (LNX, BRL) +NXR = (TXD, GCF) +QJH = (FJX, NFV) +RSR = (MCM, RLH) +VBG = (QFH, SXX) +PLH = (XGJ, HTP) +LTK = (SJJ, JBB) +CPK = (TMX, NRX) +BCC = (PVV, PLM) +CGC = (MCF, HFK) +TGB = (TQQ, LRV) +PCF = (GMV, DTG) +PDB = (DPG, HTT) +RFQ = (GKM, VFF) +VKZ = (GCL, VPP) +FGL = (MDS, PGM) +KRZ = (CFT, XPM) +LSR = (GRQ, KKJ) +VKM = (GRQ, KKJ) +SKT = (NXT, KRQ) +FMB = (VBH, NFJ) +RRR = (TJF, QGN) +FHT = (XMT, RKV) +HTF = (SRB, QVD) +GTJ = (CHD, PLJ) +QSM = (CMF, TDS) +VNG = (DKC, SMV) +MNT = (BKN, BKN) +VRV = (GJM, JCG) +QBC = (CKV, LCC) +GPD = (SXD, BML) +SFR = (SVD, BDL) +PBK = (VPQ, NMC) +TJF = (XDN, RMG) +HGM = (GGH, BXS) +PJB = (TPR, VMD) +FDL = (QBC, KLN) +RXB = (BSB, NLD) +MMN = (SGQ, BLP) +BDN = (BJS, NTS) +RRG = (BLV, LPG) +MBF = (DJD, FGF) +FMK = (NDG, XHN) +CMX = (VNV, KBN) +XML = (TQJ, FCX) +TKF = (HQM, LGK) +RVF = (GFG, MQN) +FJX = (GVX, FHK) +JPQ = (STP, GLH) +GLK = (PCR, BBF) +DBR = (JFQ, JFQ) +GJG = (DXX, QLR) +DRH = (QTG, GJG) +FHS = (PHB, NJH) +JCT = (CDT, TSQ) +NDM = (LVV, GPP) +LDF = (XLT, GKX) +NNX = (PQK, DRB) +VKP = (BPF, CPC) +PCG = (FJD, MRT) +TQJ = (LMN, SHR) +CVH = (BRQ, KJK) +VJT = (SLG, XGB) +QHG = (NDG, NDG) +FRL = (GDQ, SMJ) +FTF = (JPD, DCK) +VGF = (XNN, GVN) +LSB = (NMC, VPQ) +NSC = (KPQ, PNK) +QPR = (JFP, JHQ) +CRX = (MQC, HMB) +CQM = (TXD, GCF) +MBS = (LTF, KKG) +VFG = (BPB, MHX) +CCF = (HHS, LDR) +JLB = (PBK, LSB) +GNR = (CMK, FTK) +TSA = (DJG, MFF) +BDL = (BJB, XKR) +CMN = (GDQ, SMJ) +TMR = (MCN, MBF) +FFC = (MFN, STT) +VPM = (VCH, FBB) +RNX = (RGH, SDF) +RDF = (TML, PLH) +NBM = (FLQ, RBD) +MTK = (TDM, XPV) +NFK = (SLD, FRS) +PNB = (QPT, HPC) +MGH = (NDK, KGN) +CRT = (MMB, BBM) +NDG = (JGT, JGT) +GJM = (FMB, NDP) +GPP = (VDJ, CDX) +JFP = (SDH, QFJ) +TSQ = (PQG, GXT) +CNB = (SFD, MQG) +TVN = (CNP, LCS) +XDQ = (LNT, NDD) +JCG = (NDP, FMB) +NDC = (NTH, FSJ) +KRQ = (JVD, LVS) +LMF = (KPQ, PNK) +GTP = (RJD, FCH) +XTV = (VLX, RXB) +GCL = (LJJ, TTC) +THX = (RMQ, VBK) +RJD = (DMS, HVX) +VLV = (LNT, NDD) +BRD = (HTF, LTX) +SMJ = (SKV, HXP) +DLX = (FFC, GNS) +BXS = (RSR, KFB) +KTV = (PLM, PVV) +VCH = (RCF, LXP) +LHK = (SDF, RGH) +VTK = (HNM, MMM) +TRC = (PJB, CKN) +XMX = (BLH, XCF) +VDL = (PCG, DHB) +CPC = (KDC, BFD) +KNG = (VTK, DTL) +LQX = (FGL, TSP) +HXH = (JSB, LSD) +SCS = (VTX, PLG) +DRB = (TGV, QRX) +GDN = (MQX, KPC) +DPG = (NFR, BPN) +HTD = (HGV, BSZ) +GVL = (DGJ, CHP) +PMB = (MTB, JCB) +NKT = (KBJ, JJP) +KGC = (KFR, NRT) +RTT = (XPM, CFT) +LFG = (RCB, NNX) +HTT = (BPN, NFR) +MHX = (JRL, JQB) +RXS = (HQM, LGK) +CJB = (DKD, KMJ) +CXL = (LRN, LFG) +XKR = (RCR, LBC) +BLR = (MLC, CGC) +DGJ = (PQM, TRF) +CPD = (DGJ, CHP) +DRN = (TRQ, TLH) +CFT = (TSH, PHS) +PHQ = (RMQ, VBK) +SXD = (XHC, TDX) +TLQ = (VLX, RXB) +BHF = (VNV, KBN) +PFB = (MQX, KPC) +BRL = (HPN, SRJ) +XFL = (KNG, KTS) +RMX = (VBG, NTD) +HQC = (VXL, GXJ) +GHQ = (CRT, LNJ) +TXD = (VGF, VFJ) +MQG = (MJD, MMH) +HPN = (RST, VDD) +QNL = (TKF, RXS) +NGJ = (NFP, RCP) +NFB = (MHX, BPB) +GNF = (GFG, MQN) +TSP = (PGM, MDS) +QTG = (QLR, DXX) +TXF = (FQQ, HBQ) +BPB = (JQB, JRL) +NHS = (LQS, NDX) +MVV = (PBD, PBD) +GKV = (GXG, QPR) +CNX = (FTV, KFQ) +HQS = (VSX, FTS) +JSB = (MDD, SKT) +FDX = (NTS, BJS) +SNB = (VTX, PLG) +TDS = (CLT, NBM) +LKJ = (JPX, RPQ) +KGN = (SCQ, FLR) +HBD = (SXD, BML) +DSR = (MRC, BFN) +GVN = (QHD, XSJ) +MJB = (NDC, SFH) +RQS = (KND, HGR) +NFG = (NJH, PHB) +PHF = (TFN, NQQ) +MHQ = (THL, VHQ) +KXG = (FFC, GNS) +RTL = (NFK, NTM) +NJH = (VXB, DNR) +TSH = (TRJ, QTP) +STL = (GTL, HJC) +JQL = (LRN, LFG) +SHT = (BSG, PNB) +VCL = (FPP, SQP) +GKX = (LSM, GQF) +TCN = (BLV, LPG) +PLR = (JNJ, FPR) +HBG = (NBP, VKT) +RPQ = (LVH, RDF) +JTA = (TKF, RXS) +XPV = (DQM, JJD) +GJC = (LBN, HFF) +SLG = (TKM, FQH) +HFK = (VJT, DNQ) +TML = (XGJ, HTP) +VCM = (DFX, KBR) +XHC = (KHD, PHF) +JXJ = (VKJ, CVH) +NFJ = (FXL, CJB) +TDN = (JCN, SQS) +SST = (TDS, CMF) +HLN = (QKM, CCF) +MSV = (HDC, KSX) +VPG = (NBD, GTP) +XCF = (CPD, GVL) +PQK = (QRX, TGV) +FVN = (HSJ, RXR) +JBB = (PGR, HTL) +VLX = (NLD, BSB) +BMS = (HJT, PFP) +VVV = (DRH, RGF) +GTL = (KCS, MHQ) +BFD = (DTF, VTN) +DKC = (TXT, JKR) +QRB = (LQS, NDX) +NDL = (LHK, RNX) +XQQ = (LLX, QGR) +FHK = (MMN, HNT) +SNV = (KJP, BPC) +QGK = (DHB, PCG) +HVG = (KXG, DLX) +PNK = (XQD, MPP) +BFN = (PVP, NVL) +HKN = (DLL, FVN) +XGR = (QLP, TXM) +KCS = (VHQ, THL) +RCR = (SXL, BRD) +KHC = (KSX, HDC) +HXN = (RRR, JGK) +MPB = (PLR, TLV) +PRX = (RGF, DRH) +NGN = (GRC, NCT) +QRG = (PHQ, THX) +MFR = (GXJ, VXL) +QQX = (JTL, HQH) +DBN = (HJT, PFP) +LVV = (VDJ, CDX) +JVD = (RFQ, NRR) +JTL = (CRX, LRM) +FJQ = (CMX, BHF) +LNX = (HPN, SRJ) +XQD = (MLS, XPH) +MQN = (CJM, RQS) +NRT = (FNF, VCX) +CGJ = (QMK, MPB) +KRM = (GBJ, FPG) +MPP = (MLS, XPH) +BKN = (GBB, VXV) +JCB = (CNX, RTS) +CJM = (HGR, KND) +DDR = (CPK, QFP) +MGC = (FFV, QJQ) +GJP = (NHQ, NHQ) +QVD = (DPP, FQP) +RBC = (VTV, QTV) +KND = (KSV, JLB) +GGH = (RSR, KFB) +SQB = (XFL, HMP) +DJG = (LHG, GND) +DTF = (TKJ, XPL) +RXR = (VCT, SFR) +LLH = (VLV, XDQ) +SDF = (GCQ, JCT) +BLA = (XPM, CFT) +RLF = (XRH, KFF) +VDD = (DRN, GHB) +MQC = (SHQ, PCV) +VBK = (VHD, FXH) +KJK = (BLR, BTD) +JQB = (JQL, CXL) +FCX = (LMN, SHR) +MQX = (MBS, MQV) +NHQ = (RTT, RTT) +QNG = (DLX, KXG) +FTS = (KQN, GXH) +JXP = (FJQ, LVX) +JMD = (BLH, XCF) +FQQ = (SDB, GNR) +GFH = (LTK, KTT) +HDC = (NNM, HGM) +BTD = (MLC, CGC) +FLQ = (BQS, NBK) +DXP = (MCN, MBF) +QGR = (NXR, CQM) +MLS = (LSH, BJM) +FGV = (DXP, TMR) +RLR = (NFV, FJX) +NNC = (MVV, MVV) +MGK = (CSG, NMV) +FFV = (LSF, QBP) +NCT = (GNF, RVF) +SLD = (XFS, HXH) +GFR = (GPM, GLD) +CXT = (GTP, NBD) +KKG = (LVB, FKX) +VLL = (TVN, JQV) +KFQ = (CGX, NKT) +RMG = (KRM, MKC) +QFL = (TQQ, LRV) +FKX = (SMN, LDH) +QPT = (FCJ, VCM) +XPH = (LSH, BJM) +DHB = (MRT, FJD) +NBK = (QJM, GNN) +DLJ = (MNT, PCS) +TMK = (KJP, BPC) +HQM = (CMB, BVP) +TGV = (QQX, DSP) +DSP = (HQH, JTL) +DLL = (RXR, HSJ) +JLJ = (SNV, TMK) +MMM = (GJP, BJF) +BMQ = (VHX, VRV) +MKC = (GBJ, FPG) +CPL = (QBC, KLN) +SVD = (XKR, BJB) +GXH = (CPQ, BNV) +VTS = (DCK, JPD) +CNJ = (PCF, DFJ) +TDX = (PHF, KHD) +LJJ = (MSV, KHC) +DXX = (LKJ, STN) +KFF = (CNJ, XBC) +RLH = (LQX, RNJ) +LHG = (PSH, SJM) +HSJ = (VCT, SFR) +DFV = (PCR, BBF) +MLC = (HFK, MCF) +JPK = (DPD, JXP) +LVS = (RFQ, NRR) +SMN = (QCL, MQK) +RQL = (PMB, NDT) +GNS = (MFN, STT) +GDD = (DLL, FVN) +GBJ = (CNS, MJB) +LKM = (VCH, FBB) +SPK = (HBQ, FQQ) +KHD = (TFN, NQQ) +GRC = (GNF, RVF) +MLH = (TXM, QLP) +QTQ = (HFF, LBN) +LHS = (DXC, RQL) +QTV = (BMQ, KHB) +QLX = (FHT, RLL) +VKT = (BVK, HHF) +CKV = (QLD, QLD) +LBC = (SXL, BRD) +KFR = (FNF, VCX) +HDT = (BSG, PNB) +SKQ = (NDV, VKN) +TQQ = (NNC, BHD) +XHN = (JGT, VKZ) +PNS = (FTF, VTS) +QBP = (VPG, CXT) +BSG = (HPC, QPT) +GLD = (JLK, HJV) +LTF = (LVB, FKX) +RMQ = (VHD, FXH) +VXL = (GDD, HKN) +GDC = (QSM, SST) +CSS = (NDV, VKN) +BBF = (KBH, THK) +PLM = (GJC, QTQ) +PLX = (KGN, NDK) +NVZ = (RXS, TKF) +TPR = (PVJ, CVJ) +QGN = (RMG, XDN) +SQP = (LQQ, HDS) +QTT = (XRH, KFF) +PGM = (XQX, FQM) +KJP = (CSB, QHR) +PSM = (VKM, LSR) +NBA = (VPP, GCL) +CSB = (LDF, HXG) +XTH = (SGX, NLP) +STP = (CMN, FRL) +HGR = (JLB, KSV) +MRT = (XTH, SML) +DFJ = (GMV, DTG) +RBD = (BQS, NBK) +TCC = (FFV, QJQ) +PHS = (QTP, TRJ) +TQH = (LTK, KTT) +QTP = (XMX, JMD) +HFF = (PFB, GDN) +GXT = (LCT, NHC) +LMP = (RNX, LHK) +KQN = (CPQ, BNV) +JRL = (JQL, CXL) +VSX = (GXH, KQN) +XNN = (QHD, XSJ) +HPC = (VCM, FCJ) +PGJ = (QNL, QNL) +TLH = (FHS, NFG) +MMH = (RLF, QTT) +JXR = (JQV, TVN) +LDH = (MQK, QCL) +SQS = (CGJ, CFS) +VNV = (RBC, MLK) +BML = (TDX, XHC) +MGL = (QXC, LLH) +FXH = (GDC, NTV) +NLD = (MGH, PLX) +HJV = (FPL, RTL) +PLG = (DDR, PNN) +KPH = (TMR, DXP) +LRM = (HMB, MQC) +TRT = (NPC, GFR) +HTL = (SPT, QLX) +VPP = (TTC, LJJ) +FPG = (CNS, MJB) +KJN = (JGK, RRR) +PVV = (QTQ, GJC) +VPQ = (NHS, QRB) +DCC = (LHS, DGL) +KBH = (QJH, RLR) +PFP = (BDN, FDX) +KSV = (LSB, PBK) +NTS = (SCS, SNB) +HTP = (QMM, VCL) +BPC = (QHR, CSB) +XPM = (PHS, TSH) +PQM = (RKM, PDB) +DFC = (CVH, VKJ) +HMP = (KTS, KNG) +PHB = (VXB, DNR) +MTB = (CNX, RTS) +MJD = (QTT, RLF) +HNM = (GJP, GJP) +QLP = (TCN, RRG) +JPD = (VHR, PSM) +KBN = (MLK, RBC) +LDR = (SHT, HDT) +NTH = (QNG, HVG) +RCP = (HBD, GPD) +SGX = (HXN, KJN) +XDK = (JFQ, MDQ) +LLQ = (VSX, FTS) +TXT = (QFL, TGB) +NRR = (VFF, GKM) +DGL = (DXC, RQL) +KKJ = (MGC, TCC) +QJQ = (QBP, LSF) +CPQ = (CSS, SKQ) +TFN = (VDL, QGK) +TVK = (SNV, TMK) +HJC = (KCS, MHQ) +VKJ = (KJK, BRQ) +HQH = (CRX, LRM) +PVJ = (VVV, PRX) +HHS = (SHT, HDT) +XDN = (MKC, KRM) +XGB = (FQH, TKM) +HXG = (XLT, GKX) +NMC = (QRB, NHS) +MFF = (GND, LHG) +JGT = (VPP, GCL) +LLX = (NXR, CQM) +BVK = (GKV, VMV) +NDV = (THG, THG) +CKN = (TPR, VMD) +FTK = (KQG, GHQ) +SGZ = (VXV, GBB) +KFN = (PJB, CKN) +DQM = (HBG, KTB) +LNJ = (MMB, BBM) +JJP = (VBJ, FXP) +XFS = (JSB, LSD) +GBB = (XTV, TLQ) +BJS = (SNB, SCS) +JNJ = (QHG, QHG) +TRJ = (XMX, JMD) +TVG = (HDH, STL) +AAA = (MRC, BFN) +BNV = (CSS, SKQ) +JHQ = (QFJ, SDH) +BVX = (NFB, VFG) +NDP = (VBH, NFJ) +NTD = (QFH, SXX) +NVL = (QRG, HTG) +VDP = (GRC, NCT) +MLK = (VTV, QTV) +JPX = (RDF, LVH) +PBD = (HGV, HGV) +RCF = (DFC, JXJ) +CVJ = (VVV, PRX) +DTL = (HNM, MMM) +VCX = (MFR, HQC) +VFF = (DFV, GLK) +MQK = (TVK, JLJ) +TKJ = (XFH, MTS) +SBX = (KMD, NDM) +VXV = (TLQ, XTV) +GRQ = (MGC, TCC) +NTV = (QSM, SST) +LVX = (BHF, CMX) +QXC = (XDQ, VLV) +QCL = (JLJ, TVK) +QXA = (GBB, VXV) +RKV = (PQQ, PQH) +QLD = (MNT, MNT) +LBQ = (TQJ, FCX) +NXT = (JVD, LVS) +CPX = (VFG, NFB) +KQG = (LNJ, CRT) +GHB = (TRQ, TLH) +TRF = (PDB, RKM) +SHQ = (JPQ, RKS) +NBD = (FCH, RJD) +CSG = (JPK, CPV) +DNR = (MGK, DPF) +TMX = (MGL, HBN) +KMD = (LVV, GPP) +TLV = (JNJ, FPR) +MCN = (DJD, FGF) +BSZ = (MFF, DJG) +GMV = (RSQ, HLN) +LCT = (KTV, BCC) +KPQ = (MPP, XQD) +VBH = (FXL, CJB) +NDK = (SCQ, FLR) +VTX = (PNN, DDR) +HGV = (DJG, MFF) +TRG = (BVG, SQB) +THG = (PGJ, PGJ) +SDB = (CMK, FTK) +NTM = (SLD, FRS) +KMJ = (PBM, SXJ) +MTM = (LLQ, HQS) +NFP = (GPD, HBD) +TKM = (NCC, TRG) +XMT = (PQQ, PQH) +THL = (TRC, KFN) +CPV = (JXP, DPD) +GVX = (HNT, MMN) +XSJ = (CJT, RMX) +HMB = (PCV, SHQ) +SRJ = (VDD, RST) +STT = (KGV, VNG) +LSH = (KPK, MTK) +CHD = (XQQ, CTF) +NFV = (GVX, FHK) +XDS = (PLJ, CHD) +BVP = (VKC, PNS) +VFJ = (GVN, XNN) +TSC = (JCN, SQS) +RGF = (GJG, QTG) +VMD = (PVJ, CVJ) +GPR = (GCB, VKP) +PNN = (CPK, QFP) +DKD = (PBM, SXJ) +FSJ = (QNG, HVG) +KGV = (SMV, DKC) +LSM = (DBR, DBR) +QLR = (LKJ, STN) +FLR = (GPR, HVJ) +NHC = (BCC, KTV) +LQS = (XML, LBQ) +NNM = (GGH, BXS) +FNF = (HQC, MFR) +MTS = (FTG, CNB) +FBB = (RCF, LXP) +JGK = (QGN, TJF) +SHR = (LQR, SBX) +QHD = (CJT, RMX) +LXF = (NRT, KFR) +PGR = (SPT, QLX) +PLJ = (CTF, XQQ) +DPF = (CSG, NMV) +MDQ = (DSR, ZZZ) +NLP = (HXN, KJN) +SJJ = (HTL, PGR) +GDQ = (SKV, HXP) +BPF = (KDC, BFD) +SXJ = (LKM, VPM) +VDJ = (NGJ, TCK) +JCN = (CGJ, CFS) +BJM = (KPK, MTK) +XLT = (LSM, GQF) +KHB = (VRV, VHX) +RKS = (STP, GLH) +CLT = (FLQ, RBD) +MMB = (FDL, CPL) +HVJ = (GCB, VKP) +LTX = (SRB, QVD) +KLN = (CKV, LCC) +PCS = (BKN, SGZ) +HDH = (HJC, GTL) +VBJ = (MTM, MHR) +QMK = (PLR, TLV) +THK = (QJH, RLR) +VHX = (JCG, GJM) +GKM = (DFV, GLK) +FXL = (KMJ, DKD) +LSD = (SKT, MDD) +FGF = (VDP, NGN) +TSL = (DGL, LHS) +VCT = (BDL, SVD) +MDD = (KRQ, NXT) +SML = (SGX, NLP) +FTG = (SFD, MQG) +QMM = (SQP, FPP) +TXM = (TCN, RRG) +LVB = (LDH, SMN) +KSX = (HGM, NNM) +LSF = (VPG, CXT) +LQQ = (LMF, NSC) +FRS = (XFS, HXH) +KTB = (NBP, VKT) +JJD = (HBG, KTB) +DFX = (XGR, MLH) +BBM = (CPL, FDL) +PQQ = (JXR, VLL) +DXC = (NDT, PMB) +KTT = (JBB, SJJ) +SFH = (NTH, FSJ) +XPL = (XFH, MTS) +CCD = (STL, HDH) +RTS = (KFQ, FTV) +MPM = (RTT, KRZ) +XBC = (PCF, DFJ) +HVX = (BMS, DBN) +SDH = (KGC, LXF) +HHF = (VMV, GKV) +FQM = (CCD, TVG) +LCC = (QLD, DLJ) +GCF = (VFJ, VGF) +HTG = (PHQ, THX) +CMK = (KQG, GHQ) +NFR = (GJX, TRT) +DTG = (HLN, RSQ) +VXB = (MGK, DPF) +NCC = (SQB, BVG) +CFS = (MPB, QMK) +VKN = (THG, BBV) +PQH = (VLL, JXR) +KDC = (DTF, VTN) +CDT = (PQG, GXT) +HVQ = (QNL, NVZ) +KTS = (VTK, DTL) +FCJ = (KBR, DFX) +CDX = (NGJ, TCK) +DCK = (VHR, PSM) +RNJ = (FGL, TSP) +NDX = (XML, LBQ) +DPD = (LVX, FJQ) +CGX = (KBJ, JJP) +TCK = (NFP, RCP) +JFQ = (DSR, DSR) +PCV = (RKS, JPQ) +HBQ = (GNR, SDB) +PSH = (FGV, KPH) +MHR = (HQS, LLQ) +SCQ = (HVJ, GPR) +SPT = (FHT, RLL) +GJX = (NPC, GFR) +CTF = (QGR, LLX) +LCS = (LMP, NDL) +RGH = (GCQ, JCT) +BBV = (PGJ, HVQ) +KFB = (MCM, RLH) +VHR = (VKM, LSR) +FJD = (XTH, SML) +FQH = (TRG, NCC) +NPC = (GPM, GLD) +DJD = (NGN, VDP) +XRH = (XBC, CNJ) +LMN = (LQR, SBX) +QFP = (NRX, TMX) +KPC = (MBS, MQV) +NMV = (CPV, JPK) +LBN = (GDN, PFB) +GCB = (BPF, CPC) +MDS = (FQM, XQX) +MRC = (NVL, PVP) +GFG = (RQS, CJM) +MCF = (DNQ, VJT) +VHQ = (KFN, TRC) +XFH = (FTG, CNB) +SRB = (FQP, DPP) +NBP = (HHF, BVK) +BQS = (GNN, QJM) +NDT = (MTB, JCB) +LPG = (SPK, TXF) +RST = (GHB, DRN) +HBN = (QXC, LLH) +LGK = (CMB, BVP) +QFJ = (KGC, LXF) +TTC = (KHC, MSV) +QHR = (LDF, HXG) +VKC = (VTS, FTF) +FTV = (CGX, NKT) +PCR = (THK, KBH) +NRX = (MGL, HBN) +SKV = (TQH, GFH) +FPR = (QHG, FMK) +PQG = (LCT, NHC) +BHD = (MVV, HNR) +XGJ = (VCL, QMM) +ZZZ = (BFN, MRC) +BLH = (GVL, CPD) +HJT = (BDN, FDX) +PBM = (LKM, VPM) +TRQ = (FHS, NFG) +JKR = (TGB, QFL) +JQV = (LCS, CNP) +SXX = (DCC, TSL) +CMB = (PNS, VKC) +MCM = (RNJ, LQX) +GLH = (FRL, CMN) +DNQ = (SLG, XGB) +FPP = (HDS, LQQ) +DMS = (BMS, DBN) +CNS = (SFH, NDC) +VTV = (KHB, BMQ) +HNR = (PBD, HTD) +GNN = (CPX, BVX) +KPK = (TDM, XPV) +GXJ = (GDD, HKN) +MFN = (VNG, KGV) +BVG = (XFL, HMP) +QRX = (QQX, DSP) +VTN = (XPL, TKJ) +QFH = (TSL, DCC) +GND = (PSH, SJM) +LVH = (PLH, TML) +QJM = (CPX, BVX) +NQQ = (VDL, QGK) +LQR = (KMD, NDM) +HXP = (TQH, GFH) +RSQ = (QKM, CCF) +PVP = (QRG, HTG) +RCB = (DRB, PQK) +SJM = (KPH, FGV) +CNP = (NDL, LMP) +LRN = (NNX, RCB) +SMV = (JKR, TXT) +HDS = (NSC, LMF) +VHD = (NTV, GDC) +TDM = (DQM, JJD) +BLP = (BRL, LNX) +JLK = (FPL, RTL) +FPL = (NTM, NFK) +FXP = (MTM, MHR) +LXP = (DFC, JXJ) +GQF = (DBR, XDK) +QKM = (HHS, LDR) +STN = (RPQ, JPX) +BSB = (PLX, MGH) +DPP = (TDN, TSC) +VMV = (QPR, GXG) +FQP = (TDN, TSC) +BPN = (GJX, TRT) +RLL = (XMT, RKV) +CJT = (VBG, NTD) +MQV = (LTF, KKG) diff --git a/08/src/part-1.rs b/08/src/part-1.rs new file mode 100644 index 0000000..bdfb409 --- /dev/null +++ b/08/src/part-1.rs @@ -0,0 +1,56 @@ +mod stuff; + +use std::collections::{HashMap}; + +use crate::stuff::{ascii_to_u64, is_all_ascii_ws, read_helper, Direction, Node}; + +pub const START: Node = [b'A', b'A', b'A']; +pub const FINISH: Node = [b'Z', b'Z', b'Z']; + + + +fn main() { + let mut stdin = std::io::stdin().lock(); + + let mut buf: Vec = Vec::new(); + + let num_bytes = read_helper(&mut stdin, &mut buf, b'\n').expect("IO error"); + if num_bytes == 0 { panic!("Malformed input"); } + let instructions: Vec = (& buf).into_iter() + .map(|& c| Direction::try_from(c).expect("Malformed input")) + .collect(); + + let num_bytes = read_helper(&mut stdin, &mut buf, b'\n').expect("IO error"); + assert!(is_all_ascii_ws(& buf)); + + let mut nodes: HashMap = HashMap::new(); + + loop { + let num_bytes = read_helper(&mut stdin, &mut buf, b'=').expect("IO error"); + if num_bytes == 0 { break; } + let node: Node = core::array::from_fn(|i| buf[i]); + + let num_bytes = read_helper(&mut stdin, &mut buf, b',').expect("IO error"); + if num_bytes == 0 { panic!("Malformed input"); } + let node_l: Node = core::array::from_fn(|i| buf[2+i]); + + let num_bytes = read_helper(&mut stdin, &mut buf, b'\n').expect("IO error"); + if num_bytes == 0 { panic!("Malformed input"); } + let node_r: Node = core::array::from_fn(|i| buf[1+i]); + + nodes.insert(node, (node_l, node_r)); + } + + let mut node: Node = START; + for (i, instruction) in instructions.into_iter().cycle().enumerate() { + if node == FINISH { + println!("{}", i); + break; + } + let (left, right) = nodes.get(& node).expect("Non-existent node"); + match instruction { + Direction::L => { node = *left; }, + Direction::R => { node = *right; } + } + } +} diff --git a/08/src/stuff.rs b/08/src/stuff.rs new file mode 100644 index 0000000..835c65e --- /dev/null +++ b/08/src/stuff.rs @@ -0,0 +1,48 @@ +use std::io::{BufRead}; + +pub fn ascii_to_u64(s: & [u8]) -> u64 { + #[cfg(debug_assertions)] + { + assert!(s.into_iter().all(|& c| c.is_ascii_digit()), "Not an ASCII base-10 number"); + } + + // SAFETY: AoC is ASCII-only. + unsafe { std::str::from_utf8_unchecked(s) }.parse().unwrap() +} + +pub fn is_all_ascii_ws<'a, I: IntoIterator>(s: I) -> bool { + s.into_iter().all(|& c| c.is_ascii_whitespace()) +} + +pub fn read_helper<'a, 'b, R: BufRead>(r: &'a mut R, buf: &'b mut Vec, token: u8) -> std::io::Result { + buf.clear(); + let num_bytes = r.read_until(token, buf)?; + if buf.last() == Some(& token) { buf.pop(); } + Ok(num_bytes) +} + +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +pub enum Direction { + L, R +} + +impl TryFrom for Direction { + type Error = &'static str; + + fn try_from(c: u8) -> Result { + match c { + b'L' => Ok(Self::L), + b'R' => Ok(Self::R), + _ => Err("ASCII character not a valid direction") + } + } +} + +pub type Node = [u8; 3]; + + +#[cfg(test)] +mod tests { + use super::*; + +} diff --git a/08/test-1.txt b/08/test-1.txt new file mode 100644 index 0000000..9029a1b --- /dev/null +++ b/08/test-1.txt @@ -0,0 +1,9 @@ +RL + +AAA = (BBB, CCC) +BBB = (DDD, EEE) +CCC = (ZZZ, GGG) +DDD = (DDD, DDD) +EEE = (EEE, EEE) +GGG = (GGG, GGG) +ZZZ = (ZZZ, ZZZ) diff --git a/08/test-2.txt b/08/test-2.txt new file mode 100644 index 0000000..7d1b58d --- /dev/null +++ b/08/test-2.txt @@ -0,0 +1,5 @@ +LLR + +AAA = (BBB, BBB) +BBB = (AAA, ZZZ) +ZZZ = (ZZZ, ZZZ) -- cgit v1.2.3