adventofcode

git clone https://git.ce9e.org/adventofcode.git

commit
8f5e43733370f9160873be464c3741cb426c627f
parent
bfe65325efed4e95056954216e21d07f6bb0ddd3
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2023-12-08 15:46
2023-12-08

Diffstat

A 2023/08/input.txt 716 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A 2023/08/solution.rs 172 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A 2023/08/test1.txt 9 +++++++++
A 2023/08/test2.txt 5 +++++
A 2023/08/test3.txt 10 ++++++++++
M 2023/lib.rs 10 ++++++++++

6 files changed, 922 insertions, 0 deletions


diff --git a/2023/08/input.txt b/2023/08/input.txt

@@ -0,0 +1,716 @@
   -1     1 LRLRLRRLRRRLRRRLRRRLRLRRRLRRRLRRRLLRLRRRLRLRRRLLRRRLRRLRRRLRRLRLRRRLRRRLRLRRLRRRLRRLRRRLRRLRLRRLRRRLRLRRLRRRLLRRRLRLRRLLLRLLRLRRLLRRRLLRLLRRLRLRRRLLLRLRRLRLRRLRRRLRRLLRRLLRLRRRLRRRLRLLLLRLLRLRLRLRRRLRRLRRLRLRRRLLRRLRLLRRLRLRRLRLRLRRLRRLLRLRRLLRLLRRRLLLRRRLRRLRLRRRLRRLRRRLRRLLLRRRR
   -1     2 
   -1     3 QKX = (SQD, XTJ)
   -1     4 FKP = (JGJ, JPR)
   -1     5 VCQ = (XGB, SSS)
   -1     6 JSK = (LSQ, FFS)
   -1     7 LGF = (THC, RQQ)
   -1     8 HSQ = (TBN, XTK)
   -1     9 BGB = (CPJ, KVD)
   -1    10 DJD = (VBL, MKB)
   -1    11 XTJ = (TRB, TJN)
   -1    12 SNX = (KJN, SBX)
   -1    13 BMD = (BJH, XKX)
   -1    14 PRV = (BCM, MJT)
   -1    15 DNK = (FFS, LSQ)
   -1    16 FNR = (BMF, GFC)
   -1    17 SLS = (SQJ, DBC)
   -1    18 VBS = (NVV, KXT)
   -1    19 FTF = (JMM, LHK)
   -1    20 GTH = (BGR, HTH)
   -1    21 DJL = (KDH, QRQ)
   -1    22 JKN = (SVX, HTB)
   -1    23 KBR = (JSK, DNK)
   -1    24 KQF = (MSK, NSG)
   -1    25 FRX = (PXS, KBM)
   -1    26 SQC = (SRH, CFG)
   -1    27 PCV = (JPB, RHQ)
   -1    28 TND = (KLP, JLN)
   -1    29 DGQ = (DBL, CFH)
   -1    30 KQB = (VSG, DLB)
   -1    31 SMN = (DGL, KLT)
   -1    32 VTM = (GNQ, LSN)
   -1    33 RKJ = (RKK, FDK)
   -1    34 GPT = (NGQ, KCG)
   -1    35 BVQ = (RCF, QHP)
   -1    36 LHH = (HKF, VQC)
   -1    37 BPC = (KLP, JLN)
   -1    38 LDT = (RST, BMN)
   -1    39 TPN = (DLB, VSG)
   -1    40 JDX = (LTK, MTB)
   -1    41 GSB = (JBN, VHT)
   -1    42 MKB = (VCT, TMP)
   -1    43 BMN = (FDD, SSH)
   -1    44 CKX = (HMK, CHH)
   -1    45 LSV = (XKP, HNB)
   -1    46 QGN = (LQC, LVF)
   -1    47 BXB = (KPM, NFR)
   -1    48 PGL = (KXD, JVR)
   -1    49 CTS = (VTB, XFM)
   -1    50 BQM = (KLK, LVQ)
   -1    51 CHP = (KNF, GGX)
   -1    52 HBQ = (FHV, NBM)
   -1    53 BNT = (NGQ, KCG)
   -1    54 XSJ = (RDG, VNN)
   -1    55 STT = (KPB, PQV)
   -1    56 GMH = (DDN, MCB)
   -1    57 GRV = (GJQ, JMG)
   -1    58 DJB = (VSK, MSC)
   -1    59 PHQ = (LKF, TLK)
   -1    60 DGH = (VNG, GGP)
   -1    61 DHT = (HSQ, THB)
   -1    62 XJV = (VTM, JGC)
   -1    63 LGV = (HXV, JDL)
   -1    64 LNJ = (BNT, GPT)
   -1    65 RTV = (MKB, VBL)
   -1    66 RQQ = (DJL, BSC)
   -1    67 JDL = (LJT, HTF)
   -1    68 HST = (MSL, TCL)
   -1    69 TGG = (VSP, MNJ)
   -1    70 FFX = (KCF, CTQ)
   -1    71 VCT = (RMX, SVM)
   -1    72 SQD = (TJN, TRB)
   -1    73 FRN = (TGL, NFL)
   -1    74 MFL = (KLT, DGL)
   -1    75 GMG = (NLM, HXM)
   -1    76 NGB = (TFV, TXN)
   -1    77 CRK = (TND, BPC)
   -1    78 PGN = (RGD, NNK)
   -1    79 PRQ = (FLM, XGJ)
   -1    80 MXH = (SNM, JKM)
   -1    81 KLT = (MPS, XJV)
   -1    82 LJV = (KLK, LVQ)
   -1    83 CKS = (THB, HSQ)
   -1    84 DBF = (RHQ, JPB)
   -1    85 HSX = (PPC, FCR)
   -1    86 DSB = (CJV, BBG)
   -1    87 BSC = (QRQ, KDH)
   -1    88 CDG = (SLS, RXH)
   -1    89 DCJ = (KNR, VSX)
   -1    90 BFF = (KNF, GGX)
   -1    91 CRP = (MVK, NLT)
   -1    92 NNK = (NMP, GCR)
   -1    93 JBG = (MLP, BND)
   -1    94 MRQ = (XVQ, XVQ)
   -1    95 QJS = (QNG, QXX)
   -1    96 GBH = (JDQ, CQG)
   -1    97 QGM = (FTF, SDJ)
   -1    98 THS = (GFF, CTS)
   -1    99 PGJ = (JFX, BDV)
   -1   100 NLT = (BCK, JDX)
   -1   101 JMT = (MQT, SFJ)
   -1   102 JST = (PVC, TXB)
   -1   103 JHJ = (FGC, KGK)
   -1   104 DGG = (GMB, NJR)
   -1   105 VLM = (FQN, VHV)
   -1   106 CHH = (FQB, HSK)
   -1   107 TMP = (RMX, SVM)
   -1   108 QRQ = (LHH, BVN)
   -1   109 NBM = (DJC, TKB)
   -1   110 KGF = (DJP, CMM)
   -1   111 JVG = (LGS, RVP)
   -1   112 LKC = (VLG, TBC)
   -1   113 VQD = (XTJ, SQD)
   -1   114 CQB = (CHH, HMK)
   -1   115 XTK = (HJB, DVJ)
   -1   116 FLM = (TNP, GMG)
   -1   117 VPC = (QMC, NBG)
   -1   118 CGP = (KHF, CMS)
   -1   119 KBM = (TCP, DRV)
   -1   120 XFC = (CQH, KCK)
   -1   121 JVR = (XNG, SVK)
   -1   122 LBT = (CJP, PGJ)
   -1   123 JSF = (QJS, CRR)
   -1   124 VPS = (TGN, CJG)
   -1   125 KLG = (SNM, JKM)
   -1   126 XGL = (GGK, QQT)
   -1   127 HKG = (NFD, CCP)
   -1   128 PVN = (CRK, MRD)
   -1   129 RLT = (TMS, PRV)
   -1   130 HCB = (CDH, XSL)
   -1   131 MFX = (LTN, GMS)
   -1   132 QNZ = (QVP, XGL)
   -1   133 HTH = (BFR, MVX)
   -1   134 XGJ = (TNP, GMG)
   -1   135 DGJ = (QJS, CRR)
   -1   136 VGS = (NGB, BRK)
   -1   137 RKB = (GLL, CRS)
   -1   138 DBL = (MPB, GKD)
   -1   139 XNJ = (CBF, KRG)
   -1   140 JBN = (FFX, VLD)
   -1   141 CBD = (KHV, HCL)
   -1   142 QTM = (DGG, DDB)
   -1   143 DDB = (GMB, NJR)
   -1   144 HHF = (PGL, HXJ)
   -1   145 VXH = (CFK, NTC)
   -1   146 SRH = (NGC, MMP)
   -1   147 JMG = (BCR, GSN)
   -1   148 LBJ = (BGR, HTH)
   -1   149 QMC = (JBH, KBR)
   -1   150 KHF = (BTJ, DMS)
   -1   151 JPB = (BLP, DRK)
   -1   152 PQD = (PRV, TMS)
   -1   153 KXJ = (XMC, PDX)
   -1   154 KGC = (RGN, JVJ)
   -1   155 KTX = (KTT, GBH)
   -1   156 SFB = (TDX, JMT)
   -1   157 TXN = (PHP, CTJ)
   -1   158 FNN = (FKB, JNG)
   -1   159 KFM = (FLD, JTN)
   -1   160 QCP = (JTH, RHP)
   -1   161 CBT = (JMX, CRP)
   -1   162 RGB = (BMF, GFC)
   -1   163 PPL = (KXT, NVV)
   -1   164 MQT = (XPK, JBG)
   -1   165 VPH = (XMP, LNT)
   -1   166 LNP = (KXJ, VRJ)
   -1   167 XPK = (MLP, BND)
   -1   168 LTD = (RHF, LSV)
   -1   169 JFV = (PRP, DXS)
   -1   170 VRM = (RTX, BTX)
   -1   171 LHZ = (KJJ, FXQ)
   -1   172 TXP = (HLH, CCK)
   -1   173 CTB = (LKC, VNJ)
   -1   174 NSV = (JPD, XTF)
   -1   175 CRS = (QXK, SXM)
   -1   176 TBK = (FQM, FQM)
   -1   177 XKX = (PGX, KGT)
   -1   178 PHG = (THC, RQQ)
   -1   179 XLB = (JLX, PDR)
   -1   180 FQB = (VPS, KHB)
   -1   181 SVX = (CRV, JQL)
   -1   182 QVL = (SSS, XGB)
   -1   183 DPM = (MBV, CXJ)
   -1   184 GCB = (NKN, DSB)
   -1   185 CFK = (TFX, CTB)
   -1   186 HMJ = (DVR, DVX)
   -1   187 GTF = (SSN, KVX)
   -1   188 FTV = (CFG, SRH)
   -1   189 KGX = (PNC, GJM)
   -1   190 TVD = (MXP, FCV)
   -1   191 JRD = (HFH, HFT)
   -1   192 RGD = (GCR, NMP)
   -1   193 LLC = (TGL, TGL)
   -1   194 NSG = (CDQ, LTD)
   -1   195 DSC = (NFR, KPM)
   -1   196 GQJ = (JTN, FLD)
   -1   197 GJG = (HLH, CCK)
   -1   198 MDP = (KHV, HCL)
   -1   199 VXS = (DDF, DVK)
   -1   200 GRG = (MPP, HKQ)
   -1   201 TXB = (CLQ, GVQ)
   -1   202 DXS = (PMJ, RRR)
   -1   203 GMS = (JDT, HQX)
   -1   204 BDV = (TNK, XLB)
   -1   205 XTF = (FBS, SFB)
   -1   206 GKD = (GMH, LHM)
   -1   207 SSH = (FPS, PTV)
   -1   208 HJB = (CTL, LMX)
   -1   209 XLD = (QMT, BVQ)
   -1   210 SDK = (DBN, JFL)
   -1   211 XSM = (VQD, QKX)
   -1   212 TRB = (PQR, GRG)
   -1   213 LDQ = (HMJ, BFL)
   -1   214 JQT = (VLM, LXL)
   -1   215 GMM = (KBM, PXS)
   -1   216 JFX = (TNK, XLB)
   -1   217 XSL = (DQQ, TKF)
   -1   218 KNN = (PPB, KTX)
   -1   219 NJK = (KGN, LFP)
   -1   220 RHP = (PKJ, JVG)
   -1   221 VBL = (VCT, TMP)
   -1   222 KXD = (XNG, SVK)
   -1   223 DLB = (FRX, GMM)
   -1   224 BFR = (VXH, TSR)
   -1   225 CJP = (BDV, JFX)
   -1   226 LTK = (MCT, RCX)
   -1   227 JMX = (MVK, NLT)
   -1   228 DNC = (SDJ, FTF)
   -1   229 XMP = (XSJ, TDR)
   -1   230 GNP = (GJS, XFC)
   -1   231 RSJ = (GJM, PNC)
   -1   232 LVQ = (QGX, JST)
   -1   233 KRG = (LVH, HXP)
   -1   234 VDV = (QRK, NBT)
   -1   235 NGC = (SMN, MFL)
   -1   236 MVG = (PVN, DRT)
   -1   237 GLH = (JMG, GJQ)
   -1   238 BGR = (MVX, BFR)
   -1   239 XFM = (BFF, CHP)
   -1   240 NHG = (BQR, BHN)
   -1   241 MRD = (BPC, TND)
   -1   242 NLF = (RVB, FPM)
   -1   243 CMS = (BTJ, DMS)
   -1   244 NBR = (RGD, NNK)
   -1   245 NCK = (DSC, BXB)
   -1   246 DJM = (VSK, MSC)
   -1   247 SFJ = (XPK, JBG)
   -1   248 FCS = (PGL, HXJ)
   -1   249 XKP = (TXG, GKK)
   -1   250 LVH = (DCJ, QNJ)
   -1   251 JBD = (NNX, DTF)
   -1   252 DJP = (XMX, QLG)
   -1   253 CRV = (CFR, PGD)
   -1   254 FSR = (VHT, JBN)
   -1   255 MBV = (PJN, JHJ)
   -1   256 KCK = (TXP, GJG)
   -1   257 JVJ = (XNJ, LHJ)
   -1   258 NKX = (XMP, LNT)
   -1   259 FGC = (VGF, HKG)
   -1   260 DCX = (PVN, DRT)
   -1   261 RJJ = (RLT, PQD)
   -1   262 HFD = (XVQ, XSX)
   -1   263 LFH = (MMD, MFD)
   -1   264 KHV = (KQF, PFP)
   -1   265 VKQ = (RGB, FNR)
   -1   266 DDF = (RCT, QRX)
   -1   267 LHJ = (KRG, CBF)
   -1   268 GSP = (NNX, DTF)
   -1   269 FLQ = (LNP, RTL)
   -1   270 FDD = (FPS, PTV)
   -1   271 VSS = (SLS, RXH)
   -1   272 CTL = (DFG, QCP)
   -1   273 CSS = (PPB, KTX)
   -1   274 MNC = (QBB, HLS)
   -1   275 PHP = (GQC, DLP)
   -1   276 MHD = (MLL, SJV)
   -1   277 LPK = (NFJ, NCK)
   -1   278 RFL = (KKM, LNJ)
   -1   279 LSQ = (CDG, VSS)
   -1   280 NDG = (VSP, VSP)
   -1   281 NKB = (XCN, SNX)
   -1   282 PQR = (HKQ, MPP)
   -1   283 MMP = (SMN, MFL)
   -1   284 QGX = (TXB, PVC)
   -1   285 CRM = (STS, NFQ)
   -1   286 TFX = (VNJ, LKC)
   -1   287 STX = (LPM, MNC)
   -1   288 VLG = (DHD, SJK)
   -1   289 KVD = (MVT, BMB)
   -1   290 MSK = (LTD, CDQ)
   -1   291 FXQ = (DJB, DJM)
   -1   292 BRM = (TCL, MSL)
   -1   293 TKB = (KFM, GQJ)
   -1   294 XRT = (XTV, JHM)
   -1   295 BLT = (GQV, ZZZ)
   -1   296 SDJ = (LHK, JMM)
   -1   297 RMQ = (HXV, JDL)
   -1   298 FQN = (SJD, VKQ)
   -1   299 BTX = (RSJ, KGX)
   -1   300 JTH = (PKJ, JVG)
   -1   301 XMX = (VXS, XJD)
   -1   302 RDT = (PBH, DQC)
   -1   303 DTN = (LXL, VLM)
   -1   304 VXR = (CBD, MDP)
   -1   305 LFG = (RMQ, LGV)
   -1   306 HMK = (FQB, HSK)
   -1   307 TFV = (PHP, CTJ)
   -1   308 SLH = (LTN, LTN)
   -1   309 PBS = (NBM, FHV)
   -1   310 VNN = (QCF, XRT)
   -1   311 SBX = (HLX, CBT)
   -1   312 VBK = (CKT, GQF)
   -1   313 GFF = (VTB, XFM)
   -1   314 SDP = (DXS, PRP)
   -1   315 NFR = (TFT, QGN)
   -1   316 LDX = (QTM, DQN)
   -1   317 LJT = (HRJ, RKJ)
   -1   318 FDV = (NSV, QQF)
   -1   319 FDK = (VPH, NKX)
   -1   320 GBQ = (MBV, CXJ)
   -1   321 MXP = (TFN, BXT)
   -1   322 JDQ = (XHX, VDV)
   -1   323 JLX = (SNT, BDR)
   -1   324 TCL = (DFS, GVD)
   -1   325 DRK = (SLH, MFX)
   -1   326 KNB = (SDK, HLJ)
   -1   327 GMB = (DQH, NHG)
   -1   328 RVP = (GTH, LBJ)
   -1   329 BLP = (SLH, MFX)
   -1   330 DJC = (GQJ, KFM)
   -1   331 GFC = (RKB, QBR)
   -1   332 TLK = (RFL, TJS)
   -1   333 HTB = (CRV, JQL)
   -1   334 KRV = (JLT, BSQ)
   -1   335 PCQ = (FXQ, KJJ)
   -1   336 KCF = (PLG, CQR)
   -1   337 SVM = (GLT, VGS)
   -1   338 FRD = (RGN, JVJ)
   -1   339 PPB = (KTT, GBH)
   -1   340 CCT = (XSN, VPC)
   -1   341 JSJ = (RMQ, LGV)
   -1   342 TDX = (MQT, SFJ)
   -1   343 DRT = (MRD, CRK)
   -1   344 NFL = (XSM, FBZ)
   -1   345 GMX = (XLD, RKV)
   -1   346 NHB = (SJV, MLL)
   -1   347 THB = (TBN, XTK)
   -1   348 FTR = (PPC, FCR)
   -1   349 QRX = (GTF, VCX)
   -1   350 CXJ = (JHJ, PJN)
   -1   351 FCR = (RXX, STT)
   -1   352 LQA = (VQD, QKX)
   -1   353 LVV = (XFC, GJS)
   -1   354 RVR = (FSR, GSB)
   -1   355 KDH = (BVN, LHH)
   -1   356 CJV = (KLG, MXH)
   -1   357 MNJ = (VXR, QXZ)
   -1   358 HKQ = (QGM, DNC)
   -1   359 BND = (CHS, PHQ)
   -1   360 DRV = (NGD, VRM)
   -1   361 XTV = (RXK, LPK)
   -1   362 MFD = (LLC, FRN)
   -1   363 CQH = (TXP, GJG)
   -1   364 XSX = (PCQ, LHZ)
   -1   365 SGA = (XGL, QVP)
   -1   366 VSG = (FRX, GMM)
   -1   367 RVG = (DBL, CFH)
   -1   368 GGP = (VBS, PPL)
   -1   369 NTC = (TFX, CTB)
   -1   370 HCL = (PFP, KQF)
   -1   371 JLF = (XSN, VPC)
   -1   372 KGT = (RHH, NNT)
   -1   373 MJT = (JSF, DGJ)
   -1   374 PLG = (NLF, TQN)
   -1   375 HXM = (BHM, FNN)
   -1   376 MVK = (JDX, BCK)
   -1   377 TFT = (LVF, LQC)
   -1   378 CJK = (MMD, MFD)
   -1   379 TNP = (NLM, HXM)
   -1   380 BHM = (JNG, FKB)
   -1   381 CQK = (SVD, KVN)
   -1   382 BXT = (GMX, MGB)
   -1   383 TTR = (DLC, LDT)
   -1   384 NQM = (LHX, LDX)
   -1   385 VGF = (NFD, CCP)
   -1   386 SVK = (VCQ, QVL)
   -1   387 CPJ = (MVT, BMB)
   -1   388 FLD = (JKN, MBD)
   -1   389 RKV = (QMT, BVQ)
   -1   390 HGH = (SDP, JFV)
   -1   391 AAA = (FCS, HHF)
   -1   392 QLG = (VXS, XJD)
   -1   393 PFP = (MSK, NSG)
   -1   394 KTT = (CQG, JDQ)
   -1   395 BMB = (FRD, KGC)
   -1   396 NNT = (GBL, FBT)
   -1   397 LGS = (LBJ, GTH)
   -1   398 XVR = (KGN, LFP)
   -1   399 RTL = (VRJ, KXJ)
   -1   400 FTS = (KDB, VVN)
   -1   401 MNP = (BFL, HMJ)
   -1   402 MLF = (FSR, GSB)
   -1   403 PJN = (KGK, FGC)
   -1   404 HNB = (GKK, TXG)
   -1   405 GNQ = (BRM, HST)
   -1   406 SXM = (JRD, FDS)
   -1   407 RXX = (KPB, PQV)
   -1   408 JMM = (GSP, JBD)
   -1   409 DLP = (PHG, LGF)
   -1   410 XCN = (KJN, SBX)
   -1   411 DBC = (DPM, GBQ)
   -1   412 TCP = (NGD, VRM)
   -1   413 XHX = (NBT, QRK)
   -1   414 PDR = (SNT, BDR)
   -1   415 VCJ = (NSV, QQF)
   -1   416 DLM = (CKX, CQB)
   -1   417 KXT = (PBS, HBQ)
   -1   418 SSS = (TPN, KQB)
   -1   419 JMR = (SNX, XCN)
   -1   420 QQF = (JPD, XTF)
   -1   421 GVQ = (FLQ, RQG)
   -1   422 NFJ = (BXB, DSC)
   -1   423 DQN = (DGG, DDB)
   -1   424 MSC = (RDT, DVC)
   -1   425 JBH = (DNK, JSK)
   -1   426 BVN = (HKF, VQC)
   -1   427 DTF = (LVP, HCB)
   -1   428 JNG = (CRM, BCH)
   -1   429 HRJ = (RKK, FDK)
   -1   430 BTJ = (DLM, LFM)
   -1   431 LSN = (HST, BRM)
   -1   432 TMS = (BCM, MJT)
   -1   433 XGB = (TPN, KQB)
   -1   434 KGK = (VGF, HKG)
   -1   435 MVT = (KGC, FRD)
   -1   436 BJA = (CBD, MDP)
   -1   437 QBB = (RVG, DGQ)
   -1   438 PPC = (RXX, STT)
   -1   439 JKM = (CBS, JVV)
   -1   440 FBT = (QPF, CQK)
   -1   441 TBC = (DHD, SJK)
   -1   442 RXR = (CGP, FJQ)
   -1   443 TGL = (XSM, XSM)
   -1   444 LQC = (MLF, RVR)
   -1   445 HTF = (RKJ, HRJ)
   -1   446 GJM = (XVR, NJK)
   -1   447 BFL = (DVX, DVR)
   -1   448 LHK = (JBD, GSP)
   -1   449 HQQ = (QLJ, STX)
   -1   450 DSP = (RLT, PQD)
   -1   451 BCR = (KJM, FTS)
   -1   452 NBT = (BMD, THN)
   -1   453 VLD = (KCF, CTQ)
   -1   454 DVJ = (LMX, CTL)
   -1   455 CCP = (RJJ, DSP)
   -1   456 HFT = (LJV, BQM)
   -1   457 QXX = (MRQ, HFD)
   -1   458 KHB = (CJG, TGN)
   -1   459 FHV = (DJC, TKB)
   -1   460 VQC = (RFG, TVD)
   -1   461 QHP = (THS, QTN)
   -1   462 NKN = (CJV, BBG)
   -1   463 LVF = (MLF, RVR)
   -1   464 NLM = (FNN, BHM)
   -1   465 PRP = (RRR, PMJ)
   -1   466 FJQ = (KHF, CMS)
   -1   467 HLH = (GST, VXQ)
   -1   468 CBF = (LVH, HXP)
   -1   469 LHX = (QTM, DQN)
   -1   470 KPB = (NJF, RXR)
   -1   471 HSK = (KHB, VPS)
   -1   472 PKJ = (LGS, RVP)
   -1   473 RHF = (XKP, HNB)
   -1   474 SNT = (CJB, VPN)
   -1   475 PGD = (NTQ, VJK)
   -1   476 JHM = (LPK, RXK)
   -1   477 VLF = (QLJ, STX)
   -1   478 SJK = (KNB, TRL)
   -1   479 TNK = (PDR, JLX)
   -1   480 NNX = (HCB, LVP)
   -1   481 CDH = (DQQ, TKF)
   -1   482 RMX = (GLT, VGS)
   -1   483 BHN = (DBB, HQJ)
   -1   484 VVC = (LDX, LHX)
   -1   485 QXZ = (MDP, CBD)
   -1   486 MQL = (NKN, DSB)
   -1   487 NJR = (NHG, DQH)
   -1   488 JFL = (RTV, DJD)
   -1   489 GVD = (NBR, PGN)
   -1   490 GBL = (QPF, CQK)
   -1   491 QCF = (XTV, JHM)
   -1   492 TXG = (DHT, CKS)
   -1   493 DDN = (RXF, JXX)
   -1   494 LFP = (MVG, DCX)
   -1   495 NVV = (HBQ, PBS)
   -1   496 PVC = (CLQ, GVQ)
   -1   497 KVX = (FTR, HSX)
   -1   498 JTN = (MBD, JKN)
   -1   499 CLQ = (RQG, FLQ)
   -1   500 MPP = (QGM, DNC)
   -1   501 CBS = (VBK, XKT)
   -1   502 BCK = (MTB, LTK)
   -1   503 FFS = (VSS, CDG)
   -1   504 QVP = (QQT, GGK)
   -1   505 VSX = (JLF, CCT)
   -1   506 CRR = (QNG, QXX)
   -1   507 TRL = (HLJ, SDK)
   -1   508 VRJ = (XMC, PDX)
   -1   509 HLJ = (DBN, JFL)
   -1   510 THC = (DJL, BSC)
   -1   511 JLN = (BRG, HGH)
   -1   512 FDS = (HFH, HFT)
   -1   513 NGD = (RTX, BTX)
   -1   514 DQQ = (JMR, NKB)
   -1   515 KDB = (PRQ, KRL)
   -1   516 QBR = (CRS, GLL)
   -1   517 VSP = (VXR, VXR)
   -1   518 DBN = (RTV, DJD)
   -1   519 KJJ = (DJB, DJM)
   -1   520 QTN = (CTS, GFF)
   -1   521 DVK = (QRX, RCT)
   -1   522 DBB = (MHD, NHB)
   -1   523 RCX = (LBT, RSV)
   -1   524 GSN = (FTS, KJM)
   -1   525 CDQ = (RHF, LSV)
   -1   526 CMM = (QLG, XMX)
   -1   527 HFH = (LJV, BQM)
   -1   528 QLJ = (MNC, LPM)
   -1   529 HXV = (HTF, LJT)
   -1   530 LTN = (JDT, JDT)
   -1   531 GVR = (XGL, QVP)
   -1   532 RDG = (QCF, XRT)
   -1   533 BJH = (PGX, KGT)
   -1   534 DJK = (FQM, BLT)
   -1   535 RKK = (NKX, VPH)
   -1   536 RXH = (DBC, SQJ)
   -1   537 TFN = (MGB, GMX)
   -1   538 XKT = (CKT, GQF)
   -1   539 ZZZ = (HHF, FCS)
   -1   540 KVN = (VVC, NQM)
   -1   541 XSN = (NBG, QMC)
   -1   542 DFS = (NBR, PGN)
   -1   543 CHS = (LKF, TLK)
   -1   544 HXJ = (KXD, JVR)
   -1   545 SJD = (RGB, FNR)
   -1   546 CQR = (NLF, TQN)
   -1   547 MMD = (LLC, LLC)
   -1   548 RTX = (KGX, RSJ)
   -1   549 RQG = (RTL, LNP)
   -1   550 DVR = (GCB, MQL)
   -1   551 MCT = (LBT, RSV)
   -1   552 MTB = (MCT, RCX)
   -1   553 RGN = (XNJ, LHJ)
   -1   554 VJK = (FDV, VCJ)
   -1   555 CFR = (NTQ, VJK)
   -1   556 RST = (SSH, FDD)
   -1   557 MSL = (GVD, DFS)
   -1   558 DGL = (XJV, MPS)
   -1   559 FCV = (BXT, TFN)
   -1   560 KCG = (TTR, GDH)
   -1   561 GJS = (KCK, CQH)
   -1   562 HQX = (GVR, QNZ)
   -1   563 CFG = (MMP, NGC)
   -1   564 CJG = (BGB, QVG)
   -1   565 RSV = (PGJ, CJP)
   -1   566 VTB = (BFF, CHP)
   -1   567 BDR = (VPN, CJB)
   -1   568 LPM = (QBB, HLS)
   -1   569 VSK = (RDT, DVC)
   -1   570 PBH = (LDQ, MNP)
   -1   571 CFH = (MPB, GKD)
   -1   572 DQH = (BHN, BQR)
   -1   573 KPM = (TFT, QGN)
   -1   574 TBN = (HJB, DVJ)
   -1   575 JDT = (GVR, GVR)
   -1   576 GDH = (DLC, LDT)
   -1   577 VNJ = (TBC, VLG)
   -1   578 PDX = (JSJ, LFG)
   -1   579 DLC = (RST, BMN)
   -1   580 CHG = (DJP, CMM)
   -1   581 JLT = (DGH, DGH)
   -1   582 MVX = (TSR, VXH)
   -1   583 GGX = (NDG, TGG)
   -1   584 RCT = (VCX, GTF)
   -1   585 MCB = (RXF, JXX)
   -1   586 LNT = (TDR, XSJ)
   -1   587 GST = (PQN, PQN)
   -1   588 CTQ = (CQR, PLG)
   -1   589 LVP = (XSL, CDH)
   -1   590 DQC = (LDQ, MNP)
   -1   591 VCX = (KVX, SSN)
   -1   592 BQR = (DBB, HQJ)
   -1   593 TSR = (CFK, NTC)
   -1   594 SFC = (DTN, JQT)
   -1   595 THN = (BJH, XKX)
   -1   596 MBD = (HTB, SVX)
   -1   597 NFD = (DSP, RJJ)
   -1   598 TQN = (FPM, RVB)
   -1   599 SVA = (FXQ, KJJ)
   -1   600 BRG = (JFV, SDP)
   -1   601 FQM = (GQV, GQV)
   -1   602 GLL = (SXM, QXK)
   -1   603 NJF = (FJQ, CGP)
   -1   604 VPN = (GLH, GRV)
   -1   605 PMJ = (FTV, SQC)
   -1   606 QQT = (SFC, QVB)
   -1   607 SNM = (CBS, JVV)
   -1   608 JXX = (TBK, DJK)
   -1   609 HLS = (DGQ, RVG)
   -1   610 RHH = (FBT, GBL)
   -1   611 VXQ = (PQN, KRV)
   -1   612 DVX = (GCB, MQL)
   -1   613 GKK = (DHT, CKS)
   -1   614 SJV = (DBF, PCV)
   -1   615 BRK = (TFV, TXN)
   -1   616 MLL = (DBF, PCV)
   -1   617 GGK = (SFC, QVB)
   -1   618 HLX = (CRP, JMX)
   -1   619 FKB = (BCH, CRM)
   -1   620 GQC = (PHG, LGF)
   -1   621 QXK = (FDS, JRD)
   -1   622 HXP = (QNJ, DCJ)
   -1   623 SVD = (NQM, VVC)
   -1   624 FBS = (TDX, JMT)
   -1   625 QVB = (JQT, DTN)
   -1   626 QMT = (RCF, QHP)
   -1   627 PNC = (NJK, XVR)
   -1   628 RXK = (NFJ, NCK)
   -1   629 GJQ = (GSN, BCR)
   -1   630 KRL = (FLM, XGJ)
   -1   631 QPF = (SVD, KVN)
   -1   632 KNF = (NDG, NDG)
   -1   633 GQF = (KGF, CHG)
   -1   634 KLP = (BRG, HGH)
   -1   635 XJD = (DDF, DVK)
   -1   636 GFA = (VNG, GGP)
   -1   637 TGN = (QVG, BGB)
   -1   638 NGQ = (GDH, TTR)
   -1   639 CCK = (GST, VXQ)
   -1   640 MPB = (GMH, LHM)
   -1   641 CJB = (GLH, GRV)
   -1   642 BBG = (KLG, MXH)
   -1   643 CTJ = (DLP, GQC)
   -1   644 JPD = (SFB, FBS)
   -1   645 VHV = (VKQ, SJD)
   -1   646 NTQ = (VCJ, FDV)
   -1   647 RVB = (CSS, KNN)
   -1   648 GLT = (NGB, BRK)
   -1   649 DHD = (TRL, KNB)
   -1   650 TDR = (VNN, RDG)
   -1   651 FBZ = (QKX, VQD)
   -1   652 PQN = (JLT, JLT)
   -1   653 PQV = (NJF, RXR)
   -1   654 RHQ = (BLP, DRK)
   -1   655 QRK = (THN, BMD)
   -1   656 KNR = (CCT, JLF)
   -1   657 TJN = (PQR, GRG)
   -1   658 BSQ = (DGH, BRZ)
   -1   659 MPS = (JGC, VTM)
   -1   660 BMF = (RKB, QBR)
   -1   661 QNJ = (VSX, KNR)
   -1   662 STS = (CJK, LFH)
   -1   663 NMP = (HQQ, VLF)
   -1   664 HKF = (TVD, RFG)
   -1   665 FPM = (KNN, CSS)
   -1   666 PXS = (DRV, TCP)
   -1   667 TJS = (LNJ, KKM)
   -1   668 LFM = (CQB, CKX)
   -1   669 SSN = (FTR, HSX)
   -1   670 CQG = (XHX, VDV)
   -1   671 QVG = (CPJ, KVD)
   -1   672 BCH = (STS, NFQ)
   -1   673 NBG = (KBR, JBH)
   -1   674 XMC = (JSJ, LFG)
   -1   675 LMX = (QCP, DFG)
   -1   676 RXF = (TBK, TBK)
   -1   677 MLP = (CHS, PHQ)
   -1   678 JVV = (VBK, XKT)
   -1   679 MGB = (RKV, XLD)
   -1   680 KKM = (BNT, GPT)
   -1   681 GCR = (HQQ, VLF)
   -1   682 LHM = (DDN, MCB)
   -1   683 XNG = (QVL, VCQ)
   -1   684 FPS = (FKP, LGK)
   -1   685 BRZ = (GGP, VNG)
   -1   686 JQL = (PGD, CFR)
   -1   687 RRR = (FTV, SQC)
   -1   688 CKT = (KGF, CHG)
   -1   689 VVN = (KRL, PRQ)
   -1   690 BCM = (DGJ, JSF)
   -1   691 PGX = (NNT, RHH)
   -1   692 DFG = (JTH, RHP)
   -1   693 JGC = (LSN, GNQ)
   -1   694 RCF = (THS, QTN)
   -1   695 DMS = (LFM, DLM)
   -1   696 VHT = (FFX, VLD)
   -1   697 LGK = (JGJ, JPR)
   -1   698 LKF = (TJS, RFL)
   -1   699 KGN = (MVG, DCX)
   -1   700 KLK = (QGX, JST)
   -1   701 KJN = (HLX, CBT)
   -1   702 LXL = (VHV, FQN)
   -1   703 RFG = (FCV, MXP)
   -1   704 DVC = (PBH, DQC)
   -1   705 PTV = (FKP, LGK)
   -1   706 KJM = (VVN, KDB)
   -1   707 SQJ = (DPM, GBQ)
   -1   708 GQV = (FCS, HHF)
   -1   709 QNG = (MRQ, MRQ)
   -1   710 HQJ = (MHD, NHB)
   -1   711 VNG = (VBS, PPL)
   -1   712 NFQ = (CJK, LFH)
   -1   713 TKF = (NKB, JMR)
   -1   714 JGJ = (GNP, LVV)
   -1   715 XVQ = (PCQ, PCQ)
   -1   716 JPR = (LVV, GNP)

diff --git a/2023/08/solution.rs b/2023/08/solution.rs

@@ -0,0 +1,172 @@
   -1     1 use std::collections::HashMap;
   -1     2 
   -1     3 #[path = "../lib.rs"]
   -1     4 mod lib;
   -1     5 
   -1     6 fn str2int(s: &str) -> u32 {
   -1     7     return s
   -1     8         .bytes()
   -1     9         .enumerate()
   -1    10         .map(|(i, b)| (b as u32) << (i * 8))
   -1    11         .sum();
   -1    12 }
   -1    13 
   -1    14 fn parse() -> (Vec<bool>, HashMap<u32, (u32, u32)>) {
   -1    15     let mut state = 0;
   -1    16     let mut dirs = vec![];
   -1    17     let mut nodes = HashMap::new();
   -1    18 
   -1    19     for line in lib::iter_input() {
   -1    20         match state {
   -1    21             0 => {
   -1    22                 dirs = line.chars().map(|c| c == 'R').collect();
   -1    23                 state = 1;
   -1    24             }
   -1    25             1 => {
   -1    26                 state = 2;
   -1    27             }
   -1    28             2 => {
   -1    29                 let name = str2int(&line[0..3]);
   -1    30                 let left = str2int(&line[7..10]);
   -1    31                 let right = str2int(&line[12..15]);
   -1    32                 nodes.insert(name, (left, right));
   -1    33             }
   -1    34             _ => unreachable!(),
   -1    35         }
   -1    36     }
   -1    37 
   -1    38     return (dirs, nodes);
   -1    39 }
   -1    40 
   -1    41 fn lcm(offset1: usize, period1: usize, offset2: usize, period2: usize) -> Option<(usize, usize)> {
   -1    42     // https://neddit.ce9e.org/r/learnprogramming/comments/7bcw31/least_common_multiple_with_an_offset/dphce2j/
   -1    43     //
   -1    44     // The actual input data always has offset = period.
   -1    45     // But I have spent far too much time on this to throw it away.
   -1    46 
   -1    47     let mut steps = vec![period1.min(period2), period1.max(period2)];
   -1    48     while steps[0] != 0 {
   -1    49         steps.insert(0, steps[1] % steps[0]);
   -1    50     }
   -1    51 
   -1    52     let period = period1 * period2 / steps[1];
   -1    53 
   -1    54     let gcd = steps[1] as i64;
   -1    55     let d_offset = offset2 as i64 - offset1 as i64;
   -1    56     let p1 = period1 as i64;
   -1    57     let p2 = period2 as i64;
   -1    58 
   -1    59     if d_offset % gcd == 0 {
   -1    60         // a * steps[i + 1] - b * steps[i] = d_offset
   -1    61         let mut a = d_offset / gcd;
   -1    62         let mut b = 0;
   -1    63 
   -1    64         for i in 0..(steps.len() - 2) {
   -1    65             // steps[i] = steps[i + 2] - x * steps[i + 1]
   -1    66             let x = (steps[i + 2] / steps[i + 1]) as i64;
   -1    67             (a, b) = (-b, -(a + b * x));
   -1    68         }
   -1    69 
   -1    70         if period1 < period2 {
   -1    71             (a, b) = (-b, -a);
   -1    72         }
   -1    73 
   -1    74         let af = lib::div_floor(a, p2 / gcd);
   -1    75         let bf = lib::div_floor(b, p1 / gcd);
   -1    76         a -= af.min(bf) * (p2 / gcd);
   -1    77 
   -1    78         let offset = offset1 + (a as usize) * period1;
   -1    79 
   -1    80         return Some((offset, period));
   -1    81     } else {
   -1    82         return None;
   -1    83     }
   -1    84 }
   -1    85 
   -1    86 fn walk_one<F: Fn(u32) -> bool>(
   -1    87     start: u32,
   -1    88     is_end: F,
   -1    89     dirs: &Vec<bool>,
   -1    90     nodes: &HashMap<u32, (u32, u32)>,
   -1    91 ) -> (Vec<usize>, usize) {
   -1    92     let mut pos = start;
   -1    93     let mut steps = 0;
   -1    94     let mut offsets = vec![];
   -1    95     let mut first = (0, 0);
   -1    96     loop {
   -1    97         let rel = steps % dirs.len();
   -1    98 
   -1    99         if is_end(pos) {
   -1   100             if first == (0, 0) {
   -1   101                 first = (pos, rel);
   -1   102             } else if first == (pos, rel) {
   -1   103                 let period = steps - offsets[0];
   -1   104                 return (offsets, period);
   -1   105             }
   -1   106             offsets.push(steps);
   -1   107         }
   -1   108 
   -1   109         let (left, right) = nodes.get(&pos).unwrap();
   -1   110         pos = if dirs[rel] { *right } else { *left };
   -1   111         steps += 1;
   -1   112     }
   -1   113 }
   -1   114 
   -1   115 fn walk<F: Fn(u32) -> bool>(
   -1   116     starts: &Vec<u32>,
   -1   117     is_end: F,
   -1   118     dirs: &Vec<bool>,
   -1   119     nodes: &HashMap<u32, (u32, u32)>,
   -1   120 ) -> usize {
   -1   121     let mut first = true;
   -1   122     let mut candidates = vec![];
   -1   123 
   -1   124     for start in starts.iter() {
   -1   125         let (offsets, period) = walk_one(*start, &is_end, dirs, nodes);
   -1   126 
   -1   127         if first {
   -1   128             for offset in offsets.iter() {
   -1   129                 candidates.push((*offset, period));
   -1   130             }
   -1   131             first = false;
   -1   132         } else {
   -1   133             let mut new = vec![];
   -1   134             for offset in offsets.iter() {
   -1   135                 for (offset2, period2) in candidates.iter() {
   -1   136                     match lcm(*offset, period, *offset2, *period2) {
   -1   137                         Some(x) => {
   -1   138                             new.push(x);
   -1   139                         }
   -1   140                         None => {}
   -1   141                     }
   -1   142                 }
   -1   143             }
   -1   144 
   -1   145             candidates = new;
   -1   146         }
   -1   147     }
   -1   148 
   -1   149     return candidates
   -1   150         .iter()
   -1   151         .map(|(offset, _period)| *offset)
   -1   152         .min()
   -1   153         .unwrap();
   -1   154 }
   -1   155 
   -1   156 fn main() {
   -1   157     let (dirs, nodes) = parse();
   -1   158 
   -1   159     let starts1 = vec![str2int("AAA")];
   -1   160     let is_end1 = |pos| pos == str2int("ZZZ");
   -1   161     let steps1 = walk(&starts1, is_end1, &dirs, &nodes);
   -1   162     println!("part1: {}", steps1);
   -1   163 
   -1   164     let starts2 = nodes
   -1   165         .keys()
   -1   166         .map(|x| *x)
   -1   167         .filter(|&pos| (pos >> 16) as u8 == b'A')
   -1   168         .collect();
   -1   169     let is_end2 = |pos| (pos >> 16) as u8 == b'Z';
   -1   170     let steps2 = walk(&starts2, is_end2, &dirs, &nodes);
   -1   171     println!("part2: {}", steps2);
   -1   172 }

diff --git a/2023/08/test1.txt b/2023/08/test1.txt

@@ -0,0 +1,9 @@
   -1     1 RL
   -1     2 
   -1     3 AAA = (BBB, CCC)
   -1     4 BBB = (DDD, EEE)
   -1     5 CCC = (ZZZ, GGG)
   -1     6 DDD = (DDD, DDD)
   -1     7 EEE = (EEE, EEE)
   -1     8 GGG = (GGG, GGG)
   -1     9 ZZZ = (ZZZ, ZZZ)

diff --git a/2023/08/test2.txt b/2023/08/test2.txt

@@ -0,0 +1,5 @@
   -1     1 LLR
   -1     2 
   -1     3 AAA = (BBB, BBB)
   -1     4 BBB = (AAA, ZZZ)
   -1     5 ZZZ = (ZZZ, ZZZ)

diff --git a/2023/08/test3.txt b/2023/08/test3.txt

@@ -0,0 +1,10 @@
   -1     1 LR
   -1     2 
   -1     3 11A = (11B, XXX)
   -1     4 11B = (XXX, 11Z)
   -1     5 11Z = (11B, XXX)
   -1     6 22A = (22B, XXX)
   -1     7 22B = (22C, 22C)
   -1     8 22C = (22Z, 22Z)
   -1     9 22Z = (22B, 22B)
   -1    10 XXX = (XXX, XXX)

diff --git a/2023/lib.rs b/2023/lib.rs

@@ -8,3 +8,13 @@ pub fn iter_input() -> impl Iterator<Item = String> {
    8     8     let file = File::open(path).unwrap();
    9     9     return BufReader::new(file).lines().map(|l| l.unwrap());
   10    10 }
   -1    11 
   -1    12 #[allow(dead_code)]
   -1    13 pub fn div_floor(a: i64, b: i64) -> i64 {
   -1    14     let x = a / b;
   -1    15     if (b > 0 && x * b > a) || (b < 0 && x * b < a) {
   -1    16         return x - 1;
   -1    17     } else {
   -1    18         return x;
   -1    19     }
   -1    20 }