Advent-of-Code-2023/day8.scm

1028 lines
22 KiB
Scheme

;; 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