Compare commits

...

4 commits

Author SHA1 Message Date
094d48df84
day 8 part 2 dp 2023-12-08 22:15:07 +01:00
40b252e393
day 8 part 2 multi-threaded bruteforce attempt 2023-12-08 21:28:48 +01:00
1c8b2b3179
day 8 part 2 bruteforce attempt 2023-12-08 21:28:36 +01:00
5cc33ed979
day 8 part 1 2023-12-08 08:23:22 +01:00
2 changed files with 886 additions and 0 deletions

668
inputs/day8.txt Normal file
View file

@ -0,0 +1,668 @@
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)

218
src/bin/day8.rs Normal file
View file

@ -0,0 +1,218 @@
#![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<char, Self, Error = Simple<char>> {
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<char, String, Error = Simple<char>> {
none_of([',', ')', ' '])
.repeated()
.at_least(1)
.map(|chars| chars.into_iter().collect())
}
impl Node {
fn parser() -> impl Parser<char, Self, Error = Simple<char>> {
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<String, Node>
}
impl Network {
fn parser() -> impl Parser<char, Self, Error = Simple<char>> {
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<char, (Vec<Instruction>, Network), Error = Simple<char>> {
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<Ghost<'_>> = 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(())
}