Browse Source

solve advent of code 2023 08

Mistivia 1 year ago
parent
commit
5898fa29a5
3 changed files with 907 additions and 0 deletions
  1. 47 0
      advent-of-code/2023/08/1.rkt
  2. 60 0
      advent-of-code/2023/08/2.rkt
  3. 800 0
      advent-of-code/2023/08/input

+ 47 - 0
advent-of-code/2023/08/1.rkt

@@ -0,0 +1,47 @@
+#lang racket
+
+(require "../../lib/utils.rkt")
+
+(define lines
+  (call-with-input-file "input"
+    (lambda (fp)
+      (get-lines fp))))
+
+(define instructions (string->list (car lines)))
+
+(define (make-instruction-generator)
+  (define cur instructions)
+  (lambda ()
+    (when (null? cur)
+      (set! cur instructions))
+    (define ret (car cur))
+    (set! cur (cdr cur))
+    ret))
+
+(define next-instruction (make-instruction-generator))
+
+(set! lines (cddr lines))
+
+(define (parse-map str)
+  (define p1 (string-split str "="))
+  (define key (string-trim (car p1)))
+  (define val-str (string-trim (cadr p1)))
+  (define value (list (substring val-str 1 4) (substring val-str 6 9)))
+  (cons key value))
+
+(define the-map (make-hash (map parse-map lines)))
+
+(define (simulate start end)
+  (let loop ((i 0) (cur start))
+    (if (string=? cur end)
+      i
+      (let ()
+        (define instruction (next-instruction))
+        (define mapping (hash-ref the-map cur))
+        (define next
+          (if (char=? instruction #\L)
+            (car mapping)
+            (cadr mapping)))
+        (loop (+ 1 i) next)))))
+
+(simulate "AAA" "ZZZ")

+ 60 - 0
advent-of-code/2023/08/2.rkt

@@ -0,0 +1,60 @@
+#lang racket
+
+(require "../../lib/utils.rkt")
+
+(define lines
+  (call-with-input-file "input"
+    (lambda (fp)
+      (get-lines fp))))
+
+(define instructions (string->list (car lines)))
+
+(define (make-instruction-generator)
+  (define cur instructions)
+  (lambda ()
+    (when (null? cur)
+      (set! cur instructions))
+    (define ret (car cur))
+    (set! cur (cdr cur))
+    ret))
+
+(define next-instruction (make-instruction-generator))
+
+(set! lines (cddr lines))
+
+(define (parse-map str)
+  (define p1 (string-split str "="))
+  (define key (string-trim (car p1)))
+  (define val-str (string-trim (cadr p1)))
+  (define value (list (substring val-str 1 4) (substring val-str 6 9)))
+  (cons key value))
+
+(define the-map (make-hash (map parse-map lines)))
+
+(define (is-start? str)
+  (char=? #\A (string-ref str 2)))
+
+(define (is-end? str)
+  (char=? #\Z (string-ref str 2)))
+
+(define (simulate start)
+  (let loop ((i 0) (cur start))
+    (if (is-end? cur)
+      i
+      (let ()
+        (define instruction (next-instruction))
+        (define (next-point point)
+          (define mapping (hash-ref the-map point))
+          (if (char=? instruction #\L)
+            (car mapping)
+            (cadr mapping)))
+        (loop (+ 1 i) (next-point cur))))))
+
+
+(define starts
+  (let ()
+    (define lst (hash->list the-map))
+    (define keys (map car lst))
+    (filter is-start? keys)))
+
+(apply lcm (map simulate starts))

+ 800 - 0
advent-of-code/2023/08/input

@@ -0,0 +1,800 @@
+LLRLRLLRRLRLRLLRRLRRRLRRRLRRLRRLRLRLRRRLLRLRRLRLRRRLRLLRRLRLRLLRRRLLRLRRRLRLRRLRRLRLLRRLRRLRLRLRLLRLLRRLRRLRRLRRLRRLRLLRLRLRRRLRRRLRRLRLRLRRLRRRLRLRRRLRLRLRLRRRLRRLRRLRRRLLLLRRLRRLRLRRRLRLRRRLRRLLLLRLRLRRRLRRRLRLRRLLRLRLRRRLRLRLRRRLRLLRRRLRRLRLRLRRRLRLLRRLLRRRLRRRLRRRLRRLRLRLRRRLRRRLRRRLLRRRR
+
+NNN = (TNT, XDJ)
+GKJ = (TQD, PDP)
+VPC = (TST, FDJ)
+MNG = (GQS, RVK)
+JQF = (LLK, BQH)
+HPS = (XDJ, TNT)
+VSD = (GNK, HJS)
+VGT = (KXR, FMP)
+GQB = (GTX, HLC)
+PLJ = (QCS, TVN)
+BXM = (GMB, LBC)
+XJQ = (NHG, NQD)
+NKX = (KBJ, GTS)
+PKT = (XFK, SKR)
+HJB = (LRX, KQG)
+SNM = (PLN, CJT)
+LQD = (MTK, KMS)
+KTN = (SSC, KPL)
+LVJ = (CQJ, GPP)
+GSV = (SNM, JKK)
+CPH = (DCQ, FCP)
+TDV = (JFD, HKH)
+SBS = (NFC, CGC)
+DBG = (GST, LGH)
+LHS = (GHG, TRD)
+BPP = (DLF, NJT)
+TNT = (VNX, PTR)
+VTN = (XHM, NMQ)
+BRD = (KLF, HXJ)
+TJT = (BVD, PFN)
+GNK = (NMT, LLX)
+DVH = (GQS, RVK)
+KRJ = (QSP, TTQ)
+KQC = (TNX, MDC)
+XVS = (LRC, DLC)
+XLP = (XCH, BJQ)
+KQG = (LKK, TVP)
+QHB = (JPL, JPL)
+RGV = (SXB, FKH)
+GSK = (JQN, THB)
+XDT = (GLG, XKD)
+XCT = (MMN, XDM)
+KLF = (NPB, RRB)
+XLT = (QRB, VHB)
+HKS = (NNN, HPS)
+NMT = (MSL, VXC)
+PML = (NHN, FQH)
+FMQ = (HGC, FBH)
+JGG = (XTB, XTB)
+KMC = (PPS, SVT)
+GLG = (SPG, KFK)
+QJN = (HJB, QCP)
+SGH = (FDV, QPX)
+DFM = (BFX, PNS)
+CSK = (MDQ, GFX)
+MXG = (MXC, BJV)
+JTX = (SQN, JBK)
+KFN = (VQM, PFH)
+SFJ = (KDF, NKB)
+JNK = (DLK, LHV)
+DTG = (XHQ, DSR)
+SHC = (FQV, HKK)
+DBM = (VDP, PGK)
+PNC = (LMH, RXH)
+HXJ = (RRB, NPB)
+MKS = (KMX, FKS)
+NPA = (TPC, SNK)
+LJK = (FPF, SHP)
+LBH = (HQB, TTC)
+JML = (LTN, SFS)
+MXS = (FDL, SXH)
+HHV = (VRL, JVC)
+NQD = (KVJ, DXM)
+HMA = (TVC, RBX)
+BCP = (SQD, RGD)
+SLP = (CQF, HXG)
+KGF = (RPN, PKQ)
+TGG = (VQM, PFH)
+HQD = (MDV, GND)
+BJX = (LCN, QMG)
+NBQ = (NSV, VJR)
+BBX = (KHG, FDC)
+SSQ = (BNQ, MXX)
+TST = (MJB, TDV)
+JQL = (SDG, DLJ)
+TVN = (SJM, KMC)
+XHD = (DDG, RSG)
+GQA = (NQS, CNH)
+QFL = (QSQ, VVN)
+THG = (FBM, VQX)
+QLZ = (RBX, TVC)
+TPM = (DQN, MGG)
+QXV = (MTK, KMS)
+VNX = (PTP, VSD)
+STQ = (XDC, JFR)
+XVQ = (PJM, MRN)
+XTT = (BHF, RBR)
+LQS = (DBB, HNR)
+KXG = (FKS, KMX)
+XCP = (MXK, DBX)
+QRV = (JSK, STC)
+VVG = (DRF, QNR)
+FTC = (CSK, FPC)
+GFV = (VSK, GFQ)
+JSM = (LNC, XTF)
+LJC = (JFG, XBK)
+TQD = (XJQ, MFM)
+HJS = (LLX, NMT)
+CBP = (PTX, LGD)
+LGT = (CTD, CTD)
+HMP = (FQJ, KGC)
+MSL = (MSD, BFL)
+QPX = (QFH, JMK)
+KBH = (MGF, TMH)
+XMT = (MXC, BJV)
+XGR = (KPF, DLH)
+RGH = (MBM, KNT)
+CDP = (BLG, NVN)
+BLG = (TQC, DTD)
+MSD = (RVP, RQP)
+KXT = (CVM, JQL)
+MRN = (MNX, PNC)
+RLG = (BNP, VNR)
+PSH = (XQG, SLP)
+XTF = (NTT, VGT)
+KVJ = (JVX, HPJ)
+PGF = (KRJ, CRS)
+VSV = (NKQ, PJG)
+TLV = (QHJ, GFG)
+BNP = (NFR, PGR)
+XQG = (CQF, HXG)
+KGC = (FKF, KCS)
+HQF = (QPX, FDV)
+PFN = (JGX, FMQ)
+HFD = (DBG, CBD)
+KQZ = (HXJ, KLF)
+HPM = (VSV, LTR)
+FGX = (SVR, GQB)
+SGJ = (THB, JQN)
+NKK = (QHB, QHB)
+FLF = (RLC, MXP)
+SRV = (QHM, LQS)
+NPB = (BPG, CVQ)
+VNR = (NFR, PGR)
+FNF = (TXL, CXT)
+PTB = (QXQ, BDK)
+BXN = (HQF, SGH)
+RGT = (MGN, GFN)
+FSP = (VRK, QNN)
+GHT = (PML, HTJ)
+CBD = (LGH, GST)
+LMH = (TJC, DNN)
+PTP = (GNK, HJS)
+XDC = (GHT, JTR)
+HTJ = (NHN, FQH)
+XFK = (NKX, HTV)
+PBP = (CJJ, GKS)
+KMX = (XSJ, PMK)
+CVQ = (FKX, GXP)
+SFV = (MXS, FLR)
+BQH = (VMH, PKT)
+NFR = (RTX, SBJ)
+KCS = (XGR, JXT)
+GND = (SFJ, DGL)
+DTF = (JCC, LVC)
+KLM = (XLP, QRQ)
+VQV = (DNC, SST)
+NKF = (KFN, TGG)
+CJT = (LDP, QKM)
+NPF = (TNC, LXF)
+MHK = (MLX, NHX)
+LGD = (DLP, CNJ)
+MLF = (QKK, QRK)
+LQB = (NKJ, SHN)
+SNS = (KMV, HCG)
+VPN = (HFV, LNX)
+XTB = (XLT, VRF)
+LNX = (HFB, QVF)
+XGF = (NRN, KCF)
+PNS = (JNQ, MCT)
+BJG = (DNC, SST)
+PQN = (SCL, VPX)
+NGQ = (DGT, RLF)
+GGX = (LQS, QHM)
+VVT = (MHK, LTJ)
+QJH = (XTF, LNC)
+BBP = (FNX, RTK)
+DDP = (JBR, KLD)
+GDV = (KXT, BJT)
+GDT = (CFB, PSH)
+LGH = (CRK, SCF)
+JNB = (DXQ, FBK)
+DLH = (XJD, GDT)
+NCQ = (MXP, RLC)
+LXP = (SPR, RTF)
+GRQ = (FNX, RTK)
+KBJ = (DNB, TDP)
+LXK = (CTD, JML)
+DBB = (TJD, FNF)
+RBR = (JTX, XKN)
+GPD = (LXN, PLD)
+JNM = (QRM, MSV)
+LNC = (VGT, NTT)
+GVT = (VVN, QSQ)
+KCD = (GFB, MFL)
+HDG = (VFQ, DTF)
+RGD = (GGX, SRV)
+KJK = (SRJ, QGV)
+DSL = (MNG, DVH)
+DSR = (VQV, BJG)
+NHB = (HPS, NNN)
+JVX = (JRT, GDQ)
+TGB = (DCG, VXK)
+MXN = (PST, GBF)
+CTP = (XGM, SFV)
+BPG = (GXP, FKX)
+HRT = (LXF, TNC)
+SST = (HDG, VJS)
+PDP = (XJQ, MFM)
+BDK = (TFM, GRM)
+PPS = (RQV, BXN)
+SSS = (TJQ, GNQ)
+TXL = (QRV, PPH)
+RRQ = (RXF, PGF)
+PSX = (LLM, FXM)
+FBK = (JDQ, DSX)
+JLR = (LSM, NXT)
+SPR = (DTG, RKQ)
+PGC = (TJT, HXC)
+LLD = (LHS, RLV)
+NRH = (XBB, FGX)
+SXH = (HMP, LSK)
+JVC = (MLN, XKM)
+MGF = (GGT, XMS)
+TTS = (TNX, TNX)
+FCP = (PLJ, KND)
+LRX = (TVP, LKK)
+VKJ = (PGN, XPX)
+VRL = (XKM, MLN)
+RQV = (SGH, HQF)
+CRS = (QSP, TTQ)
+BJC = (FCJ, TSC)
+CSP = (BNM, FLN)
+XHQ = (BJG, VQV)
+CRK = (DKC, QQQ)
+HFB = (BVM, VMP)
+SQN = (QJN, KKV)
+DGK = (FVX, RGT)
+HTP = (HCF, HFR)
+RFT = (NMF, DRL)
+TRJ = (SHN, NKJ)
+XJD = (PSH, CFB)
+FQJ = (FKF, KCS)
+VHB = (KDM, DSB)
+SKR = (NKX, HTV)
+LCN = (TLV, FMC)
+MTC = (PST, GBF)
+QRK = (XNR, SPD)
+TCK = (MDK, BCP)
+DNN = (HHV, MVS)
+JNQ = (PBP, VDG)
+NKQ = (MKX, HVD)
+FTV = (MNG, DVH)
+SJM = (SVT, PPS)
+KCB = (NKK, CNF)
+KJN = (PRV, BVK)
+PRV = (SVP, FTM)
+HFV = (HFB, QVF)
+NFC = (FVC, TBN)
+LMC = (QRK, QKK)
+KNF = (CHN, GFV)
+XNP = (SGJ, GSK)
+QQB = (MLF, LMC)
+CVM = (DLJ, SDG)
+RSG = (LBH, TLD)
+PGR = (RTX, SBJ)
+VTD = (QGV, SRJ)
+LBC = (PRH, CSP)
+RKX = (NHL, XMM)
+MXK = (XJN, PTB)
+MJD = (DLC, LRC)
+GDR = (FCX, KNF)
+VXK = (THG, BPN)
+GPP = (NRC, DHQ)
+SDN = (FKH, SXB)
+KJH = (BJX, VHX)
+RNQ = (DNX, GPL)
+VQX = (RXP, SSS)
+PPH = (JSK, STC)
+KKV = (HJB, QCP)
+ZZZ = (FGX, XBB)
+PTN = (KCD, HPQ)
+GMP = (KHG, FDC)
+NTT = (KXR, FMP)
+GBF = (KXG, MKS)
+VPX = (JFB, HSN)
+SVG = (BPP, RPK)
+PJG = (MKX, HVD)
+HNR = (TJD, FNF)
+XBB = (SVR, GQB)
+FBM = (SSS, RXP)
+RTX = (QJQ, KJN)
+MSV = (KQH, LRF)
+MGN = (LGT, LXK)
+QDH = (CFV, DHZ)
+NPR = (GDR, DCF)
+HSN = (VLG, QNC)
+PTM = (VGG, CQX)
+VCP = (BCL, XDT)
+LBP = (MPD, MPD)
+NRK = (NNL, XKC)
+QCT = (BBL, SVH)
+RPL = (MMH, CDP)
+RXH = (TJC, DNN)
+DGL = (KDF, NKB)
+GTQ = (PGF, RXF)
+FXG = (BGH, MTH)
+FQH = (VCJ, HPM)
+LTN = (SCP, SCP)
+JMK = (LPX, JNM)
+SCL = (JFB, HSN)
+TKV = (XHC, HQD)
+BDT = (TTS, KQC)
+MXX = (SKB, LPC)
+RPN = (QJK, BXM)
+MFL = (NDC, TPM)
+DXM = (HPJ, JVX)
+QXM = (LHS, RLV)
+QHM = (HNR, DBB)
+QRB = (KDM, DSB)
+JMG = (PLD, LXN)
+QSQ = (BNS, XNC)
+CXA = (XLT, VRF)
+MXC = (LQD, QXV)
+CNJ = (QQP, PXV)
+BPM = (BRD, BRD)
+BFV = (FCJ, TSC)
+KPL = (RPL, HBT)
+JJR = (QNN, VRK)
+KHG = (VDS, LKJ)
+DRC = (HFR, HCF)
+DLF = (RFT, STN)
+GKS = (QQB, RLT)
+TBD = (LFP, PQN)
+XNC = (QBD, DDP)
+TGC = (JNB, JXF)
+KCF = (LBP, JHT)
+NKB = (CCJ, RGH)
+NPH = (JQF, QJC)
+BJQ = (LJC, QMT)
+GTS = (TDP, DNB)
+XSJ = (KTN, VXJ)
+QXQ = (GRM, TFM)
+FCJ = (FKJ, DSK)
+FPF = (CQH, HML)
+VCJ = (LTR, VSV)
+QJK = (LBC, GMB)
+PMK = (VXJ, KTN)
+FXM = (BNT, VVG)
+DDG = (TLD, LBH)
+MDB = (FDJ, TST)
+BSF = (VXK, DCG)
+BVK = (FTM, SVP)
+RTG = (JSH, LKD)
+BPN = (VQX, FBM)
+BJT = (CVM, JQL)
+DFS = (BCP, MDK)
+GRM = (MDB, VPC)
+TRD = (NRK, HPF)
+FKH = (XHD, SNT)
+LXF = (BDX, TKV)
+JBK = (KKV, QJN)
+JBP = (BNP, VNR)
+PKF = (BJX, VHX)
+DLK = (DGK, XST)
+TFM = (MDB, VPC)
+VDP = (VVR, MHR)
+RDP = (VJR, NSV)
+PTX = (CNJ, DLP)
+DCG = (THG, BPN)
+BCV = (LTJ, MHK)
+FKJ = (NBQ, RDP)
+PHK = (KGF, SBX)
+JDQ = (PTN, RFF)
+TNC = (BDX, TKV)
+KCJ = (RPK, BPP)
+DLJ = (FTC, TGF)
+FQG = (GVT, QFL)
+LFP = (SCL, VPX)
+PBG = (KNC, PFX)
+QCP = (LRX, KQG)
+NRC = (GPD, JMG)
+PHH = (DGT, RLF)
+XCH = (LJC, QMT)
+VXJ = (KPL, SSC)
+TNX = (BPM, BPM)
+PTR = (VSD, PTP)
+NDC = (DQN, DQN)
+SVT = (RQV, BXN)
+NTJ = (SHC, QCM)
+SHM = (SNM, JKK)
+TLD = (TTC, HQB)
+MMN = (JNK, RRS)
+NPC = (MTC, MXN)
+NMF = (QBM, CTP)
+CQX = (NRH, ZZZ)
+BNT = (DRF, QNR)
+BJZ = (CNH, NQS)
+KFK = (XCT, PPG)
+SDG = (TGF, FTC)
+CBB = (HFV, LNX)
+VFQ = (LVC, JCC)
+LRF = (KLM, JGL)
+TTC = (JLR, GFT)
+PFH = (SHG, XTT)
+RLT = (MLF, LMC)
+XPJ = (JPL, BJZ)
+PKQ = (BXM, QJK)
+TNS = (GDR, DCF)
+FKX = (PKG, QQL)
+MJB = (HKH, JFD)
+JTN = (JSM, QJH)
+QTG = (NRN, KCF)
+MPX = (CHR, TGC)
+JKK = (CJT, PLN)
+LKK = (DRC, HTP)
+RXF = (KRJ, CRS)
+QNC = (LFB, FQG)
+RKQ = (DSR, XHQ)
+LCX = (PGK, VDP)
+KSG = (LLD, QXM)
+RPK = (NJT, DLF)
+KDM = (KSG, PLL)
+TVP = (HTP, DRC)
+DCB = (NKK, NKK)
+DQN = (STJ, STJ)
+JSH = (TRS, GKJ)
+LDP = (XGS, LJK)
+QRM = (LRF, KQH)
+VGG = (NRH, NRH)
+LLK = (VMH, PKT)
+VSK = (PHH, NGQ)
+JFB = (VLG, QNC)
+BCL = (XKD, GLG)
+RTF = (RKQ, DTG)
+KPF = (GDT, XJD)
+DHZ = (SNK, TPC)
+LPC = (DCB, KCB)
+KDF = (RGH, CCJ)
+PLL = (QXM, LLD)
+XHS = (FXM, LLM)
+BHF = (JTX, XKN)
+RRS = (DLK, LHV)
+FFL = (HKS, NHB)
+VRF = (QRB, VHB)
+LSQ = (MRN, PJM)
+SCD = (MXK, DBX)
+SPD = (FXG, RDX)
+CFM = (PQN, LFP)
+QKK = (SPD, XNR)
+LVC = (JJR, FSP)
+RLV = (TRD, GHG)
+HKK = (SSP, XNP)
+JCC = (FSP, JJR)
+JHT = (MPD, SCN)
+RVP = (XVQ, LSQ)
+HPQ = (GFB, MFL)
+JRT = (VTN, SKP)
+DTD = (TGB, BSF)
+PKG = (SKX, DGB)
+VMP = (RLG, JBP)
+DSX = (RFF, PTN)
+QRQ = (BJQ, XCH)
+LLX = (VXC, MSL)
+SVH = (DFS, TCK)
+XNR = (RDX, FXG)
+QKM = (LJK, XGS)
+MMH = (BLG, NVN)
+SKB = (DCB, KCB)
+JXT = (KPF, DLH)
+SVV = (BCV, VVT)
+KLD = (MHM, PVJ)
+QNN = (SVV, NQK)
+FCX = (GFV, CHN)
+BNS = (QBD, DDP)
+SHP = (HML, CQH)
+TJD = (TXL, CXT)
+BQF = (FCP, DCQ)
+MKX = (SNS, CCN)
+JKF = (NPH, KGL)
+LFB = (QFL, GVT)
+DCQ = (PLJ, KND)
+SVP = (VGX, JCR)
+PGN = (XMT, MXG)
+NVZ = (VRF, XLT)
+VBR = (BDM, LXP)
+GTX = (PHK, DSN)
+BDX = (XHC, HQD)
+JGX = (HGC, FBH)
+BBL = (DFS, TCK)
+KNT = (BBX, GMP)
+TLP = (LXH, TKF)
+TDS = (CBB, VPN)
+CTD = (LTN, LTN)
+HCG = (RRQ, GTQ)
+VRG = (TTS, KQC)
+RLC = (TLP, FQX)
+FBH = (DBM, LCX)
+SCP = (TVC, RBX)
+CGC = (TBN, FVC)
+JFG = (NQP, GDV)
+BVM = (RLG, JBP)
+DCF = (KNF, FCX)
+BJV = (QXV, LQD)
+QBD = (JBR, KLD)
+QFG = (BBL, SVH)
+RFF = (HPQ, KCD)
+QJQ = (PRV, BVK)
+FMC = (QHJ, GFG)
+PXV = (STQ, VHK)
+VVN = (XNC, BNS)
+NHG = (DXM, KVJ)
+SSP = (SGJ, GSK)
+QMT = (JFG, XBK)
+VRK = (NQK, SVV)
+SNT = (DDG, RSG)
+RRB = (BPG, CVQ)
+DXQ = (JDQ, DSX)
+FMP = (SHM, GSV)
+VMF = (FJX, VBR)
+NKJ = (GKP, SBS)
+XGM = (FLR, MXS)
+SKX = (NLH, RTG)
+XMS = (FDP, PRK)
+SPG = (PPG, XCT)
+QNR = (MPX, SXC)
+MDC = (BPM, CTR)
+SMR = (TJT, HXC)
+TBN = (FJS, TDS)
+BGH = (NPF, HRT)
+VDS = (XHS, PSX)
+RBX = (CDJ, PBG)
+VLC = (CQJ, GPP)
+SVR = (GTX, HLC)
+MDV = (DGL, SFJ)
+GMB = (CSP, PRH)
+QSP = (TBD, CFM)
+GFQ = (PHH, NGQ)
+HXG = (BDT, VRG)
+PPG = (XDM, MMN)
+MSH = (SHC, QCM)
+CHR = (JXF, JNB)
+RDX = (MTH, BGH)
+VXC = (MSD, BFL)
+DLP = (PXV, QQP)
+MXP = (FQX, TLP)
+TTQ = (TBD, CFM)
+GHG = (HPF, NRK)
+SNK = (BQF, CPH)
+MGG = (STJ, QDH)
+CCJ = (MBM, KNT)
+NNL = (KBH, LKC)
+LKD = (GKJ, TRS)
+GFN = (LGT, LXK)
+QBM = (XGM, SFV)
+STJ = (CFV, CFV)
+DSK = (RDP, NBQ)
+TSC = (FKJ, DSK)
+NSV = (LQB, TRJ)
+FKF = (XGR, JXT)
+DNX = (NTJ, MSH)
+NLH = (JSH, LKD)
+CFV = (TPC, SNK)
+DRP = (VBR, FJX)
+BDM = (SPR, RTF)
+TGF = (FPC, CSK)
+CNH = (VXD, LFX)
+BFL = (RQP, RVP)
+XHC = (GND, MDV)
+CJJ = (RLT, QQB)
+HPH = (XMM, NHL)
+PRH = (FLN, BNM)
+JCR = (THT, VCP)
+VHK = (XDC, JFR)
+NQP = (KXT, BJT)
+CDJ = (KNC, PFX)
+SCF = (DKC, QQQ)
+JBR = (MHM, PVJ)
+TPC = (BQF, CPH)
+FDC = (LKJ, VDS)
+KNC = (XCQ, VKJ)
+VQM = (SHG, XTT)
+KND = (QCS, TVN)
+MDM = (GPL, DNX)
+FJX = (LXP, BDM)
+BDV = (XTB, NVZ)
+LBM = (KFN, TGG)
+XKC = (KBH, LKC)
+QVF = (VMP, BVM)
+SHG = (RBR, BHF)
+DNB = (SVC, SSQ)
+SCN = (JGG, BDV)
+SXC = (TGC, CHR)
+XSL = (KCJ, SVG)
+TKF = (VLC, LVJ)
+LKJ = (XHS, PSX)
+VHX = (QMG, LCN)
+HGC = (LCX, DBM)
+MLN = (HFD, KVM)
+XDM = (JNK, RRS)
+RTK = (PKD, NPC)
+QQQ = (DSL, FTV)
+VJS = (DTF, VFQ)
+LLM = (VVG, BNT)
+MFM = (NHG, NQD)
+NQK = (VVT, BCV)
+NHN = (HPM, VCJ)
+SKP = (NMQ, XHM)
+HXC = (BVD, PFN)
+LSK = (FQJ, KGC)
+FPC = (GFX, MDQ)
+STC = (RBF, PTM)
+CTR = (BRD, KQZ)
+BNQ = (SKB, LPC)
+QQL = (SKX, DGB)
+NHX = (RKX, HPH)
+QHJ = (GRQ, BBP)
+XCQ = (XPX, PGN)
+HTV = (GTS, KBJ)
+JXF = (DXQ, FBK)
+JTR = (HTJ, PML)
+JHB = (JSM, QJH)
+CQF = (BDT, VRG)
+GNQ = (QCT, QFG)
+TQC = (TGB, BSF)
+SFS = (SCP, QLZ)
+MDQ = (MJD, XVS)
+DLC = (TMM, DFM)
+FLN = (RGV, SDN)
+PVJ = (QTG, XGF)
+JFR = (JTR, GHT)
+PGK = (VVR, MHR)
+TDP = (SSQ, SVC)
+RLF = (RKP, SKK)
+HJN = (NHB, HKS)
+VJR = (TRJ, LQB)
+VGX = (VCP, THT)
+DSB = (PLL, KSG)
+FTM = (VGX, JCR)
+MHR = (LBM, NKF)
+JFD = (CBP, HLJ)
+HKH = (CBP, HLJ)
+FDV = (QFH, JMK)
+NHL = (RQG, JKF)
+CQJ = (DHQ, NRC)
+HVD = (SNS, CCN)
+PLN = (QKM, LDP)
+THT = (BCL, XDT)
+FDP = (SCD, XCP)
+TJC = (HHV, MVS)
+QCM = (HKK, FQV)
+TJQ = (QCT, QFG)
+HFR = (KJH, PKF)
+RQG = (NPH, KGL)
+SRJ = (TNS, NPR)
+LTR = (NKQ, PJG)
+XST = (FVX, RGT)
+MBM = (GMP, BBX)
+KVM = (CBD, DBG)
+MVS = (VRL, JVC)
+SSC = (RPL, HBT)
+QQP = (VHK, STQ)
+CHQ = (SVG, KCJ)
+BVD = (FMQ, JGX)
+FNX = (NPC, PKD)
+FJS = (CBB, VPN)
+PLD = (FFL, HJN)
+TVC = (CDJ, PBG)
+DBX = (XJN, PTB)
+MDK = (SQD, RGD)
+JPL = (NQS, CNH)
+VDG = (GKS, CJJ)
+HQB = (GFT, JLR)
+GQS = (VMF, DRP)
+PST = (MKS, KXG)
+XGS = (SHP, FPF)
+XDJ = (VNX, PTR)
+MHM = (QTG, XGF)
+SHN = (SBS, GKP)
+LFX = (FLF, NCQ)
+BFX = (JNQ, MCT)
+XHM = (RNQ, MDM)
+LXN = (HJN, FFL)
+HPJ = (JRT, GDQ)
+NVN = (DTD, TQC)
+KGL = (QJC, JQF)
+MCT = (PBP, VDG)
+QFH = (LPX, JNM)
+FVC = (FJS, TDS)
+DRL = (QBM, CTP)
+LTJ = (MLX, NHX)
+THB = (JTN, JHB)
+SBX = (RPN, PKQ)
+KMV = (RRQ, GTQ)
+MNX = (LMH, RXH)
+LKC = (TMH, MGF)
+TMM = (BFX, PNS)
+TMH = (XMS, GGT)
+LPX = (QRM, MSV)
+STN = (DRL, NMF)
+RKP = (CHQ, XSL)
+DNC = (HDG, VJS)
+XMM = (JKF, RQG)
+GFT = (LSM, NXT)
+LSM = (SMR, PGC)
+FKS = (XSJ, PMK)
+MPD = (JGG, JGG)
+DKC = (DSL, FTV)
+HLC = (DSN, PHK)
+KMS = (BJC, BFV)
+NJT = (RFT, STN)
+JSK = (RBF, RBF)
+HLJ = (LGD, PTX)
+QMG = (TLV, FMC)
+GPL = (NTJ, MSH)
+RQP = (XVQ, LSQ)
+GGT = (FDP, PRK)
+XKN = (JBK, SQN)
+FVX = (MGN, GFN)
+GST = (CRK, SCF)
+MTK = (BFV, BJC)
+CCN = (KMV, HCG)
+TRS = (PDP, TQD)
+NRN = (LBP, JHT)
+GFG = (GRQ, BBP)
+XBK = (NQP, GDV)
+CXT = (QRV, PPH)
+FQV = (SSP, XNP)
+GFB = (NDC, TPM)
+VXD = (NCQ, FLF)
+XPX = (MXG, XMT)
+SQD = (SRV, GGX)
+GKP = (NFC, CGC)
+AAA = (XBB, FGX)
+KXR = (SHM, GSV)
+DGB = (RTG, NLH)
+PJM = (PNC, MNX)
+QGV = (NPR, TNS)
+CFB = (SLP, XQG)
+FDJ = (TDV, MJB)
+DSN = (KGF, SBX)
+FLR = (FDL, SXH)
+JGL = (QRQ, XLP)
+JQN = (JTN, JHB)
+MTH = (NPF, HRT)
+PRK = (SCD, XCP)
+VHA = (KLF, HXJ)
+VVR = (NKF, LBM)
+CQH = (VTD, KJK)
+DRF = (MPX, SXC)
+FDL = (LSK, HMP)
+PFX = (XCQ, VKJ)
+HPF = (XKC, NNL)
+LXH = (LVJ, VLC)
+SVC = (MXX, BNQ)
+GFX = (XVS, MJD)
+DGT = (SKK, RKP)
+XKD = (KFK, SPG)
+XJN = (BDK, QXQ)
+KQH = (KLM, JGL)
+VMH = (SKR, XFK)
+CHN = (VSK, GFQ)
+LHV = (DGK, XST)
+HCF = (PKF, KJH)
+CNF = (QHB, XPJ)
+QCS = (SJM, KMC)
+GXP = (QQL, PKG)
+SBJ = (QJQ, KJN)
+DHQ = (GPD, JMG)
+VLG = (FQG, LFB)
+GDQ = (VTN, SKP)
+NMQ = (MDM, RNQ)
+XKM = (KVM, HFD)
+BNM = (SDN, RGV)
+MLX = (RKX, HPH)
+QJC = (LLK, BQH)
+HML = (KJK, VTD)
+SKK = (CHQ, XSL)
+FQX = (TKF, LXH)
+PKD = (MXN, MTC)
+NQS = (LFX, VXD)
+HBT = (CDP, MMH)
+LRC = (DFM, TMM)
+NXT = (SMR, PGC)
+SXB = (XHD, SNT)
+RBF = (VGG, VGG)
+RXP = (GNQ, TJQ)
+RVK = (DRP, VMF)