diff --git a/inputs/day8.txt b/inputs/day8.txt deleted file mode 100644 index 51929da..0000000 --- a/inputs/day8.txt +++ /dev/null @@ -1,668 +0,0 @@ -LRRLRRRLRRLLLRLLRRLRRLLRRRLRRLLRLRRRLRLRRLRLRRRLRLRLRRLLRLRLRRLRRRLRRRLRRRLRLRRLLLLRLLRLLRRLRRRLLLRLRRRLRLRRRLRLRRLRRRLRRRLRLRLLRRRLLRLLRLRLRLRLLRRLRRLRRRLRRLRLRLRLRLRRLRRRLLRRRLLRLLLRRRLLRRRLRRRLRRLRLRRLRLLRRLLRRLRLRLRRLRLRRLLRRRLLRRRLLRLRRRLRLRRRLRLRRRLRRRLRRLRRLRRLLRRRLRRRLLLRRRR - -RGT = (HDG, QJV) -QDM = (GPB, SXG) -DJN = (TQD, BQN) -QGG = (GGS, PTC) -FJP = (MPB, HFP) -KNB = (QHC, XBQ) -RGR = (LSQ, LJV) -HDP = (RLT, LRK) -DBQ = (KTM, MPJ) -QSG = (QVF, QVF) -JKR = (XTK, RQB) -BJH = (VKC, SML) -LRF = (NPJ, HKK) -JRD = (BQX, LGK) -HVD = (CJP, TLM) -VCG = (JMS, RJB) -PCT = (KJC, RCQ) -DRK = (PTR, FSH) -BJN = (GVD, XXN) -CXL = (FMB, NKM) -TVM = (TTX, RCG) -PTP = (KQQ, XLR) -CKX = (VKR, RDH) -TCP = (TPX, BSB) -KSC = (JFL, CHL) -DTF = (BTQ, TTQ) -GFQ = (HKK, NPJ) -BKD = (CXB, JSB) -DJB = (TMG, DDQ) -CQV = (SSX, DFT) -BPC = (KNR, CGF) -KLT = (BMF, XQC) -NLB = (DBD, VCL) -HJS = (FXK, FLB) -PSL = (PBC, XFX) -LVL = (JFD, RJD) -JMX = (CGG, RRL) -TTQ = (XVC, RCT) -NLG = (FXK, FLB) -LCD = (JSB, CXB) -HVR = (CRV, HHM) -HGV = (VCG, JDT) -LND = (TTL, QCH) -CSX = (DHS, JLB) -BRJ = (BCT, XFS) -XVN = (RDH, VKR) -HQB = (BVD, GPC) -PGP = (CFB, HQL) -NFB = (BDX, JDK) -HJK = (VVX, HTP) -KKB = (NSF, GPP) -JDV = (XJG, FDR) -VGC = (HFV, JMT) -BBG = (GTF, KTP) -HTB = (BTC, KKC) -KPL = (MXJ, MBN) -NHD = (GCT, TGP) -DMP = (KRH, SPM) -LRB = (GNP, GGB) -BGA = (MPB, HFP) -PBZ = (KXQ, CKP) -BQF = (LJC, VGC) -KKC = (DJB, MCS) -RRL = (QCK, RKN) -PDZ = (RGF, BHL) -SLA = (BCD, VJK) -XRC = (SKL, VBP) -HHM = (HSJ, NTR) -BNP = (GPP, NSF) -GHM = (HLC, KQK) -LMV = (VTS, NFQ) -QKF = (JNG, THN) -PCG = (HSQ, DMP) -CKG = (XSX, RDF) -RMV = (FQL, HJL) -LPG = (RJD, JFD) -HFJ = (VQX, LQZ) -QRF = (BCR, VSV) -JSR = (BJJ, DVJ) -TKS = (KTP, GTF) -JNG = (DJD, XLM) -XDG = (JKR, MRR) -PFB = (QLT, PBD) -NTR = (HBV, NRX) -NMN = (BDX, JDK) -MGP = (QMT, VLG) -PTA = (LSP, TXX) -CRK = (CJP, TLM) -NVL = (STQ, QFH) -VCL = (XFD, MGN) -LJM = (VJH, NXV) -GCJ = (RFS, QLN) -NSF = (TKV, LKQ) -PQN = (QHC, XBQ) -GHK = (FNT, LCX) -SFK = (FQL, HJL) -FNX = (VXK, BJN) -SSX = (MGK, KRX) -FSH = (FNB, QFL) -XFS = (BCK, CKG) -VLQ = (XJV, HLM) -JLB = (MMR, HMQ) -GXX = (HLN, SGX) -PKX = (QKF, SHQ) -VND = (CDN, VVH) -HJG = (FXR, VDR) -GGR = (QRF, JMB) -BQG = (CRV, HHM) -RFS = (BHN, MNL) -CSK = (DCX, VXG) -RSL = (XCG, JGV) -KRH = (CKX, XVN) -VBP = (NLF, TVM) -AAA = (MQQ, VHH) -BVX = (LPG, LVL) -QCG = (JKJ, CDR) -JMQ = (HLR, GGT) -NLF = (RCG, TTX) -CXB = (NLG, HJS) -VXG = (SDN, FCJ) -XFT = (GNP, GGB) -SST = (GGS, PTC) -NNK = (PTD, HPF) -RKN = (XVF, MMX) -TGP = (SSN, MRT) -TSR = (SFK, RMV) -GBL = (NKQ, KVH) -NKJ = (CGM, TCP) -KVH = (VTK, GKV) -VBB = (DXX, JVB) -KGC = (HMK, TFL) -PNL = (QLT, PBD) -TNG = (QSG, TPL) -HCV = (KVR, PKK) -RBB = (TKG, CQK) -BJJ = (GCN, PLQ) -JRF = (DHC, XCQ) -FLJ = (CKP, KXQ) -KVR = (DJS, NKJ) -HGT = (KVX, LTP) -MGN = (JDS, LNS) -FRC = (QLM, FHJ) -MBN = (TRQ, MRD) -TMG = (CTD, SFH) -TNT = (JDG, HGV) -DXP = (SSX, DFT) -VVD = (JXJ, PGP) -CHL = (XSL, SNZ) -CGS = (GFQ, LRF) -BHL = (FNQ, HFD) -XHF = (NHD, PQC) -PMH = (CNS, SVM) -VKR = (TBT, TLT) -LLK = (TQD, BQN) -LVJ = (PDD, LML) -JPB = (PRK, VCV) -HSJ = (HBV, NRX) -VJH = (DTL, BRL) -SNJ = (DXP, CQV) -HQL = (KDL, QFN) -XHM = (HVG, ZZZ) -RDX = (KTM, MPJ) -MQQ = (LSC, DGG) -TMM = (GMQ, RTL) -JKP = (LRF, GFQ) -TKG = (BDN, BDN) -FBJ = (HLR, GGT) -PTD = (LMV, QBR) -FMB = (DQT, RRH) -TTX = (LVJ, FXX) -BXL = (BTQ, TTQ) -QMV = (GND, FGG) -HFD = (TBQ, VVD) -NFQ = (PMH, DMM) -RTH = (TPG, VDP) -VHH = (DGG, LSC) -HLN = (SPP, SPP) -XQD = (PNL, PFB) -GVD = (BPC, JJG) -XRN = (DHJ, LBD) -GNP = (NRC, NRC) -JLC = (JHB, DRK) -LGK = (BSK, BRV) -BSB = (MBM, XHF) -PBJ = (FRC, RFH) -DRH = (VMR, XVK) -RDF = (BHV, NGM) -MMR = (HGD, PBJ) -RGF = (HFD, FNQ) -HTR = (RCQ, KJC) -NGM = (FJP, LCZ) -PJF = (QKF, SHQ) -BCK = (XSX, XSX) -PBD = (SXM, HTT) -VCV = (GRD, VVT) -TFL = (CCX, HQB) -THT = (NXX, TSR) -JMS = (RCF, XRC) -FKG = (XRN, PHG) -TBQ = (PGP, JXJ) -SML = (TCH, DPF) -RJB = (RCF, XRC) -KJC = (LND, JNR) -HPT = (DLM, MVH) -NKM = (DQT, RRH) -JSJ = (QFH, STQ) -KJJ = (XXT, DBC) -FGG = (HPT, GMM) -RFH = (QLM, FHJ) -TLM = (DKN, QGH) -MJV = (QSG, TPL) -DHG = (RGT, CVS) -BVB = (QLJ, SNR) -RMH = (JKR, MRR) -XFX = (SNJ, QBD) -LNS = (SFQ, GGR) -QJV = (LRB, XFT) -BHV = (FJP, FJP) -JMT = (BJM, NPC) -BDN = (JFL, JFL) -CHC = (CXL, SXC) -VBN = (VBB, CFM) -SFQ = (QRF, JMB) -XXN = (JJG, BPC) -MCS = (TMG, DDQ) -CFV = (DHG, NKS) -FXK = (JSR, GLR) -JMB = (VSV, BCR) -VVT = (LST, GCJ) -VRL = (DJN, LLK) -XLB = (FGJ, PGB) -JVC = (XXT, DBC) -VQX = (BCD, VJK) -DVJ = (GCN, PLQ) -BTQ = (RCT, XVC) -LCX = (JHK, KPL) -FSD = (NNC, XLX) -TSQ = (FKM, HFJ) -HGD = (RFH, FRC) -HJL = (JDV, LNV) -FSB = (DBD, VCL) -DCX = (SDN, FCJ) -BHH = (JPK, GVQ) -JHB = (PTR, FSH) -THP = (SXC, CXL) -LRK = (QCT, FPT) -PTC = (LMF, DLF) -DHS = (HMQ, MMR) -GDK = (SNR, QLJ) -CNJ = (JKJ, CDR) -SBM = (BCT, XFS) -GJP = (RJK, DDX) -DFT = (KRX, MGK) -XBQ = (BNP, KKB) -FGJ = (VRL, CKV) -QVF = (XTM, XTM) -VJK = (BFB, CKT) -VJX = (BKD, LCD) -KQK = (GBL, HPK) -KKX = (BDC, SKC) -CRV = (HSJ, NTR) -JNR = (QCH, TTL) -HTG = (NQK, GJP) -QLN = (MNL, BHN) -GMB = (VVX, HTP) -JDG = (JDT, VCG) -QLT = (HTT, SXM) -CLK = (VJB, SRH) -GSX = (XKX, RSL) -MQX = (RTH, LPL) -ZZZ = (VHH, MQQ) -PKK = (DJS, NKJ) -MJT = (MQX, HTF) -GLT = (TCD, HXV) -PQX = (TGQ, JBF) -VSX = (LTP, KVX) -FSV = (FKG, NLC) -FKR = (CQD, JPR) -CKT = (RDX, DBQ) -JFD = (TKS, BBG) -CNM = (TBH, XRF) -PBC = (SNJ, QBD) -MRT = (QCG, CNJ) -RCQ = (JNR, LND) -JJG = (KNR, CGF) -CFP = (JVT, GSX) -BTG = (SBM, BRJ) -BJM = (CRK, HVD) -XVK = (CDS, BQF) -BCT = (BCK, CKG) -LST = (RFS, QLN) -DNM = (VMR, XVK) -GPB = (GNX, DJV) -FDR = (FTG, LFQ) -LCZ = (HFP, MPB) -XJV = (FCP, JHV) -HQC = (TRG, SCP) -RMD = (QMV, NNH) -SRH = (FLL, QKV) -QBD = (CQV, DXP) -RRH = (NCB, TSQ) -XVF = (NFB, NMN) -QMT = (GLT, NTS) -GBX = (TKG, CQK) -MFP = (TLH, QXD) -XKG = (MHN, NLR) -HQH = (HPF, PTD) -LLR = (CNR, CRF) -LSP = (SVQ, VJX) -HSH = (LRK, RLT) -TTL = (FKR, QMF) -CFB = (KDL, QFN) -SXG = (GNX, DJV) -LTP = (KJJ, JVC) -HSQ = (SPM, KRH) -SHG = (DRH, DNM) -DHJ = (QXR, GHK) -GGK = (PRK, VCV) -TRG = (PJN, CFV) -TTF = (LJV, LSQ) -VVH = (HSH, HDP) -QXR = (FNT, LCX) -DTL = (FSV, VQV) -KVX = (JVC, KJJ) -HLR = (BTG, MKN) -XCG = (QTJ, HTQ) -LML = (JMQ, FBJ) -FMS = (XTM, VXJ) -CTD = (JHQ, XLB) -TCD = (CSK, GLS) -MRR = (RQB, XTK) -SSN = (CNJ, QCG) -VLG = (NTS, GLT) -JDT = (JMS, RJB) -TPJ = (XFX, PBC) -PDD = (FBJ, JMQ) -QLJ = (NVL, JSJ) -TVX = (JPB, GGK) -QCT = (GBX, RBB) -GMM = (DLM, MVH) -RLT = (QCT, FPT) -PFH = (HTG, DNF) -DQN = (XCQ, DHC) -XQC = (QJQ, JLC) -QCH = (FKR, QMF) -GMQ = (KPJ, RTF) -HVJ = (QMV, NNH) -VDP = (TVX, VFB) -NXV = (DTL, BRL) -JHK = (MXJ, MBN) -JPK = (GQN, MFP) -SSH = (KQK, HLC) -FNB = (GPS, LLR) -HTP = (SPG, CSX) -HHN = (DNF, HTG) -QJQ = (JHB, DRK) -PFC = (KRJ, JLV) -HFP = (JRD, MMT) -HGC = (QCJ, CXG) -KLG = (BVX, QSM) -LHG = (HLM, XJV) -CGG = (QCK, RKN) -XVC = (CGS, JKP) -FCJ = (TMM, MBL) -KLC = (CDN, VVH) -CRF = (LVG, FNX) -PBP = (GSX, JVT) -GLS = (DCX, VXG) -DJD = (QGG, SST) -BJV = (DMP, HSQ) -MNL = (JSG, LNC) -DNF = (NQK, GJP) -NLR = (SSH, GHM) -HSP = (JBF, TGQ) -NRX = (DTX, CJK) -VVX = (CSX, SPG) -LSC = (DCL, QBB) -VXJ = (FLJ, PBZ) -CDR = (NXN, NMT) -SGM = (NXV, VJH) -XSX = (BHV, BHV) -MGK = (FXG, XTG) -VPC = (SKC, BDC) -HBV = (CJK, DTX) -RQB = (PCT, HTR) -FXR = (HKP, LVP) -BRL = (FSV, VQV) -VXK = (GVD, XXN) -SDN = (MBL, TMM) -FCP = (HXD, SHG) -XTG = (KLT, SPX) -LBD = (GHK, QXR) -JHQ = (FGJ, PGB) -XXT = (KNB, PQN) -VKC = (TCH, DPF) -GQN = (QXD, TLH) -HLM = (JHV, FCP) -JDK = (TTF, RGR) -VTS = (PMH, DMM) -VMR = (CDS, BQF) -XJA = (BHL, RGF) -MMS = (NLR, MHN) -DPF = (PQX, HSP) -NNH = (FGG, GND) -JSB = (NLG, HJS) -XLR = (GMB, HJK) -RCF = (VBP, SKL) -JPD = (HTF, MQX) -CJP = (DKN, QGH) -BLC = (HGV, JDG) -FTG = (PSL, TPJ) -JDS = (SFQ, GGR) -FQL = (JDV, LNV) -JBF = (CHC, THP) -HVG = (MQQ, VHH) -LKQ = (NLX, HHX) -KRX = (FXG, XTG) -JNA = (CKP, KXQ) -JPR = (CGD, BJH) -CJK = (MSQ, HCV) -QSM = (LVL, LPG) -BQN = (PCG, BJV) -SFH = (XLB, JHQ) -XLD = (QNN, LVC) -GTF = (HTB, RQV) -BMF = (QJQ, JLC) -THN = (XLM, DJD) -VPB = (FXR, VDR) -RQX = (XQD, JDL) -LNV = (XJG, FDR) -NXN = (DSS, KMF) -QTJ = (DKR, KLG) -VSV = (KHH, FSD) -DBD = (MGN, XFD) -DHC = (PHH, HQC) -QGH = (VBN, DPJ) -NTS = (TCD, HXV) -BSK = (BQG, HVR) -MRD = (VPB, HJG) -BQX = (BSK, BRV) -BRV = (BQG, HVR) -SVM = (PKX, PJF) -KRJ = (NMC, TBX) -GTH = (HVG, HVG) -SCP = (PJN, CFV) -CGF = (VFD, GXX) -SHQ = (THN, JNG) -JVT = (XKX, RSL) -RJK = (RVD, CLK) -MKN = (SBM, BRJ) -JHV = (HXD, SHG) -TLT = (JRF, DQN) -QBR = (NFQ, VTS) -CNR = (FNX, LVG) -LVG = (BJN, VXK) -FCQ = (BHL, RGF) -JXJ = (CFB, HQL) -DJV = (BXL, DTF) -DTX = (HCV, MSQ) -JLV = (NMC, TBX) -STQ = (RMH, XDG) -NQK = (DDX, RJK) -KTP = (RQV, HTB) -RLP = (JDL, XQD) -TQD = (PCG, BJV) -GGT = (MKN, BTG) -VJB = (FLL, QKV) -JVB = (MJT, JPD) -VQV = (FKG, NLC) -FXG = (KLT, SPX) -XFD = (LNS, JDS) -NKS = (CVS, RGT) -QFL = (GPS, LLR) -CDN = (HSH, HDP) -RTL = (RTF, KPJ) -CCX = (GPC, BVD) -CXG = (THT, VVN) -GRC = (CGG, RRL) -MXJ = (TRQ, MRD) -SXM = (HQH, NNK) -LJV = (SMP, VRJ) -RJD = (TKS, BBG) -HMQ = (PBJ, HGD) -MSQ = (KVR, PKK) -GPS = (CNR, CRF) -FNT = (KPL, JHK) -HDG = (LRB, XFT) -LFQ = (PSL, TPJ) -VFD = (HLN, SGX) -SKC = (CFP, PBP) -TKV = (HHX, NLX) -GPP = (TKV, LKQ) -JSG = (PFH, HHN) -BCD = (CKT, BFB) -MPJ = (HVJ, RMD) -GCT = (MRT, SSN) -XTM = (FLJ, FLJ) -DKN = (DPJ, VBN) -SVN = (VLG, QMT) -LQZ = (VJK, BCD) -PHS = (GPB, SXG) -XCQ = (HQC, PHH) -QNN = (FCQ, FCQ) -DMM = (CNS, SVM) -DBC = (PQN, KNB) -JFL = (XSL, XSL) -MBL = (RTL, GMQ) -VTK = (MGP, SVN) -SKL = (TVM, NLF) -HXD = (DRH, DNM) -GNX = (DTF, BXL) -XLM = (SST, QGG) -QMF = (CQD, JPR) -HMK = (HQB, CCX) -MMT = (BQX, LGK) -PJN = (DHG, NKS) -DGG = (DCL, QBB) -SPX = (XQC, BMF) -MHN = (SSH, GHM) -RDH = (TLT, TBT) -NMC = (KKX, VPC) -GKV = (SVN, MGP) -XSL = (LSP, TXX) -TGQ = (THP, CHC) -TRQ = (HJG, VPB) -VHK = (KRJ, JLV) -TPX = (MBM, XHF) -QXD = (QDM, PHS) -VRJ = (GDK, BVB) -KXQ = (RLP, RQX) -CNS = (PKX, PJF) -TPG = (TVX, VFB) -PTR = (QFL, FNB) -QHC = (KKB, BNP) -CDS = (VGC, LJC) -BTC = (MCS, DJB) -NLC = (PHG, XRN) -BDC = (CFP, PBP) -FPT = (GBX, RBB) -CQD = (BJH, CGD) -XKX = (JGV, XCG) -TXX = (VJX, SVQ) -SPP = (GTH, GTH) -KTM = (HVJ, RMD) -JGV = (HTQ, QTJ) -HKP = (KLC, VND) -GLR = (DVJ, BJJ) -LMF = (LHG, VLQ) -CLG = (TFL, HMK) -KHH = (NNC, XLX) -HTQ = (KLG, DKR) -QFN = (CNM, TCT) -FLL = (TNG, MJV) -HFV = (NPC, BJM) -NPC = (HVD, CRK) -HKK = (KGC, CLG) -XRF = (PFC, VHK) -GGS = (DLF, LMF) -LVC = (FCQ, PDZ) -DXX = (MJT, JPD) -DCL = (HGT, VSX) -LNC = (HHN, PFH) -TBT = (JRF, DQN) -DKR = (QSM, BVX) -KNL = (QCJ, CXG) -TLH = (PHS, QDM) -NMT = (DSS, KMF) -HLC = (GBL, HPK) -BDX = (TTF, RGR) -HXV = (GLS, CSK) -TBH = (VHK, PFC) -QBB = (HGT, VSX) -TCH = (PQX, HSP) -QFH = (XDG, RMH) -GND = (HPT, GMM) -CVS = (QJV, HDG) -FNQ = (VVD, TBQ) -NCB = (FKM, FKM) -FHJ = (MMS, XKG) -VFB = (GGK, JPB) -RQV = (KKC, BTC) -NLX = (KNL, HGC) -TCT = (XRF, TBH) -GGB = (NRC, XLD) -JKJ = (NXN, NMT) -SPG = (DHS, JLB) -LVP = (VND, KLC) -NPJ = (KGC, CLG) -RVD = (SRH, VJB) -HTT = (NNK, HQH) -PQC = (TGP, GCT) -MPB = (MMT, JRD) -BCR = (FSD, KHH) -BHN = (LNC, JSG) -SMP = (BVB, GDK) -GPC = (NLB, FSB) -NMD = (GTH, XHM) -CGD = (SML, VKC) -CKP = (RQX, RLP) -DQT = (NCB, NCB) -KDL = (CNM, TCT) -CQK = (BDN, KSC) -NXX = (SFK, RMV) -RTF = (LJM, SGM) -KQQ = (HJK, GMB) -KMF = (BVK, BHH) -HPK = (KVH, NKQ) -PLQ = (MLH, PTP) -RCG = (LVJ, FXX) -HPF = (LMV, QBR) -TBX = (VPC, KKX) -NKQ = (VTK, GKV) -PRK = (GRD, VVT) -TPL = (QVF, FMS) -CFM = (DXX, JVB) -SGX = (SPP, NMD) -MLH = (KQQ, XLR) -NNC = (TNT, BLC) -XLX = (TNT, BLC) -MBM = (NHD, PQC) -PHH = (TRG, SCP) -QKV = (TNG, MJV) -XJG = (FTG, LFQ) -QCK = (XVF, MMX) -SVQ = (LCD, BKD) -SXC = (FMB, NKM) -RCT = (CGS, JKP) -KNR = (VFD, GXX) -FKM = (VQX, VQX) -CKV = (DJN, LLK) -DDX = (CLK, RVD) -GCN = (PTP, MLH) -BFB = (DBQ, RDX) -SNZ = (TXX, LSP) -MVH = (JMX, GRC) -HHX = (HGC, KNL) -GRD = (GCJ, LST) -SPM = (CKX, XVN) -LPL = (VDP, TPG) -CGM = (BSB, TPX) -FXX = (LML, PDD) -PGB = (CKV, VRL) -MMX = (NMN, NFB) -DJS = (TCP, CGM) -HTF = (LPL, RTH) -DSS = (BVK, BHH) -KPJ = (SGM, LJM) -DLM = (GRC, JMX) -LSQ = (SMP, VRJ) -SNR = (NVL, JSJ) -DPJ = (CFM, VBB) -DDQ = (SFH, CTD) -VVN = (NXX, TSR) -QLM = (XKG, MMS) -QCJ = (VVN, THT) -JDL = (PFB, PNL) -DLF = (LHG, VLQ) -LJC = (JMT, HFV) -GVQ = (GQN, MFP) -XTK = (HTR, PCT) -NRC = (QNN, QNN) -PHG = (DHJ, LBD) -BVD = (NLB, FSB) -VDR = (HKP, LVP) -BVK = (GVQ, JPK) -FLB = (JSR, GLR) diff --git a/src/bin/day8.rs b/src/bin/day8.rs deleted file mode 100644 index f96f690..0000000 --- a/src/bin/day8.rs +++ /dev/null @@ -1,218 +0,0 @@ -#![forbid(elided_lifetimes_in_paths, unsafe_code)] - -use aoc23::read; -use chumsky::prelude::*; -use std::collections::{HashMap, HashSet, VecDeque}; - -enum Instruction { - Left, - Right -} - -impl Instruction { - fn parser() -> impl Parser> { - choice(( - just('L').map(|_| Self::Left), - just('R').map(|_| Self::Right) - )) - } -} - -#[derive(Debug)] -struct Node { - left: String, - right: String -} - -fn parse_node_name() -> impl Parser> { - none_of([',', ')', ' ']) - .repeated() - .at_least(1) - .map(|chars| chars.into_iter().collect()) -} - -impl Node { - fn parser() -> impl Parser> { - just("(") - .ignore_then(parse_node_name()) - .then_ignore(just(", ")) - .then(parse_node_name()) - .then_ignore(just(")")) - .map(|(left, right)| Self { left, right }) - } -} - -#[derive(Debug)] -struct Network { - nodes: HashMap -} - -impl Network { - fn parser() -> impl Parser> { - parse_node_name() - .then_ignore(just(" = ")) - .then(Node::parser()) - .then_ignore(just("\n")) - .repeated() - .map(|nodes| Self { - nodes: nodes.into_iter().collect() - }) - } - - fn node(&self, node: &str) -> &Node { - self.nodes - .get(node) - .unwrap_or_else(|| panic!("Failed to get node {node:?}")) - } - - fn left(&self, node: &str) -> &str { - &self.node(node).left - } - - fn right(&self, node: &str) -> &str { - &self.node(node).right - } -} - -fn parser() -> impl Parser, Network), Error = Simple> { - Instruction::parser() - .repeated() - .at_least(1) - .then_ignore(just("\n\n")) - .then(Network::parser()) - .then_ignore(end()) -} - -#[derive(Copy, Clone, Debug)] -struct Ghost<'a> { - node: &'a str, - i: usize, - steps: u128 -} - -impl<'a> Ghost<'a> { - fn new(node: &'a str) -> Self { - Self { - node, - i: 0, - steps: 0 - } - } - - fn advance(&mut self, ghost: Ghost<'a>) { - self.node = ghost.node; - self.i = ghost.i; - self.steps += ghost.steps; - } -} - -fn main() -> anyhow::Result<()> { - let (instructions, network) = read("inputs/day8.txt", parser())?; - - // build a lookup map of left/right predecessors - let mut left_pred: HashMap<&str, Vec<&str>> = HashMap::new(); - let mut right_pred: HashMap<&str, Vec<&str>> = HashMap::new(); - for (node, next) in &network.nodes { - left_pred.entry(&next.left).or_default().push(node); - right_pred.entry(&next.right).or_default().push(node); - } - eprintln!("Built pred lookup map"); - - // build a lookup map from instruction position and node with the length to the next - // finish node - let mut dp: HashMap<(&str, usize), Ghost<'_>> = HashMap::new(); - let mut q: VecDeque<(&str, usize)> = VecDeque::new(); - for node in network - .nodes - .keys() - .map(|node| node.as_str()) - .filter(|node| node.ends_with('Z')) - { - for i in 0 .. instructions.len() { - dp.insert((node, i), Ghost { node, i, steps: 0 }); - q.push_back((node, i)); - } - } - while let Some((node, i)) = q.pop_front() { - let ghost = dp[&(node, i)]; - let i_pred = match i { - 0 => instructions.len() - 1, - i => i - 1 - }; - let pred = match instructions[i_pred] { - Instruction::Left => left_pred.get(node), - Instruction::Right => right_pred.get(node) - }; - for node_pred in pred.into_iter().flatten() { - let new = (*node_pred, i_pred); - #[allow(clippy::map_entry)] // lint is opinionated garbage - if !dp.contains_key(&new) { - dp.insert(new, Ghost { - node: ghost.node, - i: ghost.i, - steps: ghost.steps + 1 - }); - q.push_back(new); - if dp.len() % 1_000_000 == 0 { - dbg!(dp.len()); - } - } - } - if ghost.steps == 0 { - dp.remove(&(node, i)); - } - } - eprintln!("Built ghost lookup map"); - // for (key, value) in &dp { - // eprintln!("\t{key:?}\t = \t{value:?}"); - // } - - // let mut curr_node = "AAA"; - // let mut i = 0; - // let mut steps = 0_u128; - // while curr_node != "ZZZ" { - // curr_node = match instructions[i] { - // Instruction::Left => network.left(curr_node), - // Instruction::Right => network.right(curr_node) - // }; - // i = (i + 1) % instructions.len(); - // steps += 1; - // } - // println!("{steps}"); - - let mut ghosts: Vec> = network - .nodes - .keys() - .filter(|node| node.ends_with('A')) - .map(|node| Ghost::new(node)) - .collect(); - let mut progress = 0; - loop { - if ghosts[0].steps > 0 - && ghosts - .iter() - .skip(1) - .all(|ghost| ghost.steps == ghosts[0].steps) - { - println!("{}", ghosts[0].steps); - break; - } - - let (ghost_index, ghost) = ghosts - .iter() - .enumerate() - .min_by_key(|(_, ghost)| ghost.steps) - .unwrap(); - if ghost.steps - progress >= 1_000_000_000_000 { - progress = ghost.steps; - eprintln!("progress: {progress}"); - } - - // eprint!("{ghost:?}\t -> \t"); - let ghost = dp[&(ghost.node, ghost.i)]; - // eprintln!("{ghost:?}"); - ghosts[ghost_index].advance(ghost); - } - - Ok(()) -}