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