From 33b3c8bed0e830e2b194ca19305b495a8214ffc8 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Fri, 8 Dec 2023 17:13:20 +0200 Subject: [PATCH] AOC2023: Implement day8 Second part was kinda weird. You are supposted to assume something of the input, which necessarily is not true. --- userspace/aoc2023/CMakeLists.txt | 1 + userspace/aoc2023/day8/CMakeLists.txt | 22 + userspace/aoc2023/day8/main.cpp | 131 +++++ userspace/aoc2023/input/day8_input.txt | 768 +++++++++++++++++++++++++ 4 files changed, 922 insertions(+) create mode 100644 userspace/aoc2023/day8/CMakeLists.txt create mode 100644 userspace/aoc2023/day8/main.cpp create mode 100644 userspace/aoc2023/input/day8_input.txt diff --git a/userspace/aoc2023/CMakeLists.txt b/userspace/aoc2023/CMakeLists.txt index 1c5f2c67..e528db32 100644 --- a/userspace/aoc2023/CMakeLists.txt +++ b/userspace/aoc2023/CMakeLists.txt @@ -10,6 +10,7 @@ set(AOC2023_PROJECTS day5 day6 day7 + day8 ) set(BANAN_AOC2023_BIN ${BANAN_BIN}/aoc2023) diff --git a/userspace/aoc2023/day8/CMakeLists.txt b/userspace/aoc2023/day8/CMakeLists.txt new file mode 100644 index 00000000..581feb9e --- /dev/null +++ b/userspace/aoc2023/day8/CMakeLists.txt @@ -0,0 +1,22 @@ +cmake_minimum_required(VERSION 3.26) + +project(aoc2023_day8 CXX) + +set(SOURCES + main.cpp +) + +add_executable(aoc2023_day8 ${SOURCES}) +target_compile_options(aoc2023_day8 PUBLIC -O2 -g) +target_link_libraries(aoc2023_day8 PUBLIC libc ban) + +add_dependencies(aoc2023_day8 libc-install ban-install) + +add_custom_target(aoc2023_day8-install + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/aoc2023_day8 ${BANAN_AOC2023_BIN}/day8 + DEPENDS aoc2023_day8 + DEPENDS aoc2023_always +) + +add_dependencies(aoc2023 aoc2023_day8) +add_dependencies(aoc2023-install aoc2023_day8-install) diff --git a/userspace/aoc2023/day8/main.cpp b/userspace/aoc2023/day8/main.cpp new file mode 100644 index 00000000..4ec0410d --- /dev/null +++ b/userspace/aoc2023/day8/main.cpp @@ -0,0 +1,131 @@ +#include +#include + +#include +#include +#include + +using i32 = int32_t; +using i64 = int64_t; + +using u32 = uint32_t; +using u64 = uint64_t; + +static u32 coord_to_u32(BAN::StringView coord) +{ + ASSERT(coord.size() == 3); + return ((u32)coord[2] << 16) | ((u32)coord[1] << 8) | (u32)coord[0]; +} + +i64 puzzle1(FILE* fp) +{ + BAN::HashMap targets; + BAN::String left_right_path; + + { + char buffer[512]; + if (!fgets(buffer, sizeof(buffer), fp)) + return -1; + MUST(left_right_path.append(buffer)); + left_right_path.pop_back(); + + if (!fgets(buffer, sizeof(buffer), fp)) + return -1; + while (fgets(buffer, sizeof(buffer), fp)) + { + BAN::StringView line(buffer); + if (line.size() < 15) + continue; + MUST(targets.emplace( + coord_to_u32(line.substring(0, 3)), + coord_to_u32(line.substring(7, 3)), + coord_to_u32(line.substring(12, 3)) + )); + } + } + + u32 current = coord_to_u32("AAA"sv); + u32 target = coord_to_u32("ZZZ"sv); + + i64 steps = 0; + for (; current != target; steps++) + { + char direction = left_right_path[steps % left_right_path.size()]; + current = targets[current][direction == 'R']; + } + + return steps; +} + +i64 puzzle2(FILE* fp) +{ + BAN::HashMap targets; + BAN::String left_right_path; + + { + char buffer[512]; + if (!fgets(buffer, sizeof(buffer), fp)) + return -1; + MUST(left_right_path.append(buffer)); + left_right_path.pop_back(); + + if (!fgets(buffer, sizeof(buffer), fp)) + return -1; + while (fgets(buffer, sizeof(buffer), fp)) + { + BAN::StringView line(buffer); + if (line.size() < 15) + continue; + MUST(targets.emplace( + coord_to_u32(line.substring(0, 3)), + coord_to_u32(line.substring(7, 3)), + coord_to_u32(line.substring(12, 3)) + )); + } + } + + i64 result = 1; + for (auto [key, _] : targets) + { + if ((key >> 16) != 'A') + continue; + + i64 steps = 0; + for (u32 pos = key; (pos >> 16) != 'Z'; steps++) + { + char direction = left_right_path[steps % left_right_path.size()]; + pos = targets[pos][direction == 'R']; + } + + // Calculating LCM of all steps only works if steps is a multiple of full path size. + // This seems to be the case with my input, but it's good to verify... + ASSERT(steps % left_right_path.size() == 0); + + result = BAN::Math::lcm(result, steps); + } + + return result; +} + +int main(int argc, char** argv) +{ + const char* file_path = "/usr/share/aoc2023/day8_input.txt"; + + if (argc >= 2) + file_path = argv[1]; + + FILE* fp = fopen(file_path, "r"); + if (fp == nullptr) + { + perror("fopen"); + return 1; + } + + printf("puzzle1: %lld\n", puzzle1(fp)); + + fseek(fp, 0, SEEK_SET); + + printf("puzzle2: %lld\n", puzzle2(fp)); + + fclose(fp); +} diff --git a/userspace/aoc2023/input/day8_input.txt b/userspace/aoc2023/input/day8_input.txt new file mode 100644 index 00000000..a01a2b11 --- /dev/null +++ b/userspace/aoc2023/input/day8_input.txt @@ -0,0 +1,768 @@ +LLLRRRLLRLRLLRRRLRLRRLRRLRRRLRRLLLRLRRLLRLRRRLRRRLLLRLLLLRLRRLLLRRRLRRRLRLRRRLLLLRLRLLRRLLRRRLRRLRLRRRLRRRLLLRLRRRLRRRLRRLLRRLRRRLLRLRLRLRLRLRRRLRLRRLRLRLRLRRLRRLRLRLRRLLRRLRRRLRRLRRLRRRLRRLRLLRLRLLRRLRRRLRLRLRRLLRRLRRRLRRLRRRLRLRRRLRRLRLRRLRLRRLLLRRLRRLRRRLRLRRLRRRLRLRLRRLRLLRRRR + +TJS = (LFP, HKT) +SMT = (LDV, MMH) +QQQ = (VKG, FVB) +PQD = (NRV, JGD) +PDP = (XVG, HBQ) +GRB = (XVB, VVL) +JVX = (VPQ, QFT) +XCM = (MTN, HKF) +GSM = (HXM, CRX) +GXD = (SCJ, STQ) +BTF = (VPT, VVT) +JLK = (BFJ, FPT) +JCG = (RNF, RHS) +QMJ = (GPG, XGP) +HGL = (VNM, FVP) +QNF = (XCH, MJX) +PTL = (DQS, QQS) +JNH = (DGV, FFT) +CKG = (RQB, TPT) +PKJ = (SHG, BFQ) +HDF = (TKK, DTS) +BQQ = (DPJ, GPM) +TQH = (CJL, DXL) +KLR = (MHH, LQF) +SFH = (FXC, KTN) +HKT = (PCH, GRV) +BXL = (KDD, SCC) +CDV = (RVK, KGL) +XDS = (BTD, BVR) +CCG = (PLD, CVF) +BBN = (XLF, CPP) +GHC = (VPF, NMK) +PRK = (BFJ, FPT) +HPT = (JNH, HKK) +DXL = (NHC, VFP) +VHX = (JVF, JGN) +SLC = (DQF, LLH) +KGL = (LQL, KHJ) +TBM = (XGJ, KGH) +XCA = (BCC, DKB) +RMV = (QVT, QVT) +HNC = (GXS, JJX) +ZZZ = (KBC, KQK) +NFD = (PQD, PXP) +BTN = (SVJ, MMF) +FJH = (KDB, LXF) +PXJ = (KPK, QNL) +GPG = (LHP, JLB) +BNM = (MXP, RLX) +LQG = (CLK, CCG) +LJX = (PKR, XMV) +PVB = (SMH, LDG) +SHT = (TBM, GRL) +JLB = (FGV, XPX) +NJC = (LBK, XVK) +HGD = (CRX, HXM) +FGR = (SSD, KMB) +PTS = (DQC, FDJ) +NSJ = (TSC, BVS) +XQP = (NHL, RPK) +BFH = (JCN, DLH) +XVB = (JLD, DVB) +XDK = (XSV, GKV) +MKV = (TXV, CCT) +KGD = (FMS, HNC) +BLQ = (PQD, PXP) +HGP = (VQX, GTT) +SSD = (GCT, NVB) +DNH = (KFD, QXV) +LKB = (STH, GMM) +QTP = (DFH, BKX) +TMQ = (CDV, PFB) +QGC = (PFP, DVV) +GGH = (THH, THH) +GRJ = (GBH, MDN) +DBX = (JKL, DVC) +DTS = (XJP, NMB) +PFT = (TGM, RQX) +DRS = (JCG, PTB) +CVQ = (VQG, CGN) +RKF = (VRT, NLJ) +VPQ = (JGT, CKG) +LDJ = (KNS, DQH) +JKL = (XJL, CVQ) +LPH = (LBV, DNB) +HGH = (RFM, RFM) +QVT = (KDD, KDD) +KNS = (MDJ, LLG) +GPA = (PLN, RTM) +CLM = (KPK, QNL) +RJM = (LFP, HKT) +BFM = (TQC, SQR) +XBM = (JJH, PLR) +PGD = (SNL, GGJ) +SVQ = (DPP, LQP) +BRR = (GHT, MGZ) +PQH = (PRX, GGL) +KRJ = (HDR, VRM) +SXT = (GTH, PGQ) +BHP = (XQD, VQJ) +KPK = (JTF, LJS) +JCN = (DLJ, GBM) +KBC = (DTR, KNF) +NMB = (HMF, LBL) +HJB = (XMV, PKR) +MDJ = (PFT, XHP) +XKC = (KTK, RQP) +QTB = (HGH, TLL) +MSK = (VQX, GTT) +HJK = (FGN, DHB) +FDG = (PCJ, DXD) +JDT = (BHL, BFM) +CBK = (FMS, HNC) +VPP = (NKP, MBD) +RTL = (RFK, TBP) +RNR = (KQK, KBC) +RNF = (PBB, CXH) +JCB = (JCQ, NMV) +KHJ = (THC, BBN) +PFF = (LQF, MHH) +JJN = (JCT, RRM) +PMQ = (JBB, XTH) +VRK = (PKJ, DCB) +DST = (XVV, XJK) +KGH = (DBL, CDP) +PTB = (RNF, RHS) +FNS = (RCN, VLQ) +DBL = (TSG, JSR) +JGT = (TPT, RQB) +SQH = (JNX, DDC) +VQZ = (QDR, XXK) +NLF = (KDB, LXF) +BHF = (HGD, GSM) +RND = (FFP, XLH) +JDQ = (VVT, VPT) +NRV = (PQH, FJM) +BPG = (XSV, GKV) +GHS = (NFD, BLQ) +RGT = (SVQ, VNB) +DHV = (SJG, TCC) +GPM = (PTS, RGS) +VSJ = (QPV, DFP) +DRC = (DPJ, GPM) +PVF = (XVV, XJK) +VJD = (LPG, VXQ) +TGD = (FKB, PVB) +TVS = (XHX, SRN) +GTT = (CJX, BGB) +XLB = (KFD, QXV) +SGH = (GSM, HGD) +XLH = (RJX, LPH) +JLD = (TMQ, LGG) +GPH = (LKB, JMX) +PTD = (VVP, SKG) +MCD = (HPV, RGM) +CQV = (JJV, FNQ) +SJG = (TNG, LFN) +DSX = (PLB, JTS) +DQS = (JSK, FRM) +JSX = (XFP, QLC) +RFM = (KTK, KTK) +GXS = (JBN, QNF) +QNM = (VCC, NPL) +BHH = (XJT, KTH) +XSV = (JPT, FTP) +QDQ = (GGH, GGH) +JKQ = (RML, SXT) +JKN = (MCK, BLL) +XTH = (TCX, HJK) +BFF = (PRN, MSF) +VPM = (RKF, MMV) +JTC = (BGC, GDX) +XBL = (FXC, KTN) +CCT = (JVX, QTF) +VPT = (JHX, TDN) +DGK = (SNL, GGJ) +CRX = (XQM, TKJ) +DMC = (PCF, KDP) +JGD = (FJM, PQH) +PJJ = (TQH, JDF) +RGM = (FNS, MSX) +BRD = (BHL, BFM) +GNG = (FLP, BLV) +FHV = (PLH, KFB) +VPF = (SCH, HMM) +XJT = (BJB, DPK) +PJD = (CDQ, PDQ) +DXD = (MVP, XHB) +CXX = (PRK, JLK) +KFD = (LHH, GHC) +KFT = (HDR, VRM) +LXT = (LGD, NNQ) +NVB = (LQB, BBC) +LBX = (XDX, PDP) +RLX = (BFH, KRS) +PDN = (BCT, HXD) +VFS = (BPN, PJJ) +JPM = (VBB, GHS) +TRL = (SNB, FHV) +JGN = (RMV, KCP) +JFS = (PXS, QVL) +TGM = (FJS, BFG) +TCC = (TNG, LFN) +JLL = (PTB, JCG) +KCP = (QVT, BXL) +QLC = (SNJ, JJN) +HHC = (PRK, JLK) +RQP = (THJ, QGZ) +BGR = (CCG, CLK) +CJL = (VFP, NHC) +BVK = (XQS, CSN) +DFJ = (HPV, RGM) +BBK = (PLJ, DVF) +XGJ = (CDP, DBL) +XMT = (DHV, MFF) +MRG = (JJD, XFG) +DPP = (VXV, STX) +JTF = (TJS, RJM) +XMH = (CSN, XQS) +FFT = (SJN, RTX) +JJD = (SLC, JBK) +KMB = (GCT, NVB) +KNF = (SHT, KFP) +MVF = (PXJ, CLM) +CPN = (HKF, MTN) +KTK = (THJ, THJ) +SRS = (GVM, GVT) +GSH = (NHV, KTQ) +LXB = (PVB, FKB) +VQX = (BGB, CJX) +BFJ = (XSD, DJP) +BPN = (JDF, TQH) +CPP = (RKR, BPD) +GVM = (MTX, MTX) +VDN = (VBB, GHS) +GGL = (BRG, MPJ) +NVN = (VJP, QGC) +TRP = (RRF, TKB) +KNG = (VRG, KRN) +MFF = (SJG, TCC) +TXB = (LRG, JTC) +DXK = (JTC, LRG) +RVK = (LQL, KHJ) +QFT = (CKG, JGT) +XQS = (JKN, LHN) +TRM = (NRB, XHQ) +AAA = (KQK, KBC) +DJN = (XVB, VVL) +THH = (GPX, LHF) +NCN = (VMV, PBG) +JVF = (RMV, KCP) +HMF = (LDJ, RDK) +TDS = (JLQ, TQJ) +JNX = (LQG, BGR) +LQB = (XKR, CMN) +QXV = (LHH, GHC) +DRM = (PTX, TLH) +HJL = (QVL, PXS) +DLH = (DLJ, GBM) +FQB = (XLH, FFP) +PCJ = (MVP, XHB) +XHP = (RQX, TGM) +FGX = (RTL, GGV) +GGJ = (SFH, XBL) +QDF = (GTK, GTK) +XJK = (GPH, HGR) +BCT = (JCS, VHX) +MVP = (KCN, XQP) +QFL = (HXL, DHK) +KCM = (KBX, SHR) +GVT = (MTX, MFT) +VRT = (PMK, VFS) +NSM = (GVM, GVT) +FMS = (GXS, JJX) +XHX = (SQG, HDF) +SQG = (DTS, TKK) +VRM = (BRX, KJX) +THK = (VNM, FVP) +LQP = (STX, VXV) +FJS = (BDH, QTB) +RPV = (QCX, MSR) +QQS = (FRM, JSK) +HKK = (FFT, DGV) +PGQ = (GLT, MXG) +DHK = (RLN, XNP) +XVV = (GPH, HGR) +CJJ = (MFF, DHV) +SBG = (VBX, GKD) +RPX = (VRK, MRJ) +XQM = (QTP, LRQ) +KLJ = (GHL, BQC) +TTC = (PBG, VMV) +RKR = (BHH, KNQ) +FJM = (PRX, GGL) +SQR = (JPM, VDN) +LBL = (RDK, LDJ) +XNP = (BTF, JDQ) +VRG = (THG, LLN) +BVN = (TTK, NSJ) +HCL = (JNH, HKK) +FPH = (JKQ, LVX) +CDQ = (FHT, XLJ) +PLH = (KLR, PFF) +PBB = (GRB, DJN) +FRM = (JFX, DNC) +THC = (XLF, CPP) +BLV = (FSL, TVS) +QLX = (HFC, VRC) +BHL = (TQC, SQR) +JLV = (PXQ, JSX) +SHG = (HDN, HDN) +LLN = (GBR, MRG) +HFC = (SGV, GSH) +JCQ = (DFM, DPB) +HBX = (XNV, NJN) +RVM = (DCX, KFK) +KFK = (JRV, TCK) +VLQ = (JXJ, KKB) +NHV = (RXG, HMP) +DFM = (KKK, DHR) +MMV = (VRT, NLJ) +TKK = (NMB, XJP) +HBQ = (KLS, GJR) +PMK = (BPN, PJJ) +PLB = (RJN, JTR) +MPJ = (SMN, CPG) +XNV = (KLJ, VRJ) +LRG = (BGC, GDX) +JFX = (TXB, DXK) +XMK = (MBK, JTP) +STH = (XDK, BPG) +MCR = (FPH, FXM) +XLR = (BMR, FDG) +NHC = (QDM, JLV) +MRJ = (PKJ, DCB) +VBB = (NFD, BLQ) +KMN = (PRF, QNM) +QMG = (JCQ, NMV) +RMN = (XTH, JBB) +HPV = (FNS, MSX) +TCX = (FGN, DHB) +BRG = (SMN, CPG) +BJB = (BVK, XMH) +NLJ = (PMK, VFS) +RHS = (CXH, PBB) +PLK = (LQX, SBG) +NGS = (LDV, MMH) +NRM = (MDN, GBH) +BKN = (TKB, RRF) +FVP = (SXM, DGX) +VLF = (GTK, VQZ) +MBD = (CQV, SND) +MTN = (FCT, KNC) +FKB = (SMH, LDG) +XPX = (QSM, QJK) +XGP = (JLB, LHP) +QKN = (QCX, MSR) +CLL = (JCB, QMG) +PLD = (BFF, CHX) +TXV = (JVX, QTF) +KJX = (SQH, DCF) +BPD = (BHH, KNQ) +GKD = (NFQ, BVN) +HSM = (VSJ, GHP) +BKX = (LDX, KMN) +FTP = (DRS, JLL) +MVB = (NNQ, LGD) +HGR = (LKB, JMX) +FPL = (KFS, BHP) +MSX = (VLQ, RCN) +FLP = (FSL, TVS) +JJH = (BKN, TRP) +RJX = (LBV, DNB) +BVS = (HGP, MSK) +JXJ = (LBB, JXK) +TSC = (MSK, HGP) +RXG = (TDS, BNG) +TPT = (PTC, PHQ) +DHB = (CXX, HHC) +XVK = (FVF, NVN) +MMQ = (KRN, VRG) +GCT = (BBC, LQB) +MTX = (QDF, QDF) +PBP = (LBK, XVK) +KTP = (NJN, XNV) +TNG = (VLC, VLC) +LXF = (XCM, CPN) +FVB = (FRV, FPL) +PCH = (DRC, BQQ) +DQH = (LLG, MDJ) +RRH = (MMF, SVJ) +PFG = (JTS, PLB) +KRK = (DDM, FGX) +SGV = (NHV, KTQ) +PJL = (MQH, SXF) +XMJ = (CCT, TXV) +RFT = (RKF, MMV) +QMR = (BTN, RRH) +SXP = (NCN, TTC) +GHL = (SXP, DDX) +RRM = (HCL, HPT) +JLQ = (KJV, BMG) +PHQ = (GLS, GBX) +FXM = (LVX, JKQ) +BLL = (XMT, CJJ) +MXP = (KRS, BFH) +PQB = (GNV, BNM) +THG = (GBR, MRG) +XQD = (MHF, KRK) +SNL = (XBL, SFH) +QGZ = (DKB, BCC) +RPK = (VRS, QSX) +TKB = (JRN, QMC) +NPL = (LXD, QBM) +MJX = (DST, PVF) +PFB = (KGL, RVK) +RGV = (DHK, HXL) +DQF = (DFD, MVF) +SNM = (HXD, BCT) +GLT = (QXL, SVX) +XLF = (RKR, BPD) +BGQ = (GGH, NNJ) +QPV = (DLB, DMC) +QCX = (SNM, PDN) +PBG = (SRV, QLX) +LQX = (VBX, GKD) +KLX = (XLB, DNH) +JVR = (XGP, GPG) +DPK = (XMH, BVK) +PRX = (MPJ, BRG) +JBB = (HJK, TCX) +HHK = (SNB, FHV) +KTQ = (HMP, RXG) +JCS = (JVF, JGN) +VNM = (DGX, SXM) +QNL = (JTF, LJS) +CTM = (DBM, KCM) +CVF = (BFF, CHX) +TQC = (VDN, JPM) +FRV = (BHP, KFS) +GJR = (JFS, HJL) +JQV = (KTP, HBX) +XVG = (KLS, GJR) +FGN = (CXX, HHC) +JTR = (QFL, RGV) +QNH = (PMQ, RMN) +XHQ = (SSC, JVZ) +XTT = (SBG, LQX) +VLR = (XDX, PDP) +GBH = (TXM, PJL) +LFA = (XXK, QDR) +SNJ = (RRM, JCT) +KDD = (RNR, RNR) +DLJ = (FGR, DSS) +XKR = (LXB, TGD) +PLF = (STQ, SCJ) +TSG = (FRH, DRF) +NHL = (VRS, QSX) +LBB = (PGD, DGK) +MQH = (QKN, RPV) +KTH = (DPK, BJB) +NJN = (VRJ, KLJ) +FDJ = (KGK, CGL) +MMF = (SMT, NGS) +DCB = (SHG, BFQ) +SXM = (GNB, BBK) +QBM = (TQB, DHN) +QXL = (DRM, TLM) +MVL = (JTP, MBK) +PTX = (HSM, BJS) +GKV = (FTP, JPT) +TKG = (XLB, DNH) +PTC = (GLS, GBX) +FNQ = (PTD, XNS) +VXQ = (NRM, GRJ) +PXP = (NRV, JGD) +STQ = (VLR, LBX) +VVL = (DVB, JLD) +XJL = (CGN, VQG) +FCT = (TCG, JPC) +MXG = (QXL, SVX) +BFQ = (HDN, TRM) +JTP = (GDF, VPP) +NGP = (FLP, BLV) +VKG = (FRV, FPL) +CXH = (GRB, DJN) +NMK = (SCH, HMM) +VRC = (SGV, GSH) +LLH = (MVF, DFD) +LLG = (XHP, PFT) +TLH = (BJS, HSM) +RTM = (MKV, XMJ) +TLL = (RFM, XKC) +RKK = (TRL, HHK) +JMM = (MTQ, BRR) +PDQ = (FHT, XLJ) +XCL = (BTD, BVR) +SPL = (CDQ, PDQ) +TFT = (QQS, DQS) +VVP = (GQD, XDH) +CMN = (TGD, LXB) +JSK = (JFX, DNC) +KLS = (JFS, HJL) +GDF = (NKP, MBD) +KJV = (DQP, RKK) +JBN = (XCH, MJX) +PQA = (GPX, LHF) +SMN = (RVM, SMQ) +SND = (FNQ, JJV) +XSD = (KFT, KRJ) +BNG = (JLQ, TQJ) +TDN = (BBG, PPR) +VRS = (TTL, CFG) +GDX = (NTJ, MCR) +CJX = (PQB, HPJ) +XNS = (VVP, SKG) +GHT = (VTN, XBM) +GNV = (RLX, MXP) +LBK = (FVF, NVN) +CFG = (MVL, XMK) +GPX = (RFT, VPM) +VXV = (KLX, TKG) +JSR = (DRF, FRH) +LRQ = (BKX, DFH) +GTK = (XXK, QDR) +GBM = (FGR, DSS) +SNB = (PLH, KFB) +JJV = (XNS, PTD) +BVV = (RND, FQB) +DDC = (BGR, LQG) +LPG = (NRM, GRJ) +FVF = (VJP, QGC) +DFD = (PXJ, CLM) +HMP = (BNG, TDS) +BTD = (HGL, THK) +VCC = (LXD, QBM) +GBR = (JJD, XFG) +NKP = (SND, CQV) +CHX = (PRN, MSF) +TCB = (JKL, DVC) +DVF = (JVR, QMJ) +VBX = (BVN, NFQ) +RFK = (PLK, XTT) +XHB = (KCN, XQP) +BBG = (SPG, QMR) +RJN = (RGV, QFL) +DQP = (TRL, HHK) +RRF = (QMC, JRN) +BBC = (XKR, CMN) +BFG = (BDH, QTB) +DGX = (BBK, GNB) +GGV = (RFK, TBP) +KDP = (CTM, JQT) +DJP = (KRJ, KFT) +XJP = (HMF, LBL) +JMX = (GMM, STH) +KFM = (JCB, QMG) +SPG = (RRH, BTN) +BCC = (CLL, KFM) +GQD = (SRS, NSM) +FRH = (CSJ, QNH) +JPC = (XVP, VJD) +KTN = (TCB, DBX) +PGG = (MRJ, VRK) +KKK = (QQQ, RXR) +MDN = (TXM, PJL) +JBK = (LLH, DQF) +NTJ = (FXM, FPH) +LBV = (PBJ, XLR) +CSJ = (PMQ, RMN) +TTK = (TSC, BVS) +PKR = (RGT, SLM) +XMV = (SLM, RGT) +KNC = (TCG, JPC) +RTX = (MCD, DFJ) +RQB = (PHQ, PTC) +VNJ = (RND, FQB) +DCX = (TCK, JRV) +XVP = (VXQ, LPG) +BJS = (VSJ, GHP) +QSX = (TTL, CFG) +VQJ = (MHF, KRK) +JPT = (DRS, JLL) +BDH = (HGH, TLL) +DLB = (KDP, PCF) +GBX = (TFT, PTL) +FFP = (LPH, RJX) +NFQ = (TTK, NSJ) +HDR = (BRX, KJX) +DBM = (SHR, KBX) +JTS = (RJN, JTR) +BMG = (RKK, DQP) +BRX = (SQH, DCF) +QDM = (PXQ, JSX) +RDK = (KNS, DQH) +MMH = (CBK, KGD) +DPJ = (RGS, PTS) +PLN = (XMJ, MKV) +LQL = (THC, BBN) +HXD = (JCS, VHX) +QVL = (NJC, PBP) +HPJ = (BNM, GNV) +NMV = (DFM, DPB) +JJX = (JBN, QNF) +XFG = (SLC, JBK) +RML = (PGQ, GTH) +CLK = (CVF, PLD) +MHF = (DDM, FGX) +JVZ = (RTM, PLN) +KDB = (CPN, XCM) +CGL = (LJX, HJB) +LXD = (DHN, TQB) +LGG = (CDV, PFB) +QJK = (PJD, SPL) +HXM = (TKJ, XQM) +PLJ = (JVR, QMJ) +VNB = (DPP, LQP) +KFS = (XQD, VQJ) +KNQ = (KTH, XJT) +GRL = (KGH, XGJ) +TLM = (TLH, PTX) +DRF = (QNH, CSJ) +DQC = (KGK, CGL) +GTH = (GLT, MXG) +DVV = (MMQ, KNG) +SKG = (GQD, XDH) +QDR = (BRD, JDT) +SCJ = (VLR, LBX) +PLR = (TRP, BKN) +DFP = (DMC, DLB) +JCT = (HCL, HPT) +MFT = (QDF, VLF) +HMM = (QDQ, BGQ) +JRN = (PFG, DSX) +QMC = (PFG, DSX) +QSM = (PJD, SPL) +PFP = (KNG, MMQ) +XDH = (SRS, NSM) +VQG = (PLF, GXD) +QTF = (VPQ, QFT) +DDX = (TTC, NCN) +TCK = (BVV, VNJ) +SMQ = (KFK, DCX) +LHN = (MCK, BLL) +TCG = (VJD, XVP) +DNC = (TXB, DXK) +DTR = (SHT, KFP) +VFP = (QDM, JLV) +JHX = (PPR, BBG) +STX = (TKG, KLX) +KFP = (GRL, TBM) +RGS = (DQC, FDJ) +LDV = (CBK, KGD) +RCN = (JXJ, KKB) +BQC = (DDX, SXP) +NRB = (SSC, SSC) +MBK = (VPP, GDF) +XDX = (HBQ, XVG) +JXK = (DGK, PGD) +JRV = (BVV, VNJ) +HMA = (VTN, XBM) +BGC = (MCR, NTJ) +TQJ = (KJV, BMG) +SRN = (HDF, SQG) +LFP = (GRV, PCH) +LGD = (GNG, NGP) +MTQ = (GHT, GHT) +GMM = (XDK, BPG) +MHH = (FJH, NLF) +KGK = (LJX, HJB) +CGN = (PLF, GXD) +LQF = (NLF, FJH) +LFN = (VLC, JMM) +CPG = (RVM, SMQ) +PBJ = (FDG, BMR) +VLC = (MTQ, MTQ) +JQT = (DBM, KCM) +DGV = (RTX, SJN) +XXK = (BRD, JDT) +DPB = (KKK, DHR) +VRJ = (GHL, BQC) +VMV = (QLX, SRV) +KRN = (THG, LLN) +SSC = (PLN, RTM) +MGZ = (XBM, VTN) +NNJ = (THH, JNZ) +GNB = (PLJ, DVF) +CSN = (LHN, JKN) +DSS = (SSD, KMB) +BMR = (DXD, PCJ) +KRS = (JCN, DLH) +SMH = (LXT, MVB) +DFH = (LDX, KMN) +LDG = (MVB, LXT) +DCF = (DDC, JNX) +DVC = (CVQ, XJL) +LHF = (RFT, VPM) +SHR = (NND, MPM) +SRV = (VRC, HFC) +RQX = (BFG, FJS) +DNB = (XLR, PBJ) +KKB = (LBB, JXK) +JNZ = (LHF, GPX) +MSR = (SNM, PDN) +SXF = (QKN, RPV) +XLJ = (BHF, SGH) +DDM = (RTL, GGV) +FPT = (DJP, XSD) +DQQ = (HBX, KTP) +GHP = (QPV, DFP) +FSL = (XHX, SRN) +PXQ = (XFP, QLC) +KCN = (NHL, RPK) +HXL = (RLN, XNP) +DHR = (RXR, QQQ) +PRF = (VCC, NPL) +TBP = (PLK, XTT) +PRN = (JQV, DQQ) +THJ = (BCC, DKB) +FGV = (QJK, QSM) +LDX = (QNM, PRF) +SVX = (DRM, TLM) +DKB = (CLL, KFM) +DHN = (PGG, RPX) +TTL = (MVL, XMK) +SCH = (QDQ, QDQ) +MSF = (DQQ, JQV) +NNQ = (NGP, GNG) +HKF = (KNC, FCT) +VVT = (JHX, TDN) +GRV = (BQQ, DRC) +BGB = (HPJ, PQB) +PPR = (QMR, SPG) +FHT = (BHF, SGH) +KBX = (MPM, NND) +TKJ = (QTP, LRQ) +GLS = (PTL, TFT) +TQB = (PGG, RPX) +LHP = (XPX, FGV) +SLM = (VNB, SVQ) +SCC = (RNR, ZZZ) +KQK = (KNF, DTR) +RXR = (VKG, FVB) +CDP = (JSR, TSG) +NND = (XDS, XCL) +LHH = (VPF, NMK) +VJP = (PFP, DVV) +SVJ = (NGS, SMT) +TXM = (SXF, MQH) +KFB = (PFF, KLR) +BVR = (THK, HGL) +DVB = (TMQ, LGG) +SJN = (MCD, DFJ) +PCF = (CTM, JQT) +HDN = (NRB, NRB) +RLN = (JDQ, BTF) +XFP = (SNJ, JJN) +FXC = (DBX, TCB) +VTN = (JJH, PLR) +MPM = (XCL, XDS) +JDF = (DXL, CJL) +MCK = (CJJ, XMT) +LJS = (TJS, RJM) +XCH = (PVF, DST) +LVX = (SXT, RML) +PXS = (PBP, NJC)