;; Part One ;; #+NAME: day8-imports ;; [[file:chicken-src.org::day8-imports][day8-imports]] ;; -*- geiser-scheme-implementation: chicken -*- (import (chicken irregex) (chicken sort) (chicken string) (chicken type) (chicken format)) ;; day8-imports ends here ;; #+NAME: day8-input-scm ;; [[file:chicken-src.org::day8-input-scm][day8-input-scm]] ;; -*- geiser-scheme-implementation: chicken -*- (define input " LRRLRRRLRLRLLRRLRLRLLRLRLRLLLLRRRLLRRRLRRRLRRRLLRLLRLRRLRLRLRRRLLLLRRLRLRRLRRLLRRRLRRLRLRRLRRLRRLRRLRLLRRLRRLLLLRLRLRRLLRRLLRRLRLLRLRRLRRLRRLRRRLRRLLLRRLRRRLRLRRRLLRLRRLRRRLRRLLRRRLRRLRLLRRLLRRLRRLRRRLRRLLRRLRRRLRLRLRLRLRLRRLRRLLRRRLRLRRLRRRLRLRLRLRLRLRRRLRRLRRRLLRRLRLLRRRLRRLRLLLLRRRLRRLRRRR DRM = (DLQ, BGR) PKD = (TNC, DKH) FSM = (LKS, KPG) NDS = (KGD, HNX) KQQ = (DPF, GKD) SBX = (DDL, MGH) GCV = (KMG, GLP) PCT = (JXN, XDR) KHR = (QPK, FPQ) FCK = (GLS, GGP) MKR = (XPQ, TJX) PFP = (RPR, LPS) XPC = (SSS, FRX) PTJ = (LSC, CND) GVJ = (NRL, SHV) QNF = (MBQ, GSR) TMK = (DVM, BJM) KTG = (QVG, LLX) JMK = (BKF, XDK) JQV = (DCM, RLT) VFH = (FDD, GML) XPN = (FKG, CXG) GDX = (GRV, BPP) GVP = (JLP, XNJ) TCB = (RVR, QXQ) DLP = (XDK, BKF) FQG = (RMH, QHR) XDD = (SMK, HMN) TLL = (TVV, FXX) NPT = (NGC, FQM) XQK = (PQG, QTK) DMQ = (RVS, KNQ) QKR = (SJD, PLH) XNV = (SJB, GCV) SRP = (CDK, JFK) FRP = (FFD, XPC) PVC = (XVD, MGD) DPP = (BFQ, XDD) CNV = (LQC, JJH) LLH = (CFP, BGF) XCK = (VDX, GFC) KGD = (LSF, FNK) MJA = (FXB, QVX) QLH = (KRM, KVD) QCR = (TKN, RNB) PSR = (FBL, HKJ) MGK = (BVC, HVL) PVK = (JRN, SMV) JTD = (VNS, FGJ) PMD = (HGN, NBM) DRF = (CPR, RTX) HJL = (CBR, VDR) PPB = (GDX, DXB) DVR = (LLT, GVJ) JRN = (RLD, RSL) NXM = (RBN, NVD) RLV = (FRM, FJB) SJB = (KMG, GLP) KJM = (XJH, LQX) GRB = (HHL, RGD) LQC = (BMC, XSH) NRB = (NQD, RFT) SQH = (QJT, JXX) JLX = (RJL, HHH) HVR = (XPN, JFM) FVD = (RXS, RHH) KSX = (TCB, GDK) GKJ = (TQF, HQJ) HQL = (BMR, PBX) QFP = (NJM, FSB) TPH = (NXT, RKN) SRL = (LSP, LFV) SDL = (MGL, PSK) MFX = (FSM, LQF) RFT = (FLV, GMS) BTG = (DRS, PVC) HLR = (DSB, DPP) DXB = (BPP, GRV) NHS = (HQG, GVP) GKK = (DCM, RLT) MJT = (JNR, PGC) KDS = (FFD, XPC) TSS = (BGX, QQX) FKC = (NBN, SJP) HHQ = (GVP, HQG) JKF = (QRR, GFD) CXG = (SDD, TMN) GCG = (TCC, TDT) NQX = (DMQ, DPM) GHX = (BJQ, CHJ) JQC = (HNQ, RJF) QBB = (GNH, XSC) BJG = (VMH, FCN) VMS = (KRX, VLQ) GSF = (NQM, KBH) JQQ = (PKD, GNB) KFG = (BGX, QQX) TTV = (SNB, JQF) CXJ = (CND, LSC) GGP = (PBH, XNG) FCV = (NLP, QJK) NSB = (KSX, SLL) JBH = (RGK, NSS) CQH = (HJL, FKR) VRX = (HKJ, FBL) HJZ = (QVX, FXB) RLD = (BJP, RLV) HHH = (PNJ, HPJ) LSC = (NRP, DCF) BVM = (RCG, QLL) KGN = (PRB, MLT) NTV = (MRQ, NHQ) VXT = (VFH, MBX) RLG = (MJQ, RNL) JVX = (HJQ, FNV) XGH = (HHK, JXT) NHC = (HPX, LGG) VPC = (XCL, HPQ) HKJ = (RQC, TMK) PGQ = (FTX, MNP) MPF = (KNM, BJG) MFT = (DRS, PVC) XNG = (RCS, JNH) RMH = (GHD, MPF) PFM = (PGQ, XHJ) TRN = (TCP, TCP) NHP = (JMG, VGP) JSK = (JBG, PVM) FSB = (MGK, HTD) BPR = (VFH, MBX) RHM = (LHD, PTF) PRV = (RJL, HHH) GNC = (HVR, PSV) PSV = (JFM, XPN) KMG = (KDR, RTV) RKL = (DPP, DSB) GLN = (QJT, JXX) FNK = (XXP, QDR) JDP = (HVR, PSV) HHD = (VPC, MDS) XHJ = (MNP, FTX) XVJ = (RGG, BCB) DRH = (CDK, JFK) BMC = (TTQ, KHR) TCT = (JQD, QBB) BCS = (HLV, MKR) LFV = (GTL, NSX) JCS = (JQC, NDG) SBJ = (PHS, QMN) HPZ = (DQD, PFP) BFM = (PMD, JGB) QBL = (KVC, TXK) RGD = (NXH, KQQ) PBX = (LBP, FPK) FDD = (TCX, CSN) RJT = (CQG, JSQ) BMR = (FPK, LBP) RBN = (DRF, VJB) PHB = (NXR, LPM) BPN = (PPX, PPX) KVC = (NSF, TQK) PXB = (GJH, JHM) BCB = (NTR, KKB) KXM = (NHS, HHQ) VTT = (NCB, HCR) SHP = (LQX, XJH) RCG = (CLL, TCT) LHG = (GSF, PRJ) XCL = (JLX, PRV) LXB = (RHH, RXS) FKZ = (TJS, BJB) NNH = (CFD, XMX) NTD = (NCX, PVK) DCF = (JHJ, VMN) GJH = (JTD, CJD) VBS = (CDQ, LFQ) MGL = (GGB, QNN) TXK = (NSF, TQK) HRX = (QFP, BJR) GMS = (GKJ, TNF) RGA = (PFP, DQD) KTS = (GSF, PRJ) TPP = (VPC, MDS) JNV = (BHV, XQK) DXL = (HDP, KTG) MBR = (GRS, GTG) KVJ = (LPH, NGG) HRG = (RNL, MJQ) XHL = (JXF, FVH) MMC = (FHM, HNF) HGC = (SHT, HBF) LPS = (NTV, CGR) FKR = (CBR, VDR) BHV = (PQG, QTK) BKF = (SRP, DRH) JMA = (BJB, TJS) MPT = (HRX, VSD) QHL = (NRB, HJG) PDG = (KJM, SHP) HFT = (HHQ, NHS) SJD = (GPM, PPB) NSF = (NRX, SRL) MXG = (JVJ, BMF) PHD = (BQK, VKV) VBH = (TXK, KVC) NJM = (HTD, MGK) TVV = (LLH, HFB) RPS = (GGQ, SNK) HPR = (LJS, DJR) FDR = (QKT, GRX) LLT = (SHV, NRL) VQC = (DPM, DMQ) MJQ = (CLD, FCV) BFG = (GJH, JHM) GFS = (PMP, VXL) LBP = (HRF, GRB) BXC = (MFS, NRM) CFD = (QMQ, HPR) HPN = (JQC, NDG) BBJ = (JTL, QQK) VVL = (CDN, STB) HFB = (CFP, BGF) NNG = (XVP, CQH) QKM = (KDS, FRP) VJB = (CPR, RTX) KQB = (XCK, BSF) LKS = (LDJ, MXG) GTL = (FVD, LXB) PJS = (BGV, MLM) KNM = (FCN, VMH) FCN = (VGR, KHV) RPJ = (XKD, BPM) GLP = (KDR, RTV) NXL = (VTS, SDL) XDX = (MPT, FXH) KRX = (DCD, DHH) CTP = (CRQ, DPL) SRG = (SKH, SLF) QVX = (NDC, NPL) XVK = (SNB, JQF) RBT = (NSD, SBJ) RXS = (FKC, JSS) SFX = (PRB, MLT) SRS = (FVH, JXF) NRL = (RLG, HRG) QKK = (PBX, BMR) DPL = (PTQ, DBH) PFD = (JQV, GKK) VGR = (KMX, DVR) FQX = (LHD, PTF) LXT = (RHM, FQX) JHV = (MBR, PHJ) JNN = (VKG, SLT) XDK = (DRH, SRP) JBR = (BDR, GFS) BNM = (VKG, SLT) CJD = (VNS, FGJ) FPK = (HRF, GRB) PBH = (JNH, RCS) FGV = (FDR, TMD) LSF = (XXP, QDR) RBM = (VHG, BDL) TNF = (HQJ, TQF) TRM = (JHT, BCG) GBH = (XMJ, JFF) DBH = (DSS, RQL) PGB = (BXR, DXL) QFR = (TDT, TCC) HHL = (NXH, KQQ) HGN = (BFG, PXB) PXC = (BPN, BPN) NDF = (VQC, NQX) GSK = (BVV, SBX) TCM = (VBS, HCN) HTD = (BVC, HVL) SHD = (MHG, HNG) LQX = (QVF, LBV) MSF = (FDF, VLP) NRP = (VMN, JHJ) TQF = (BXC, JCR) MBX = (GML, FDD) JCR = (MFS, NRM) NTR = (PCN, RNT) JHJ = (XMT, NPT) SQX = (CDN, STB) CSN = (GBJ, PGB) GDJ = (GBM, GCJ) XGL = (HJQ, FNV) PLD = (BFL, BFL) NRX = (LFV, LSP) TFF = (HGQ, MJT) JVJ = (TMS, HPK) BSF = (VDX, GFC) GML = (CSN, TCX) BFJ = (GFD, QRR) FGJ = (PGF, VMS) TQK = (SRL, NRX) GQD = (MDD, HLQ) TJX = (XCG, DJH) GRR = (LPM, NXR) PTQ = (DSS, DSS) HHK = (KLD, NNG) FBR = (KXM, HFT) RLT = (JMK, DLP) PHL = (QHR, RMH) DVM = (JTP, KDM) MNF = (RPJ, RMF) RMF = (BPM, XKD) GGQ = (MFT, BTG) CLD = (NLP, QJK) NMR = (FNL, LXT) CLX = (TRP, GMD) QMQ = (DJR, LJS) KDR = (PKC, NRF) KKG = (VHG, BDL) FBQ = (TPP, HHD) QVV = (LNR, GSK) VKV = (MFX, FDL) HJG = (NQD, RFT) XVD = (VXT, BPR) NCX = (SMV, JRN) QLN = (CDJ, TDK) GFC = (CKR, LNC) HGQ = (JNR, PGC) NDG = (RJF, HNQ) CBC = (NSD, SBJ) BQK = (FDL, MFX) VGV = (HGC, TQG) VGP = (RJT, KPK) VMN = (XMT, NPT) PSH = (NSS, RGK) PPL = (FXH, MPT) DCD = (SBR, DTS) MDD = (MQX, FQT) XCG = (XVK, TTV) LFQ = (SNS, VBL) JHT = (FMN, HMC) KNQ = (QKM, DPS) PVM = (CHL, GLT) JMG = (KPK, RJT) XKD = (GQJ, NXL) DGG = (CCB, CQX) HNF = (MNC, FKZ) QTL = (PSH, JBH) RNL = (CLD, FCV) BDR = (PMP, VXL) GKH = (KXM, HFT) RQC = (DVM, BJM) GSR = (PPL, XDX) JQD = (GNH, XSC) GRS = (RTN, MPH) BPP = (GBH, KQX) XVP = (HJL, FKR) PKZ = (NMR, KJK) SLT = (BVM, KMJ) XHA = (KJK, NMR) BQQ = (FDR, TMD) GGC = (CXJ, PTJ) NBM = (PXB, BFG) RQL = (BBH, NLT) KJK = (FNL, LXT) PSK = (GGB, QNN) FQT = (DRL, NDS) SJT = (VQC, NQX) QHT = (GFS, BDR) QJT = (PJS, DNG) SVT = (PDG, GSS) MBQ = (PPL, XDX) VHL = (PVM, JBG) QCJ = (JKK, JSR) NQH = (LKQ, FBG) XNJ = (QNF, LPL) PQV = (CKJ, JHV) FHM = (MNC, MNC) FPN = (DLQ, BGR) BJR = (NJM, FSB) HPQ = (PRV, JLX) KMJ = (QLL, RCG) FTX = (TSM, PDR) JXT = (KLD, NNG) DPS = (KDS, FRP) KKB = (RNT, PCN) XCB = (TDM, HXC) TCP = (PFP, DQD) CDK = (NDF, SJT) HCR = (HSP, PFD) SNK = (BTG, MFT) TKN = (QTL, HPL) GSS = (KJM, SHP) NRF = (SVT, RGV) FLV = (GKJ, TNF) QPK = (FPN, DRM) RNB = (QTL, HPL) HPJ = (XGL, JVX) NSD = (QMN, PHS) JXF = (DQV, XPX) PRJ = (KBH, NQM) XMT = (NGC, FQM) JLP = (QNF, LPL) RND = (HLV, MKR) QRR = (GPQ, GLL) LNR = (BVV, SBX) PQG = (TXR, NTD) JXX = (PJS, DNG) QQX = (VTT, XKV) RRJ = (GLS, GGP) MLM = (VCD, BTQ) QVG = (TMM, CTP) KRM = (MSF, HVT) XKV = (HCR, NCB) LJX = (RNB, TKN) CCB = (NXM, QSG) RJF = (FQP, VDH) XBN = (BJQ, CHJ) JHM = (JTD, CJD) SMV = (RSL, RLD) PDR = (GHX, XBN) JFK = (NDF, SJT) HCN = (LFQ, CDQ) SLL = (TCB, GDK) VBL = (JBR, QHT) SMK = (RBM, KKG) GDK = (QXQ, RVR) KQX = (XMJ, JFF) LKQ = (HLN, VTD) JSQ = (QXG, CLX) FFD = (FRX, SSS) NRM = (XBP, NQH) SBR = (PQQ, SRG) BKR = (MHG, HNG) QQK = (GQK, STS) HVL = (DLF, QLH) NHT = (PTJ, CXJ) GLL = (TLL, LRR) GLS = (PBH, XNG) NHB = (QQK, JTL) PFS = (KFG, TSS) PCN = (PFS, QFB) CJV = (BFL, PKZ) JFM = (FKG, CXG) GFD = (GLL, GPQ) MDS = (XCL, HPQ) FXH = (VSD, HRX) DQD = (RPR, LPS) HPX = (RRJ, FCK) JNR = (SQQ, SQQ) BGR = (PQV, DKS) BRN = (BSF, XCK) RVS = (QKM, DPS) PLH = (GPM, PPB) XSM = (QFS, GQD) TTH = (TQG, HGC) KBJ = (KTS, LHG) RKN = (PCX, NSB) TPK = (PFM, RFN) MNC = (BJB, TJS) PMM = (GRR, PHB) QKT = (BNK, QKR) HQG = (JLP, XNJ) RRD = (JGB, PMD) CPR = (TGM, VXS) GGM = (GCJ, GBM) HBF = (FQG, PHL) NXH = (DPF, GKD) TMD = (GRX, QKT) FBL = (RQC, TMK) GNB = (DKH, TNC) LQF = (LKS, KPG) BKN = (TRN, TRN) QJK = (BLT, XVJ) HLV = (TJX, XPQ) XPX = (TPK, HQN) BJP = (FJB, FRM) GHD = (KNM, BJG) XMX = (HPR, QMQ) FNV = (NHT, GGC) JGB = (HGN, NBM) PKH = (HHK, JXT) JXN = (VRR, VRR) CHJ = (TLF, QSN) XBP = (LKQ, FBG) QTK = (TXR, NTD) PKC = (SVT, RGV) JNH = (MGV, MPJ) FXB = (NDC, NPL) XHQ = (KTS, LHG) MFS = (NQH, XBP) FQM = (XJB, TXN) QNN = (JQQ, GBG) GBG = (PKD, GNB) TMN = (GRC, BCV) HMN = (KKG, RBM) DHH = (SBR, DTS) KPG = (LDJ, MXG) FDL = (LQF, FSM) FXX = (LLH, HFB) VSD = (BJR, QFP) HVT = (FDF, VLP) FRM = (CBB, GMX) GQK = (QVV, QBV) CKJ = (PHJ, MBR) JJH = (XSH, BMC) SQQ = (PLD, PLD) KPK = (JSQ, CQG) VLP = (HHT, MMC) NLP = (XVJ, BLT) VTS = (MGL, PSK) DTS = (SRG, PQQ) VCD = (GDJ, GGM) VRR = (HLR, RKL) VXS = (BKN, SRB) GMD = (PSR, VRX) PFK = (HXC, TDM) SJP = (VSM, NNH) TDK = (SRS, XHL) KRS = (GCV, SJB) MRQ = (CJK, PQD) XJB = (JRK, RPS) BGF = (QCR, LJX) MLT = (MMF, DGG) TCC = (MNF, KKL) QMN = (GLN, SQH) GQJ = (VTS, SDL) BFQ = (SMK, HMN) NSS = (JPQ, HXV) MHG = (VGV, TTH) KBH = (GPL, XCV) DRL = (KGD, HNX) HMC = (QDF, RGR) QSN = (FBR, GKH) SDD = (GRC, BCV) TGH = (BPN, SSQ) HNG = (TTH, VGV) RHH = (FKC, JSS) DQA = (MVV, LQJ) QFB = (KFG, TSS) TQG = (SHT, HBF) KDM = (QKK, HQL) XHV = (PLD, CJV) PQD = (TPH, PTN) SSS = (SQX, VVL) GPM = (DXB, GDX) KLD = (CQH, XVP) LRR = (FXX, TVV) HPL = (JBH, PSH) TMS = (BQQ, FGV) MMF = (CCB, CQX) DLQ = (PQV, DKS) PHJ = (GTG, GRS) TLF = (GKH, FBR) FJB = (CBB, GMX) PTF = (PSF, PHD) NPL = (RTG, QHL) XMJ = (XHQ, KBJ) PMP = (TRM, PJK) JPQ = (KLM, TCM) BCG = (FMN, HMC) DRS = (MGD, XVD) RGT = (PKH, XGH) TGM = (BKN, BKN) BPM = (GQJ, NXL) VDX = (CKR, LNC) XJH = (QVF, LBV) MGD = (BPR, VXT) RGR = (JSK, VHL) SNS = (QHT, JBR) SRB = (TRN, DVK) NRQ = (LQC, JJH) PSF = (BQK, VKV) BMF = (TMS, HPK) LGG = (FCK, RRJ) HPK = (FGV, BQQ) QBV = (GSK, LNR) FNF = (PHB, GRR) GLT = (JDP, GNC) DKS = (JHV, CKJ) RGV = (GSS, PDG) HQN = (PFM, RFN) GKD = (BFJ, JKF) HXC = (HPN, JCS) MGH = (BVB, FBQ) LBV = (XCB, PFK) LHD = (PHD, PSF) CDQ = (SNS, VBL) BTQ = (GGM, GDJ) HMS = (CBC, RBT) VTD = (CNV, NRQ) JBG = (GLT, CHL) LCB = (NGG, LPH) FKG = (SDD, TMN) BVV = (DDL, MGH) RGG = (KKB, NTR) FBG = (HLN, VTD) KMX = (GVJ, LLT) HRF = (HHL, RGD) DGM = (QFS, GQD) LPM = (QFR, GCG) QXQ = (BCS, RND) BGV = (BTQ, VCD) BGX = (XKV, VTT) XDR = (VRR, ZZZ) BJM = (JTP, KDM) RFN = (PGQ, XHJ) DDL = (FBQ, BVB) XCV = (JNN, BNM) TCX = (GBJ, PGB) QXG = (TRP, GMD) VKG = (BVM, KMJ) RSL = (RLV, BJP) CDN = (QLN, CNM) RVR = (BCS, RND) BBH = (BXJ, BXJ) BXR = (KTG, HDP) DJH = (XVK, TTV) DVK = (TCP, HPZ) SLF = (TFF, KQV) DJR = (SFX, KGN) HHT = (FHM, FHM) JSR = (JXM, JNV) DSB = (BFQ, XDD) DPM = (RVS, KNQ) HJQ = (NHT, GGC) ZZZ = (RKL, HLR) RJL = (HPJ, PNJ) BJQ = (TLF, QSN) HQJ = (BXC, JCR) FQP = (HMS, SRH) PGF = (VLQ, KRX) LQJ = (FNF, PMM) JXM = (BHV, XQK) PNJ = (JVX, XGL) STB = (CNM, QLN) BBS = (JXN, JXN) KKL = (RMF, RPJ) SHV = (HRG, RLG) FPQ = (FPN, DRM) GBJ = (DXL, BXR) QHR = (GHD, MPF) MDG = (JKK, JSR) CRQ = (PTQ, DBH) BVB = (TPP, HHD) GRC = (RGT, VDD) SKH = (TFF, KQV) DHZ = (LQJ, MVV) LSP = (NSX, GTL) MPJ = (QBL, VBH) TDT = (KKL, MNF) TXN = (JRK, RPS) HSP = (GKK, JQV) JTL = (STS, GQK) GBM = (QCJ, MDG) HDP = (LLX, QVG) GMX = (KQB, BRN) PJK = (JHT, BCG) NDC = (RTG, QHL) LPL = (GSR, MBQ) VLQ = (DCD, DHH) QLL = (CLL, TCT) RTV = (NRF, PKC) DKH = (BBJ, NHB) NGC = (XJB, TXN) CNM = (CDJ, TDK) XXP = (BSP, NHC) FNL = (RHM, FQX) NBN = (VSM, NNH) XSC = (BFM, RRD) VXL = (PJK, TRM) VSM = (XMX, CFD) NQM = (GPL, XCV) HLN = (CNV, NRQ) GCJ = (QCJ, MDG) FDF = (HHT, HHT) PQQ = (SKH, SLF) KVD = (MSF, HVT) QSG = (NVD, RBN) RGK = (HXV, JPQ) NXR = (GCG, QFR) QDR = (BSP, NHC) TDM = (HPN, JCS) MQX = (NDS, DRL) JRK = (GGQ, SNK) VMH = (VGR, KHV) RPR = (NTV, CGR) CFP = (LJX, QCR) CLL = (JQD, QBB) LLX = (CTP, TMM) PRB = (DGG, MMF) FVH = (XPX, DQV) JKK = (JNV, JXM) KLM = (VBS, HCN) NHQ = (CJK, PQD) BJB = (BKR, SHD) CQX = (NXM, QSG) KHV = (DVR, KMX) SRH = (CBC, RBT) DQV = (TPK, HQN) NQD = (GMS, FLV) PHS = (GLN, SQH) GPL = (JNN, BNM) JSS = (SJP, NBN) CGR = (MRQ, NHQ) PGC = (SQQ, XHV) GPQ = (LRR, TLL) HXV = (TCM, KLM) BFL = (KJK, NMR) PPX = (FXB, QVX) AAA = (HLR, RKL) DSS = (BBH, BBH) VDD = (PKH, XGH) NCB = (PFD, HSP) SSQ = (PPX, HJZ) DNG = (MLM, BGV) CDJ = (XHL, SRS) TNC = (NHB, BBJ) QDF = (VHL, JSK) GTG = (MPH, RTN) FRX = (SQX, VVL) MVV = (FNF, PMM) QFS = (HLQ, MDD) MNP = (PDR, TSM) LDJ = (BMF, JVJ) NSX = (FVD, LXB) RNT = (PFS, QFB) TJS = (SHD, BKR) HNQ = (VDH, FQP) BLT = (BCB, RGG) KQV = (HGQ, MJT) PTN = (NXT, RKN) VDR = (BBS, PCT) RCS = (MPJ, MGV) GRX = (BNK, QKR) JFF = (XHQ, KBJ) RTG = (NRB, HJG) CND = (DCF, NRP) DCM = (JMK, DLP) XPQ = (XCG, DJH) RTX = (TGM, VXS) DPF = (BFJ, JKF) LNC = (PXC, TGH) PCX = (SLL, KSX) BSP = (HPX, LGG) VHG = (LCH, NHP) GRV = (KQX, GBH) NGG = (DGM, XSM) XSH = (TTQ, KHR) MRH = (KVJ, LCB) TXR = (NCX, PVK) NVD = (VJB, DRF) TTQ = (FPQ, QPK) CKR = (PXC, PXC) BVC = (DLF, QLH) VDH = (SRH, HMS) JQF = (SKC, MRH) CBB = (BRN, KQB) FMN = (RGR, QDF) SHT = (FQG, PHL) NLT = (BXJ, DHZ) MPH = (KRS, XNV) BXJ = (MVV, LQJ) CHL = (JDP, GNC) TSM = (XBN, GHX) DLF = (KRM, KVD) BCV = (RGT, VDD) HNX = (FNK, LSF) LJS = (SFX, KGN) STS = (QBV, QVV) SKC = (KVJ, LCB) BNK = (SJD, PLH) RTN = (KRS, XNV) JTP = (QKK, HQL) LCH = (VGP, JMG) CBR = (BBS, BBS) VNS = (VMS, PGF) CQG = (CLX, QXG) HLQ = (MQX, FQT) TMM = (CRQ, DPL) BDL = (NHP, LCH) TRP = (VRX, PSR) MGV = (VBH, QBL) GNH = (BFM, RRD) NXT = (NSB, PCX) SNB = (SKC, MRH) LPH = (XSM, DGM) GGB = (GBG, JQQ) CJK = (PTN, TPH) QVF = (PFK, XCB)") ;; day8-input-scm ends here ;; Data Definition and Extraction ;; #+NAME: day8-part1-records ;; [[file:chicken-src.org::day8-part1-records][day8-part1-records]] ;; -*- geiser-scheme-implementation: chicken -*- (define-record node name left right) (define-record direction side) (define-record directions-ring entries entry length index) ;; day8-part1-records ends here ;; #+NAME: day8-part1-irregex ;; [[file:chicken-src.org::day8-part1-irregex][day8-part1-irregex]] ;; -*- geiser-scheme-implementation: chicken -*- (define alnum '(+ (or (/ #\A #\Z) (/ #\0 #\9)))) (define node-irregex `(: bol (* whitespace) (submatch-named node-name ,alnum) " = (" (submatch-named left ,alnum) ", " (submatch-named right ,alnum) ")" (* whitespace) eol)) (define directions-irregex '(+ (or #\L #\R))) ;; day8-part1-irregex ends here ;; #+NAME: day8-part1-input--directions ;; [[file:chicken-src.org::day8-part1-input--directions][day8-part1-input--directions]] ;; -*- geiser-scheme-implementation: chicken -*- (define (input->directions input) (let* ((directions-str (car (irregex-extract directions-irregex input))) (directions (map (compose make-direction string->symbol string) (string->list directions-str)))) (make-directions-ring directions (car directions) (length directions) 0))) ;; day8-part1-input--directions ends here ;; #+NAME: day8-part1-input--nodes-alist ;; [[file:chicken-src.org::day8-part1-input--nodes-alist][day8-part1-input--nodes-alist]] ;; -*- geiser-scheme-implementation: chicken -*- (define (input->nodes-alist input) (irregex-fold node-irregex (lambda (from-index match seed) (alist-update (string->symbol (irregex-match-substring match 'node-name)) (make-node (string->symbol (irregex-match-substring match 'node-name)) (string->symbol (irregex-match-substring match 'left)) (string->symbol (irregex-match-substring match 'right))) seed)) '() input)) ;; day8-part1-input--nodes-alist ends here ;; Navigation ;; #+NAME: day8-part1-move-forward ;; [[file:chicken-src.org::day8-part1-move-forward][day8-part1-move-forward]] ;; -*- geiser-scheme-implementation: chicken -*- (define (move-forward directions-ring) (let ((entries (directions-ring-entries directions-ring)) (len (directions-ring-length directions-ring)) (index (directions-ring-index directions-ring))) (directions-ring-index-set! directions-ring (or (and (< index (- len 1)) (+ index 1)) 0)) (directions-ring-entry-set! directions-ring (list-ref entries (directions-ring-index directions-ring))) directions-ring)) ;; day8-part1-move-forward ends here ;; #+NAME: day8-part1-move ;; [[file:chicken-src.org::day8-part1-move][day8-part1-move]] ;; -*- geiser-scheme-implementation: chicken -*- (define (move node direction nodes-alist) (let* ((side (direction-side direction)) (next-sym (if (eqv? 'L side) (node-left node) (node-right node)))) (alist-ref next-sym nodes-alist))) ;; day8-part1-move ends here ;; #+NAME: day8-part1-navigate ;; [[file:chicken-src.org::day8-part1-navigate][day8-part1-navigate]] ;; -*- geiser-scheme-implementation: chicken -*- (define (navigate nodes-alist directions start-sym target-sym #!optional (current-sym start-sym) (counter 0)) (if (eqv? current-sym target-sym) counter (let ((next-sym (node-name (move (alist-ref current-sym nodes-alist) (directions-ring-entry directions) nodes-alist)))) (navigate nodes-alist (move-forward directions) start-sym target-sym next-sym (+ counter 1))))) ;; day8-part1-navigate ends here ;; Calculate The Route ;; #+NAME: day8-part1-calc-fn ;; [[file:chicken-src.org::day8-part1-calc-fn][day8-part1-calc-fn]] ;; -*- geiser-scheme-implementation: chicken -*- (define (calc-part-1) (let ((directions (input->directions input)) (nodes-alist (input->nodes-alist input))) (navigate nodes-alist directions 'AAA 'ZZZ))) ;; day8-part1-calc-fn ends here ;; Puzzle Solution ;; #+NAME: day8-part2-calc-next-sym ;; [[file:chicken-src.org::day8-part2-calc-next-sym][day8-part2-calc-next-sym]] ;; -*- geiser-scheme-implementation: chicken -*- (define (calc-next-sym sym direction nodes-alist) (let ((side (direction-side direction)) (node (alist-ref sym nodes-alist))) (if (eqv? 'L side) (node-left node) (node-right node)))) ;; day8-part2-calc-next-sym ends here ;; #+NAME: day8-part2-navigate ;; [[file:chicken-src.org::day8-part2-navigate][day8-part2-navigate]] ;; -*- geiser-scheme-implementation: chicken -*- (define (p2-navigate nodes-alist directions start-sym #!optional (current-sym start-sym) (counter 0)) (if (eqv? #\Z ((compose car reverse string->list symbol->string) current-sym)) (begin (print "Found end point of " start-sym ": " current-sym ", steps: " counter) counter) (let ((next-sym (calc-next-sym current-sym (directions-ring-entry directions) nodes-alist))) (p2-navigate nodes-alist (move-forward directions) start-sym next-sym (+ counter 1))))) ;; day8-part2-navigate ends here ;; #+NAME: day8-part2-find-start-points ;; [[file:chicken-src.org::day8-part2-find-start-points][day8-part2-find-start-points]] ;; -*- geiser-scheme-implementation: chicken -*- (define (find-start-points sym-list) (foldl (lambda (start-points sym) (if (eqv? #\A ((compose car reverse string->list symbol->string) sym)) (cons sym start-points) start-points)) '() sym-list)) ;; day8-part2-find-start-points ends here ;; #+NAME: day8-part2-lcm ;; [[file:chicken-src.org::day8-part2-lcm][day8-part2-lcm]] ;; -*- geiser-scheme-implementation: chicken -*- (: p2-lcm ((list-of integer) integer -> integer)) (define (p2-lcm numbers #!optional (factor 2)) (let ((multiple (* (car numbers) factor))) (if (= 0 (foldl (lambda (x n) (+ x (modulo multiple n))) 0 numbers)) multiple (p2-lcm numbers (+ factor 1))))) ;; day8-part2-lcm ends here ;; #+NAME: day8-part2-calc-fn ;; [[file:chicken-src.org::day8-part2-calc-fn][day8-part2-calc-fn]] ;; -*- geiser-scheme-implementation: chicken -*- (define (calc-part-2) (let* ((directions (input->directions input)) (nodes-alist (input->nodes-alist input)) (start-points (find-start-points (map car nodes-alist)))) (apply lcm (sort (map (cut p2-navigate nodes-alist directions <>) start-points) >)))) ;; day8-part2-calc-fn ends here