diff --git a/advent-of-code-2023.csproj b/advent-of-code-2023.csproj
index a424841..aad724e 100644
--- a/advent-of-code-2023.csproj
+++ b/advent-of-code-2023.csproj
@@ -44,6 +44,10 @@
+
+
+
+
diff --git a/inputs/08.txt b/inputs/08.txt
new file mode 100644
index 0000000..b46a9a6
--- /dev/null
+++ b/inputs/08.txt
@@ -0,0 +1,704 @@
+LRRRLRRRLRRLRRLRLRRLRRLRRRLRRLRRRLRRRLLRRRLRRRLRRRLRLRRLRRRLRLRRRLRRRLLRLRLRRLRRLLLRRLRRLRRRLLRRRLLRRRLRLRRRLRRRLLRRLRLLRLRRRLRRLRRLRLRLRLRLRLRRRLRLRRRLLRLRRLRRRLRRRLRLRRLRLLLRLRLRLRLRLRRRLLRRLRLRLLRRRLRRLRRRLRRLRRLRRRLLRRLRLRRLRRRLRRLRLRRLRLLRRLLRLRRRLRRLRLLRRRR
+
+RHQ = (QNL, HDC)
+FVH = (LMX, SDD)
+MCR = (THP, XKJ)
+RFJ = (TVQ, HGJ)
+MLK = (KKF, MMK)
+JDL = (XXQ, BFT)
+KXN = (HFS, XFM)
+NJP = (MSB, PBD)
+KDR = (VFC, SBM)
+RKR = (MBK, RFS)
+RJB = (PQK, FHB)
+XTL = (LMG, LMF)
+QDD = (KFF, JSD)
+CFP = (VBK, XNS)
+BQX = (FFP, SKX)
+NSJ = (HNC, MLQ)
+KQQ = (LTG, TNH)
+KVN = (SSJ, LNK)
+QCT = (FQQ, LLX)
+LBB = (VMQ, THT)
+DPQ = (PGL, GTC)
+RTH = (QNQ, CMS)
+QLS = (NFV, FKX)
+FST = (DNQ, QJQ)
+MHX = (LFT, JDL)
+JLF = (CCF, JNJ)
+TQJ = (VVT, TBV)
+HSC = (LKR, GTS)
+GHV = (NFS, RNT)
+VBK = (CPT, MBX)
+HVV = (CFH, QGR)
+JMG = (LXR, NHP)
+DDJ = (LNK, SSJ)
+NKV = (HLG, TCT)
+QBG = (FHB, PQK)
+FKH = (DDS, JLK)
+TLF = (VKH, QLQ)
+NTR = (MLL, GKH)
+KFF = (MDN, HCD)
+NPF = (FCP, VLM)
+PKP = (HXS, KGH)
+DVV = (TDH, XKB)
+SNM = (BJN, SGS)
+JVC = (PKX, CGR)
+VLB = (RDM, VBP)
+RQQ = (KQQ, HHB)
+SHH = (RRP, CSQ)
+DPN = (HLR, LCK)
+MCT = (BQG, SMV)
+FNJ = (QML, TVP)
+RGK = (CTF, KTS)
+HNC = (VPX, PPR)
+JLG = (THT, VMQ)
+RJJ = (PLT, TFH)
+VRK = (CMS, QNQ)
+JGJ = (JLF, RFM)
+RMD = (BVV, XTG)
+MBB = (QTQ, MCH)
+KDN = (LMF, LMG)
+SPR = (KHB, BPG)
+TFN = (CTT, JGH)
+LXR = (VTV, GRD)
+MPX = (LSD, RDD)
+SDN = (FLL, XSG)
+RMR = (TMB, NKV)
+FJM = (STG, DLM)
+HKK = (VPV, HFQ)
+GQG = (JDL, LFT)
+SQM = (CJM, HSN)
+BFM = (LKX, LKX)
+KMH = (NDL, GNG)
+THT = (DXV, PHQ)
+XHT = (FXG, PVN)
+JCJ = (BVJ, FKM)
+MBX = (CKQ, CST)
+XPJ = (QHB, RKH)
+NLL = (KXP, RXV)
+VJD = (MBK, RFS)
+SGS = (QQB, DMG)
+FBS = (PQH, MCR)
+XFT = (FHC, PKJ)
+LXS = (GCR, FVL)
+CPC = (KFS, RTM)
+PKX = (CND, KFP)
+TKK = (XBR, NTR)
+NTJ = (QCQ, MJQ)
+DVC = (TPP, FBS)
+NVC = (DPN, CNF)
+CFG = (TRX, VFS)
+SDQ = (KMH, GFG)
+GNG = (RLH, FKJ)
+TXL = (XNP, XHF)
+FKM = (STF, BDQ)
+DDN = (NKG, CFP)
+KMB = (NKG, CFP)
+VQD = (TQJ, VGS)
+DBX = (BGX, SSX)
+QTX = (QCX, MSS)
+VMN = (SDQ, DFD)
+MJQ = (GGM, XSR)
+VGS = (TBV, VVT)
+HDC = (NNN, BNV)
+FVB = (TQS, XBQ)
+QML = (LDS, PVQ)
+GTS = (PJK, XQP)
+LLX = (QNG, RHD)
+NRG = (VFK, QHK)
+KVD = (MBB, TJD)
+FMV = (CSX, BKH)
+RDK = (NKP, JGJ)
+HFR = (DFD, SDQ)
+QLQ = (VMN, HFR)
+MVB = (JNM, DKL)
+RXQ = (MMT, DFP)
+QQP = (VFS, TRX)
+SCN = (XRD, XRD)
+SDR = (JKQ, XHC)
+VCB = (JGD, VQD)
+PPR = (KGD, DJJ)
+QVZ = (JLB, DXR)
+CMT = (JDG, CNN)
+FGX = (HRX, VLQ)
+KTS = (CPB, DMP)
+CJM = (VTX, NTJ)
+SPQ = (RGS, KKV)
+DDS = (MCT, FMS)
+LMT = (RJJ, MTR)
+NNN = (RTH, VRK)
+NHP = (GRD, VTV)
+CGX = (MMM, MJT)
+FDQ = (NHM, QTX)
+XHF = (JGM, PBC)
+QJQ = (TFJ, HKR)
+STF = (RFR, DHN)
+CVV = (LSD, RDD)
+MPR = (JVC, XMS)
+VFG = (MFV, RPC)
+DVH = (SHS, FML)
+CNF = (LCK, HLR)
+VFK = (GSH, FVB)
+HXB = (KPC, PMF)
+TRX = (VMG, LXF)
+DBP = (KQQ, HHB)
+TKQ = (RCD, RLC)
+MFT = (BNR, TFN)
+XMM = (GCR, FVL)
+DSJ = (QLS, CFJ)
+XNM = (RKJ, MGB)
+CPB = (CDM, XSL)
+BVV = (DQK, FDC)
+XVN = (VVM, NTB)
+LTB = (MBB, TJD)
+LTG = (FCK, JMG)
+JTG = (CGX, PBQ)
+MSB = (PXM, SHH)
+GHS = (XDT, RKG)
+HPN = (PMF, KPC)
+VHN = (MHX, GQG)
+PGB = (XBR, NTR)
+RHD = (NFR, XRV)
+DKL = (CDJ, MPR)
+PVN = (LSN, RRQ)
+VFC = (QXB, RTX)
+HFQ = (MCC, QVB)
+MGB = (RGN, TGP)
+JDD = (KVB, GGL)
+GRB = (FCC, GHR)
+NLC = (NJC, JJL)
+FQM = (MSB, PBD)
+VSN = (BPD, FKN)
+RFS = (GKT, TQQ)
+XSG = (RKS, RRV)
+CXS = (SHB, XDD)
+MKN = (JNQ, SDN)
+PXM = (RRP, CSQ)
+JNQ = (XSG, FLL)
+NCP = (HPV, KKX)
+NKS = (PJH, XPT)
+PGL = (VGD, VGD)
+SDD = (LRG, FRT)
+JKV = (XVS, KKR)
+LXF = (BFM, PSF)
+XBR = (GKH, MLL)
+DQK = (RSF, STP)
+QLR = (DXR, JLB)
+DQD = (LCC, XFT)
+CST = (VFG, NRV)
+SNR = (BPG, KHB)
+GKH = (BNJ, NRL)
+XTG = (FDC, DQK)
+PBC = (JFV, VHN)
+FRT = (SXR, CTX)
+TTQ = (MGB, RKJ)
+TKJ = (HHM, RTD)
+LLQ = (RNT, NFS)
+QGZ = (NQV, CCP)
+GCN = (CSX, BKH)
+SSM = (RCF, VNG)
+XRT = (DLB, BJB)
+BVJ = (STF, BDQ)
+QXM = (CSK, SDR)
+QJM = (DBP, RQQ)
+VVM = (KDD, HDN)
+CTX = (JVG, XCN)
+XCM = (KXN, KCQ)
+FDC = (RSF, STP)
+KFS = (KMF, XSS)
+RVN = (GDL, GHS)
+JXZ = (RMD, SMQ)
+SXF = (VBP, RDM)
+JCS = (RQF, QFL)
+CSX = (RXD, LSC)
+TXS = (GBQ, JHK)
+RQF = (MBC, SQM)
+QXB = (NXK, DFN)
+PKJ = (BSB, NDP)
+VMQ = (DXV, PHQ)
+HLG = (NCP, KBQ)
+CSQ = (LJP, BGN)
+MMT = (MVB, GHX)
+KXG = (XCF, HKK)
+FBH = (XFT, LCC)
+SQG = (LTB, KVD)
+VMG = (BFM, PSF)
+FFP = (SSF, QJM)
+KVF = (JCS, GMR)
+HXS = (RLR, NPQ)
+PVM = (BMM, PTQ)
+JFD = (DLB, BJB)
+FTD = (BMP, XXL)
+JLK = (FMS, MCT)
+BGN = (JTG, NCV)
+KGH = (NPQ, RLR)
+QFL = (MBC, SQM)
+XNP = (JGM, PBC)
+DHN = (SPR, SNR)
+LJP = (JTG, NCV)
+KKX = (PKP, GTB)
+KKR = (KKC, SNM)
+DBG = (LKR, GTS)
+RCN = (FQQ, LLX)
+BKH = (RXD, LSC)
+HCD = (KDR, LGD)
+KVB = (JLS, TMH)
+SPC = (SXF, VLB)
+NKG = (XNS, VBK)
+FNN = (RMB, NPF)
+QNT = (SJD, KTM)
+RXK = (NKV, TMB)
+RDF = (FCJ, FST)
+XSS = (GKK, SQG)
+LRG = (SXR, CTX)
+FMS = (SMV, BQG)
+DVA = (DXR, JLB)
+JKQ = (KTP, RDF)
+LCC = (FHC, PKJ)
+LSD = (NKS, DPC)
+HHM = (BTG, NXB)
+XBQ = (QPF, TLF)
+JNM = (MPR, CDJ)
+TCB = (KXG, PJD)
+TBV = (RXK, RMR)
+KTP = (FCJ, FST)
+HSN = (VTX, NTJ)
+GDL = (XDT, RKG)
+FCJ = (DNQ, QJQ)
+DXR = (FFT, HNQ)
+RTB = (SVP, BQX)
+HLR = (DSC, SSR)
+LVL = (QML, TVP)
+KXQ = (RJP, DVV)
+BKN = (LXS, XMM)
+JHK = (FFR, QXX)
+DLS = (MKN, PTL)
+BTD = (CCP, NQV)
+JVG = (LMT, SKC)
+FFT = (LTR, PMD)
+XDD = (KRC, JBN)
+QNL = (BNV, NNN)
+LNK = (KDN, XTL)
+CMS = (DLS, VQG)
+TJD = (MCH, QTQ)
+LHR = (HNC, MLQ)
+FKS = (MPX, CVV)
+CCP = (XFP, XHT)
+QCX = (KQL, SPQ)
+KXP = (QXM, QXM)
+HHG = (FML, SHS)
+HDS = (KTS, CTF)
+BPG = (GMQ, NDD)
+QPR = (TFG, CDF)
+QCQ = (GGM, XSR)
+DFN = (KXQ, XCV)
+KRC = (FGX, XTP)
+RLR = (DDJ, KVN)
+PVX = (TGJ, XPJ)
+SVX = (MQN, QNJ)
+VQG = (PTL, MKN)
+GTM = (CFH, QGR)
+KVJ = (JLK, DDS)
+HHB = (TNH, LTG)
+BCB = (RVN, NHB)
+XTP = (HRX, VLQ)
+DJJ = (PGT, VCM)
+JQA = (CSK, SDR)
+PSR = (GLC, DQV)
+HDN = (CPC, GCF)
+VPX = (DJJ, KGD)
+BNR = (CTT, JGH)
+QRC = (XDD, SHB)
+VRX = (XNP, XHF)
+BTG = (QNS, QDL)
+RRP = (LJP, BGN)
+PFS = (RJB, QBG)
+BSB = (LKN, SBH)
+RXD = (SHQ, RHR)
+JJL = (VCK, RTB)
+RJP = (XKB, TDH)
+RCD = (DPT, FXX)
+PHQ = (PDH, KVF)
+DDL = (JSD, KFF)
+VBP = (DDN, KMB)
+GRD = (KVJ, FKH)
+CKQ = (NRV, VFG)
+KNM = (PTQ, BMM)
+XCD = (NXG, FSP)
+LGD = (VFC, SBM)
+RTD = (NXB, BTG)
+VCK = (SVP, BQX)
+GBC = (NHB, RVN)
+STP = (MQQ, KGJ)
+NKP = (RFM, JLF)
+JBN = (XTP, FGX)
+SBS = (RGK, HDS)
+RRQ = (FDM, CSB)
+FDM = (KSX, TFM)
+NXB = (QDL, QNS)
+NHB = (GHS, GDL)
+DQV = (FNJ, LVL)
+MBC = (HSN, CJM)
+QHK = (FVB, GSH)
+MDN = (KDR, LGD)
+FCP = (PBH, RHQ)
+NRL = (DXL, KXK)
+MSS = (SPQ, KQL)
+PBD = (SHH, PXM)
+JBB = (XKD, PSR)
+TVP = (PVQ, LDS)
+DKB = (TTQ, XNM)
+LSN = (FDM, CSB)
+XRD = (CQQ, CQQ)
+TGP = (MMV, BKN)
+NDD = (VCB, NSB)
+FSP = (KNM, PVM)
+CDM = (VSC, VSC)
+NXG = (PVM, KNM)
+SSF = (DBP, RQQ)
+RKJ = (TGP, RGN)
+SRF = (FJM, CPG)
+MSP = (RLC, RCD)
+BDQ = (RFR, DHN)
+DTR = (LBN, GRB)
+SHS = (SRF, QBT)
+LGT = (JHK, GBQ)
+BQG = (SBS, LHK)
+XVS = (SNM, KKC)
+TFG = (VSN, VSN)
+NTB = (HDN, KDD)
+HNQ = (PMD, LTR)
+PMF = (XCM, RPX)
+FLV = (NJP, FQM)
+PTQ = (PFS, XPF)
+XXQ = (PGB, TKK)
+PJL = (DQD, FBH)
+GHX = (JNM, DKL)
+GMR = (QFL, RQF)
+TFH = (DTR, HNK)
+KVM = (PGL, GTC)
+DPC = (XPT, PJH)
+KDD = (GCF, CPC)
+JMM = (FBH, DQD)
+XCF = (VPV, VPV)
+JLS = (HSC, DBG)
+GKT = (BKM, KSH)
+DNQ = (TFJ, HKR)
+PTA = (SMQ, RMD)
+XFV = (RKR, VJD)
+RKG = (LHR, NSJ)
+RPC = (JDD, HPK)
+HNK = (GRB, LBN)
+NSB = (VQD, JGD)
+HKR = (MQT, XHH)
+FKX = (BXX, RTN)
+BPD = (NRG, LPP)
+NJC = (RTB, VCK)
+QXX = (CKT, MRX)
+SFG = (DDL, QDD)
+FGV = (PSR, XKD)
+PJH = (NRJ, NVC)
+CPG = (STG, DLM)
+NPQ = (DDJ, KVN)
+SSR = (PCJ, HVX)
+XCV = (RJP, DVV)
+SMV = (LHK, SBS)
+PCJ = (FTK, HHN)
+RHX = (FDK, DBX)
+DXL = (XFV, PKV)
+RDM = (KMB, DDN)
+NFR = (QQP, CFG)
+VNG = (MSP, TKQ)
+QDL = (DSQ, QNT)
+HPV = (GTB, PKP)
+SBM = (QXB, RTX)
+RGQ = (SXF, VLB)
+NRV = (MFV, RPC)
+DFD = (GFG, KMH)
+RRV = (RDK, HSB)
+PBH = (QNL, HDC)
+MMV = (LXS, XMM)
+VVT = (RMR, RXK)
+RPX = (KXN, KCQ)
+LPP = (VFK, QHK)
+RLH = (NHF, JKV)
+TPP = (MCR, PQH)
+XPB = (TGJ, XPJ)
+FVL = (RNM, JCJ)
+KGJ = (HPN, HXB)
+GKK = (LTB, KVD)
+BGX = (TTS, PHD)
+BNJ = (KXK, DXL)
+KBQ = (HPV, KKX)
+NFS = (JMM, PJL)
+BXX = (JLG, LBB)
+TNH = (FCK, JMG)
+BJB = (DVC, HSL)
+KHB = (NDD, GMQ)
+SKX = (SSF, QJM)
+LTR = (PVX, XPB)
+FDK = (SSX, BGX)
+LBN = (FCC, GHR)
+STG = (DJM, RHX)
+KGD = (VCM, PGT)
+PDH = (JCS, GMR)
+MCC = (QLR, QLR)
+GKN = (TTQ, XNM)
+KKC = (SGS, BJN)
+JDG = (NPX, PKR)
+DXV = (KVF, PDH)
+PGT = (QQH, GPS)
+GGL = (JLS, TMH)
+LRH = (QGG, LQN)
+XDT = (LHR, NSJ)
+TFJ = (XHH, MQT)
+CKT = (FTD, VPL)
+QNM = (GPD, HFT)
+QQB = (HHG, DVH)
+LKX = (MQN, MQN)
+HFT = (CMT, ZZZ)
+GTC = (VGD, NLL)
+DFP = (MVB, GHX)
+NDP = (LKN, SBH)
+PJK = (VRX, TXL)
+GBQ = (QXX, FFR)
+BJN = (QQB, DMG)
+RCF = (TKQ, MSP)
+FCK = (NHP, LXR)
+HHN = (RFJ, KHX)
+XNS = (MBX, CPT)
+XFM = (SPC, RGQ)
+VTV = (FKH, KVJ)
+PXP = (NHM, QTX)
+FKN = (LPP, NRG)
+DLM = (DJM, RHX)
+BCQ = (TFG, TFG)
+RFR = (SPR, SNR)
+GPS = (NBG, MKL)
+FML = (SRF, QBT)
+JLB = (HNQ, FFT)
+DLB = (DVC, HSL)
+DMP = (CDM, XSL)
+VCM = (QQH, GPS)
+SKC = (MTR, RJJ)
+TQZ = (SDR, CSK)
+XHH = (CXS, QRC)
+KKF = (RCN, QCT)
+TDH = (BGT, TCB)
+DSC = (HVX, PCJ)
+CND = (XVN, PCV)
+QBT = (FJM, CPG)
+KCQ = (HFS, XFM)
+KFP = (PCV, XVN)
+MCH = (NLC, NNC)
+TGJ = (RKH, QHB)
+RTN = (LBB, JLG)
+XSL = (VSC, QNM)
+SMQ = (BVV, XTG)
+PQH = (XKJ, THP)
+XQP = (TXL, VRX)
+PQK = (DRQ, MLK)
+QNQ = (VQG, DLS)
+SJD = (JBB, FGV)
+XSR = (LLQ, GHV)
+CFJ = (NFV, FKX)
+RNM = (BVJ, FKM)
+FSS = (PLL, DSG)
+SSJ = (XTL, KDN)
+JGM = (VHN, JFV)
+RTM = (XSS, KMF)
+MLQ = (VPX, PPR)
+SBH = (GXD, LRH)
+ZZZ = (CNN, JDG)
+VTX = (QCQ, MJQ)
+KHX = (TVQ, HGJ)
+NPX = (FND, FLV)
+PKR = (FLV, FND)
+JGD = (VGS, TQJ)
+JGH = (DPQ, KVM)
+PFB = (DFP, MMT)
+LHK = (RGK, HDS)
+GMQ = (NSB, VCB)
+DJM = (FDK, DBX)
+JKH = (XRD, RBT)
+CGR = (KFP, CND)
+RSF = (KGJ, MQQ)
+GQT = (DDL, QDD)
+RNT = (PJL, JMM)
+PTL = (SDN, JNQ)
+NCV = (PBQ, CGX)
+KTM = (FGV, JBB)
+FBR = (CFJ, QLS)
+BFT = (PGB, TKK)
+TTS = (FDQ, PXP)
+GTB = (KGH, HXS)
+XFP = (FXG, PVN)
+SHQ = (BCQ, BCQ)
+VGD = (KXP, KXP)
+CSK = (XHC, JKQ)
+MLL = (NRL, BNJ)
+CFH = (SFG, GQT)
+BMM = (PFS, XPF)
+LKN = (LRH, GXD)
+HSL = (FBS, TPP)
+TMB = (TCT, HLG)
+CDJ = (XMS, JVC)
+FQQ = (RHD, QNG)
+TQQ = (BKM, KSH)
+PVQ = (GKN, DKB)
+QTZ = (FKN, BPD)
+DSQ = (KTM, SJD)
+TMH = (HSC, DBG)
+QHB = (FSS, HCN)
+CQQ = (SMQ, RMD)
+MBK = (GKT, TQQ)
+MMM = (RXQ, PFB)
+LSC = (SHQ, RHR)
+MQT = (CXS, QRC)
+PMD = (XPB, PVX)
+MMK = (QCT, RCN)
+TVJ = (RCF, VNG)
+FHB = (MLK, DRQ)
+QNJ = (BTD, QGZ)
+TVQ = (NXS, XCD)
+GLC = (FNJ, LVL)
+HFS = (RGQ, SPC)
+BJV = (FKS, KFM)
+SSX = (TTS, PHD)
+FXG = (LSN, RRQ)
+TQS = (TLF, QPF)
+QVB = (QLR, QVZ)
+BNV = (RTH, VRK)
+NXS = (NXG, FSP)
+KSH = (TDL, FSC)
+HPK = (KVB, GGL)
+KKV = (FNN, BRK)
+XHC = (RDF, KTP)
+LQN = (BJV, GJC)
+GPD = (CMT, CMT)
+HRX = (LGQ, TKJ)
+CSB = (KSX, TFM)
+XPT = (NRJ, NVC)
+QTQ = (NNC, NLC)
+VPV = (MCC, MCC)
+TDL = (SCN, SCN)
+CTT = (DPQ, KVM)
+JFV = (GQG, MHX)
+GFG = (GNG, NDL)
+MKL = (TVJ, SSM)
+XKB = (TCB, BGT)
+XRV = (CFG, QQP)
+CRA = (BPD, FKN)
+VSC = (GPD, GPD)
+RGS = (FNN, BRK)
+MFV = (JDD, HPK)
+GGM = (GHV, LLQ)
+FKJ = (JKV, NHF)
+GCF = (KFS, RTM)
+JSD = (MDN, HCD)
+SXR = (XCN, JVG)
+LMF = (MXP, FVH)
+AAA = (JDG, CNN)
+MJT = (RXQ, PFB)
+PJD = (XCF, HKK)
+RDD = (NKS, DPC)
+DPT = (HVV, GTM)
+NHM = (QCX, MSS)
+MQQ = (HXB, HPN)
+FLL = (RKS, RRV)
+BRK = (RMB, NPF)
+FHC = (BSB, NDP)
+RHR = (BCQ, QPR)
+NNC = (JJL, NJC)
+LKR = (XQP, PJK)
+CDF = (VSN, QTZ)
+MRX = (FTD, VPL)
+PLT = (DTR, HNK)
+VLQ = (TKJ, LGQ)
+GJC = (KFM, FKS)
+MQN = (BTD, BTD)
+GHR = (MFT, NRB)
+XXL = (FBR, DSJ)
+NHF = (XVS, KKR)
+LDS = (DKB, GKN)
+PKV = (RKR, VJD)
+KPC = (RPX, XCM)
+NRJ = (DPN, CNF)
+BGA = (CCP, NQV)
+LCK = (DSC, SSR)
+KFM = (MPX, CVV)
+RMB = (FCP, VLM)
+XKJ = (FMV, GCN)
+NBG = (SSM, TVJ)
+QPF = (VKH, QLQ)
+RKH = (HCN, FSS)
+HGJ = (XCD, NXS)
+RGN = (MMV, BKN)
+HCN = (DSG, PLL)
+RFM = (CCF, JNJ)
+DRQ = (KKF, MMK)
+XKD = (DQV, GLC)
+NXK = (KXQ, XCV)
+FTK = (RFJ, KHX)
+QQH = (MKL, NBG)
+HSB = (NKP, JGJ)
+GSH = (TQS, XBQ)
+CTF = (CPB, DMP)
+GCR = (RNM, JCJ)
+CCF = (XRT, JFD)
+DSG = (BCB, GBC)
+XCN = (SKC, LMT)
+PLL = (GBC, BCB)
+VKH = (HFR, VMN)
+PBQ = (MJT, MMM)
+PSF = (LKX, SVX)
+LMG = (MXP, FVH)
+BMP = (FBR, DSJ)
+GXD = (LQN, QGG)
+XMS = (PKX, CGR)
+RLC = (DPT, FXX)
+NRB = (BNR, TFN)
+VPL = (XXL, BMP)
+PCV = (VVM, NTB)
+QGR = (SFG, GQT)
+PHD = (PXP, FDQ)
+NQV = (XFP, XHT)
+LGQ = (RTD, HHM)
+CNN = (NPX, PKR)
+CPT = (CST, CKQ)
+BGT = (KXG, PJD)
+THP = (GCN, FMV)
+QGG = (BJV, GJC)
+KSX = (LGT, TXS)
+BKM = (TDL, FSC)
+FXX = (HVV, GTM)
+KMF = (SQG, GKK)
+FCC = (MFT, NRB)
+NDL = (FKJ, RLH)
+TFM = (TXS, LGT)
+LMX = (FRT, LRG)
+FFR = (MRX, CKT)
+KXK = (PKV, XFV)
+JNJ = (XRT, JFD)
+DMG = (HHG, DVH)
+TCT = (NCP, KBQ)
+MXP = (SDD, LMX)
+FSC = (SCN, JKH)
+VFS = (VMG, LXF)
+RBT = (CQQ, JXZ)
+RXV = (QXM, TQZ)
+RKS = (HSB, RDK)
+FND = (FQM, NJP)
+XPF = (QBG, RJB)
+LFT = (XXQ, BFT)
+HVX = (HHN, FTK)
+RTX = (NXK, DFN)
+QNG = (XRV, NFR)
+NFV = (RTN, BXX)
+KQL = (RGS, KKV)
+MTR = (TFH, PLT)
+QNS = (QNT, DSQ)
+SHB = (KRC, JBN)
+SVP = (FFP, SKX)
+VLM = (PBH, RHQ)
\ No newline at end of file
diff --git a/inputs/08a.txt b/inputs/08a.txt
new file mode 100644
index 0000000..59e2d47
--- /dev/null
+++ b/inputs/08a.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)
\ No newline at end of file
diff --git a/inputs/08b.txt b/inputs/08b.txt
new file mode 100644
index 0000000..34ffa8a
--- /dev/null
+++ b/inputs/08b.txt
@@ -0,0 +1,5 @@
+LLR
+
+AAA = (BBB, BBB)
+BBB = (AAA, ZZZ)
+ZZZ = (ZZZ, ZZZ)
\ No newline at end of file
diff --git a/inputs/08c.txt b/inputs/08c.txt
new file mode 100644
index 0000000..a8e2c98
--- /dev/null
+++ b/inputs/08c.txt
@@ -0,0 +1,10 @@
+LR
+
+11A = (11B, XXX)
+11B = (XXX, 11Z)
+11Z = (11B, XXX)
+22A = (22B, XXX)
+22B = (22C, 22C)
+22C = (22Z, 22Z)
+22Z = (22B, 22B)
+XXX = (XXX, XXX)
\ No newline at end of file
diff --git a/src/08.cs b/src/08.cs
new file mode 100644
index 0000000..2ee7142
--- /dev/null
+++ b/src/08.cs
@@ -0,0 +1,72 @@
+using Math = aoc2023.Util.Math;
+
+namespace aoc2023;
+
+internal class Day08 : Day
+{
+ private string directions = "";
+ private readonly Dictionary nodes = [];
+ internal override void Parse()
+ {
+ var lines = Util.Parsing.ReadAllLines($"{GetDay()}").ToList();
+ directions = lines[0];
+ foreach (var line in lines.Skip(2))
+ {
+ var split = line.Split(" = ");
+ var choices = split[1].Trim('(', ')').Split(", ");
+ nodes.Add(split[0], (choices[0], choices[1]));
+ }
+ }
+
+ internal override string Part1()
+ {
+ var currNode = "AAA";
+ int i;
+ for (i = 0; currNode != "ZZZ"; i++)
+ {
+ if (directions[i % directions.Length] == 'R')
+ {
+ currNode = nodes[currNode].right;
+ }
+ else
+ {
+ currNode = nodes[currNode].left;
+ }
+ }
+
+ return $"Steps from AAA to ZZZ: <+white>{i}";
+ }
+
+ internal override string Part2()
+ {
+ List currNodes = [];
+ foreach (var node in nodes)
+ {
+ if (node.Key.EndsWith('A'))
+ {
+ currNodes.Add(node.Key);
+ }
+ }
+
+ List dists = [];
+ for (int n = 0; n < currNodes.Count; n++)
+ {
+ long i;
+ for (i = 0; !currNodes[n].EndsWith('Z'); i++)
+ {
+ if (directions[(int)(i % directions.Length)] == 'R')
+ {
+ currNodes[n] = nodes[currNodes[n]].right;
+ }
+ else
+ {
+ currNodes[n] = nodes[currNodes[n]].left;
+ }
+ }
+ dists.Add(i);
+ }
+
+ long totalDist = Math.LCM([.. dists]);
+ return $"Steps before all nodes ending in A are simultaneously on a node ending in Z: <+white>{totalDist}";
+ }
+}
diff --git a/src/Util/Math.cs b/src/Util/Math.cs
index 67103d7..105edb5 100644
--- a/src/Util/Math.cs
+++ b/src/Util/Math.cs
@@ -1,12 +1,14 @@
-namespace aoc2023.Util;
+using System.Numerics;
+
+namespace aoc2023.Util;
public static class Math
{
- public static ulong GCD(ulong a, ulong b)
+ public static T GCD(T a, T b) where T : IBinaryInteger
{
while (true)
{
- if (b == 0)
+ if (b == T.Zero)
{
return a;
}
@@ -17,13 +19,13 @@ public static class Math
}
}
- public static ulong LCM(params ulong[] nums)
+ public static T LCM(params T[] nums) where T : IBinaryInteger
{
var num = nums.Length;
switch (num)
{
case 0:
- return 0;
+ return T.Zero;
case 1:
return nums[0];
}
@@ -37,7 +39,7 @@ public static class Math
return ret;
}
- private static ulong lcm(ulong a, ulong b)
+ private static T lcm(T a, T b) where T : IBinaryInteger
{
return (a * b) / GCD(a, b);
}