summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGard Spreemann <gspr@nonempty.org>2023-12-08 23:33:17 +0100
committerGard Spreemann <gspr@nonempty.org>2023-12-08 23:33:17 +0100
commit746349953d09bb13a53b60d42434b4d72a3158e9 (patch)
tree20992e7724e78c4ad636b34fa07f5b5d33ecf759
parentdb1ce6683394136e68c53dfaa3da3ab2d71f1b3f (diff)
Day 8, part 1
-rw-r--r--08/Cargo.toml14
-rw-r--r--08/input.txt788
-rw-r--r--08/src/part-1.rs56
-rw-r--r--08/src/stuff.rs48
-rw-r--r--08/test-1.txt9
-rw-r--r--08/test-2.txt5
6 files changed, 920 insertions, 0 deletions
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<u8> = 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<Direction> = (& 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<Node, (Node, Node)> = 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<Item = &'a u8>>(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<u8>, token: u8) -> std::io::Result<usize> {
+ 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<u8> for Direction {
+ type Error = &'static str;
+
+ fn try_from(c: u8) -> Result<Self, Self::Error> {
+ 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)