From f4c3160afe1a387ff9ef414dd87c96c42372e296 Mon Sep 17 00:00:00 2001 From: Lee Katz Date: Mon, 11 Dec 2023 13:39:56 -0500 Subject: [PATCH] day 8 --- 2023/t/08a.t | 859 ++++++++++++++++++++++++++++++++++++++++++++++++ 2023/t/08b.t | 905 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1764 insertions(+) create mode 100644 2023/t/08a.t create mode 100644 2023/t/08b.t diff --git a/2023/t/08a.t b/2023/t/08a.t new file mode 100644 index 0000000..347cf32 --- /dev/null +++ b/2023/t/08a.t @@ -0,0 +1,859 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use Data::Dumper; +use Test::More tests=>3; + +subtest "Test 1 $0: short path" => sub{ + my $data = " +RL + +AAA = (BBB, CCC) +BBB = (DDD, EEE) +CCC = (ZZZ, GGG) +DDD = (DDD, DDD) +EEE = (EEE, EEE) +GGG = (GGG, GGG) +ZZZ = (ZZZ, ZZZ) + "; + + my $path = findPathToZZZ($data); + my @exp = qw(AAA CCC ZZZ); + is_deeply($path, \@exp, "Path"); + is(scalar(@$path), 2+1, "number of steps"); +}; + +subtest "Test 2 $0: longer path" => sub{ + my $data = " +LLR + +AAA = (BBB, BBB) +BBB = (AAA, ZZZ) +ZZZ = (ZZZ, ZZZ) + "; + + my $path = findPathToZZZ($data); + my @exp = qw(AAA BBB AAA BBB AAA BBB ZZZ); + is_deeply($path, \@exp, "Path"); + is(scalar(@$path), 6+1, "number of steps"); +}; + +subtest "Real $0" => sub{ + local $/ = undef; + my $data = ; + $data =~ s/^\s+|\s+$//g; # whitespace trim on each line + my $path = findPathToZZZ($data); + # 18728 is too high + # 922 is too low if I start with just the first node and not AAA + is(scalar(@$path), 18727 + 1, "number of steps"); +}; + +sub findPathToZZZ{ + my($data) = @_; + + # Left/right index + my %lrIdx = (L=>0, R=>1); + + my @data = grep {/\S+/} split(/\n/, $data); + + # For exmaple, if RL, then the @pattern is (1,0) + my @pattern = map {$lrIdx{$_} } split(//, shift(@data)); + + my %map; + for my $instruction(@data){ + $instruction =~ s/[^A-Z]+/ /g; + my($from, $L, $R) = split(/\s+/, $instruction); + $map{$from} = [$L,$R]; + } + + my $step = 0; + my $here = "AAA"; + my @path = ($here); + do{ + my $patternIdx = $step % scalar(@pattern); + my $leftOrRight = $pattern[$patternIdx]; + + my $there = $map{$here}[$leftOrRight]; + + #note "($step:$patternIdx) $here => $there"; + + $here = $there; + push(@path, $here); + $step++; + }while($here ne "ZZZ"); + + return \@path; +} + +__DATA__ +LRRRLRRLRRLRLRRLRRRLLRRLLRRLRRRLRLRRLLRRLRRLRLRRRLRRRLRLRLRLRRRLRRLRRRLRLRRLLLRLRLLRLRRRLRLRRRLRRRLLLRRLRLRRLRRRLLRRLRRLRRLRRRLRRLRRLRRLRLRRLRLRLRLRLRLRRRLRRLRLLLRRRLRLRRRLRRRLLRRLRRRLRRLRRRLRRRLRLRRRLRRLRLLRRLLRLRRLRLRLLRRLLRRLLRRLRRLRRRLRLRRLRLRRRLRRRLLRLRRLLLLRRRLLRLLLRRLRRRLRRRLRRRLRLRRRLRRRLRRRLRLRRRR + +FJT = (XDJ, LQV) +VLP = (BJP, TTH) +NVD = (KTC, TGT) +VCC = (SRV, GMR) +PNM = (SFQ, XMX) +DPD = (HHJ, MGG) +GQA = (BGC, BHR) +VQH = (RCV, VJC) +VHR = (GLQ, GJF) +SQC = (CDT, HKV) +GSV = (PKP, RMP) +JLZ = (KMM, QCG) +THG = (PTL, SXP) +FTC = (VFH, TPL) +JTT = (VQC, QVC) +KQC = (RCR, TRT) +RGP = (DPG, MFQ) +TDP = (XJV, QCR) +PCC = (LRD, XXR) +MRQ = (PPS, KHB) +TTX = (VSJ, XPN) +JNR = (DFB, NSV) +KJK = (PCR, LMT) +JLB = (GXB, HND) +BJN = (KNX, NXQ) +VDV = (XNB, DTB) +TXB = (DXL, PCN) +MJS = (NQK, PDV) +RPV = (BNF, QNS) +CLM = (KLR, QCT) +SXP = (JMV, MGN) +HQG = (LNV, RTX) +RQJ = (HQG, TSJ) +LGD = (PNM, RHG) +XPN = (LGC, CTR) +JJB = (CDH, TXV) +HVZ = (QRH, VHK) +LSV = (FRK, LXV) +RFH = (KMJ, DKH) +FFV = (DJK, MCR) +BMN = (HLV, NMQ) +RBC = (FVH, CXN) +PVK = (HKJ, LGD) +BHK = (MLL, JCP) +VJF = (DCM, SGJ) +XVB = (QBS, MNF) +NRT = (GLL, GLL) +NXL = (CRV, PQB) +TVC = (RKR, PVD) +LDX = (TKH, BHK) +JPG = (DMK, HHQ) +PHV = (JJS, CKP) +NVQ = (RRC, SHR) +KJH = (JKQ, CCR) +LHV = (MVL, LNK) +BBK = (NMH, SQL) +NXP = (PCH, CNJ) +STL = (LMR, HRB) +CFK = (NGC, KFK) +FGC = (VJM, JPG) +SFQ = (CXR, LCT) +KDN = (JPS, QBJ) +PCR = (DSB, TLL) +JKQ = (MRR, JFS) +FNS = (XNB, DTB) +BBP = (LTR, VLP) +MGN = (RKL, RMN) +HCM = (XPC, PHB) +RNJ = (QVC, VQC) +HVT = (FTN, JJQ) +NGP = (JSJ, TKR) +XBL = (BTH, JXS) +AAA = (GFB, FBF) +HXN = (SMM, RVJ) +CMF = (FJT, QMT) +XLR = (HBL, RXC) +NNK = (RCR, TRT) +HNM = (HKN, KBP) +CNN = (JCX, PXH) +VSF = (QFN, HTG) +MQM = (SSQ, QTS) +NBM = (TPD, CVS) +LJB = (SMK, KJK) +VTD = (NGG, NGG) +BCH = (FXM, BPK) +VJM = (DMK, HHQ) +TVX = (HJP, XSP) +TFD = (TSD, TSD) +XDR = (XPS, RDX) +XPD = (VBR, JLN) +TSJ = (RTX, LNV) +NQK = (FVP, NXF) +DCC = (QJL, QFQ) +HKB = (XBH, RXS) +MCR = (RTL, LSC) +GFB = (PND, KRM) +CVM = (JSH, CMP) +QXK = (VTD, XTD) +QFG = (TVX, TCJ) +GQH = (JLB, SFN) +NPB = (PRQ, MLJ) +LRD = (VDV, FNS) +QBJ = (FTV, QNM) +TBB = (FKD, LKP) +HBL = (VMF, DQJ) +HVC = (PQR, BXX) +TQC = (LNK, MVL) +KFQ = (PBK, KPD) +TRH = (SQD, CHT) +TMT = (RSP, SLD) +JBM = (XJV, QCR) +BXX = (NDN, SHC) +JFM = (GVJ, HLH) +PPP = (HGX, JJT) +DXG = (NPK, SBC) +KDQ = (QKD, XRD) +CDH = (XGJ, RGP) +XMX = (CXR, LCT) +PQN = (CKP, JJS) +VDX = (FRP, KJZ) +FRK = (SBT, HCQ) +TDG = (QTM, SVX) +JSD = (HHN, TJM) +JJS = (TTX, MSV) +ZZZ = (FBF, GFB) +XSP = (JXG, CCD) +GXX = (RQX, NGP) +VTG = (QHF, PPP) +BGC = (RQR, PPG) +MQV = (BDT, RMH) +DKH = (PDS, FGF) +XCA = (VHR, HCS) +GTC = (JSM, PTT) +JVV = (LFG, MQV) +TPP = (RBJ, ZZZ) +SRV = (TFV, LBT) +RPC = (FSM, FQF) +CDD = (SQX, QKV) +QHQ = (PVD, RKR) +QCR = (FXJ, LLB) +VDJ = (NMD, BVB) +VLF = (XHR, JRG) +PDS = (NPB, QHS) +TVM = (DQH, XPD) +SJF = (DXL, PCN) +TPD = (VLG, FGC) +SNM = (MHV, FSN) +SGJ = (CDV, BCH) +TPL = (NRT, FNP) +NBF = (DQH, XPD) +GGP = (QND, CHR) +LMR = (KFM, LMM) +HHQ = (KHG, VCF) +XVN = (TGH, FQM) +QTS = (DRH, XDN) +JPM = (JHQ, FGM) +LSB = (HKB, SPH) +NMQ = (BPF, VCP) +QKC = (SKL, RMD) +SXB = (LFG, MQV) +MRM = (SFR, NRD) +GSG = (LFR, TST) +MRR = (CFK, FXG) +RFS = (DDK, LML) +PTL = (MGN, JMV) +NXF = (PPK, MLT) +KSN = (MCK, HGN) +SFR = (NSN, DDP) +RHB = (KDQ, HQD) +SBM = (LGD, HKJ) +BCN = (BJH, DQC) +KTJ = (QBQ, PPC) +NMD = (RHB, GCD) +DFB = (PNP, HVJ) +GHG = (TGH, FQM) +LGC = (RQQ, KFQ) +NTS = (KJK, SMK) +BFM = (JLB, SFN) +HHK = (NFR, XDR) +PCN = (KKC, TQG) +XJV = (LLB, FXJ) +PPC = (NNK, KQC) +DTB = (RFH, FKB) +QNM = (RQJ, RXM) +HGN = (FJJ, HKQ) +PHJ = (HRH, LCF) +CMR = (VQK, TBM) +SXL = (TVV, TCP) +HPT = (XLR, HGK) +XVX = (PPP, QHF) +XRC = (PCC, SFT) +QXB = (HRR, SHN) +JMV = (RKL, RMN) +RTN = (MRN, STL) +JDD = (LDQ, QPB) +JTB = (HHJ, MGG) +MLM = (TVM, NBF) +BJP = (XTT, XTT) +HQN = (TXT, NJF) +XGV = (KHB, PPS) +XDB = (BHQ, XXC) +QVC = (GNB, CSV) +SFT = (LRD, XXR) +MXB = (MCR, DJK) +NQV = (CVM, PBV) +JQM = (TCP, TVV) +LFG = (BDT, RMH) +SMK = (LMT, PCR) +BXJ = (QMR, TVP) +LDD = (RQX, NGP) +RDX = (DFD, DSX) +KNQ = (BNF, QNS) +JLN = (MBF, XLS) +QFM = (CDD, GCT) +RND = (RTR, QPQ) +FLC = (BJN, NBR) +RRC = (CPK, DDC) +RVD = (DCC, NSC) +KQF = (TDG, HPN) +MPN = (MDC, FDF) +HKQ = (XDM, VCC) +PPK = (BTF, NQV) +QHS = (PRQ, MLJ) +HGK = (RXC, HBL) +DNX = (GMG, TBB) +HVJ = (HCD, DXG) +NHX = (RCF, RQF) +KHB = (PQN, PHV) +LNV = (VJF, BKH) +QMT = (XDJ, LQV) +VJK = (TXB, SJF) +PJH = (HLH, GVJ) +QNS = (MPN, BDP) +TVP = (RLR, MQN) +GBR = (HGG, TJG) +BRM = (LXV, FRK) +JFS = (FXG, CFK) +TKR = (TFD, CDS) +NBR = (KNX, NXQ) +KMJ = (PDS, FGF) +LKK = (NBR, BJN) +KPD = (MBK, TTT) +FVH = (FLL, XPM) +DSF = (JNP, HCM) +FCD = (HTC, XSK) +RNP = (MHH, HQS) +XBB = (SQB, SNM) +SDS = (GNX, BBP) +KBP = (XXT, KXJ) +FDF = (GSV, KGV) +CKP = (MSV, TTX) +MST = (QND, CHR) +RMH = (KNP, SQC) +JJQ = (MFN, VKS) +BXF = (RQT, JGF) +TCP = (JBV, QKC) +LTR = (BJP, BJP) +MNT = (XLR, HGK) +NXX = (NMF, MRM) +KFF = (TDG, HPN) +NCC = (THG, MVT) +KGV = (PKP, RMP) +HVH = (NJG, BND) +RKL = (STN, GTF) +CTH = (TST, LFR) +FQF = (NNC, XBB) +LFR = (GTM, FCD) +SLD = (HNM, MQQ) +TTJ = (FFR, FFR) +DQJ = (MNJ, LSB) +RQF = (XRC, FNX) +XHR = (GGJ, KTJ) +HJP = (CCD, JXG) +CTC = (QVL, KSN) +GQM = (TJM, HHN) +TGT = (MCP, MDH) +PBK = (MBK, TTT) +JGF = (MQX, BXJ) +FLL = (NVD, FKG) +TGH = (VVC, LVF) +MQN = (NKD, JNC) +SVX = (XCM, PPX) +MCP = (HVH, SVN) +FSN = (NXL, SGG) +TQG = (GXX, LDD) +HBA = (QCG, KMM) +DMK = (VCF, KHG) +QKD = (FXF, QFG) +MDH = (SVN, HVH) +QTM = (XCM, PPX) +PMP = (HGG, TJG) +JXS = (TSM, LDX) +LDQ = (NXT, DDV) +KNX = (BPX, RND) +KNP = (HKV, CDT) +XCM = (MPQ, HKC) +KMM = (VXM, XSH) +FFR = (QBS, QBS) +PLN = (GRH, QXB) +JFF = (QTS, SSQ) +FVK = (NBM, JCB) +TQN = (DKD, HHV) +HGX = (MSR, GVB) +CSD = (HHK, BFQ) +CNJ = (SLH, NXX) +THD = (XXC, BHQ) +TNL = (XGH, XKN) +MHH = (GGP, MST) +KQD = (DNK, QGR) +TSD = (VHK, QRH) +DSB = (BGV, NFK) +CPN = (TPG, LPH) +KBV = (LPH, TPG) +DTS = (PQR, BXX) +PPX = (MPQ, HKC) +LLP = (LVH, CJH) +PLL = (SJF, TXB) +CVS = (VLG, FGC) +HHJ = (CSD, DQV) +QFQ = (BTT, VBP) +FVP = (PPK, MLT) +TFV = (QBV, GQG) +NPK = (KNQ, RPV) +DVQ = (RNV, FPF) +DSX = (DGJ, RQB) +PBV = (CMP, JSH) +SQX = (JBN, RPD) +VJC = (SBD, HRK) +RLR = (NKD, JNC) +FTN = (MFN, VKS) +TRB = (RRC, SHR) +LVH = (XDB, THD) +NXB = (CMR, VDB) +JSM = (HQJ, GTD) +HHH = (XXF, JJB) +RPD = (JDD, RPL) +XSF = (QXB, GRH) +XPM = (FKG, NVD) +BNR = (CCT, NXD) +HKN = (KXJ, XXT) +KCP = (FFR, XVB) +PHB = (QFM, PPD) +DLC = (PMP, GBR) +GMG = (FKD, LKP) +DQC = (HQP, MLM) +SMM = (SXL, JQM) +SBP = (JRG, XHR) +GCR = (FPF, RNV) +FNX = (PCC, SFT) +PQB = (NKM, CMF) +TJM = (NXB, NPP) +PPS = (PQN, PHV) +BDP = (FDF, MDC) +CXN = (XPM, FLL) +VDB = (TBM, VQK) +SBD = (TDP, JBM) +NXQ = (RND, BPX) +DRH = (HXN, SKC) +VBG = (BCS, GSN) +LSJ = (GNX, BBP) +VCP = (KMQ, RMC) +MVL = (VMG, SCG) +JCB = (TPD, CVS) +MGG = (DQV, CSD) +RXS = (JTT, RNJ) +BTF = (PBV, CVM) +DFD = (DGJ, RQB) +GGJ = (PPC, QBQ) +BPK = (VBT, KQD) +DKD = (CNN, HSD) +SQD = (PHJ, CSL) +PQG = (JFM, PJH) +RMN = (STN, GTF) +RCV = (HRK, SBD) +MBK = (GKQ, MJS) +CXR = (SDS, LSJ) +XSK = (PLV, TQN) +FBR = (BFM, GQH) +GCD = (KDQ, HQD) +PMF = (FGM, JHQ) +XLP = (RFT, BMN) +NSC = (QFQ, QJL) +SHR = (CPK, DDC) +DXL = (TQG, KKC) +TTH = (XTT, TKZ) +CGS = (KSN, QVL) +QHF = (HGX, JJT) +NFR = (XPS, RDX) +CHR = (BBK, FLR) +RPL = (LDQ, QPB) +GTD = (MRJ, KJH) +PNP = (HCD, DXG) +GCT = (QKV, SQX) +SGG = (CRV, PQB) +HNN = (BVB, NMD) +HLK = (CLM, DDL) +GSN = (VDJ, HNN) +KFB = (JRQ, DSF) +XXR = (FNS, VDV) +FJJ = (XDM, VCC) +TCJ = (HJP, XSP) +DJK = (RTL, LSC) +NJF = (FKL, BNB) +BGV = (JSD, GQM) +JSH = (VTG, XVX) +JBV = (RMD, SKL) +RNV = (KBV, CPN) +FKB = (KMJ, DKH) +CDT = (HVC, DTS) +TQT = (TPR, VSF) +FNG = (LKK, FLC) +RBJ = (GFB, FBF) +RTR = (KFB, VHB) +BKH = (SGJ, DCM) +JRG = (GGJ, KTJ) +GTF = (TVC, QHQ) +JXG = (KQF, KFF) +MBF = (GXS, NQR) +GNB = (FLF, MTB) +KFK = (FMH, DLS) +LBT = (GQG, QBV) +CGT = (VSF, TPR) +GVA = (CTG, VQH) +FNP = (GLL, TPP) +RQT = (BXJ, MQX) +CDV = (BPK, FXM) +JCX = (QVX, LKM) +XSH = (SXB, JVV) +HKV = (DTS, HVC) +MRN = (HRB, LMR) +SBX = (CHT, SQD) +FRP = (CTG, VQH) +HHN = (NPP, NXB) +NGG = (SJL, SJL) +BJB = (KRL, JNR) +GNX = (LTR, LTR) +RCR = (KBH, NCC) +NDN = (MQM, JFF) +VXT = (JGF, RQT) +PPG = (BBG, THJ) +CDS = (TSD, HVZ) +VSJ = (LGC, CTR) +NSN = (DNF, TMT) +VRJ = (GBR, PMP) +CDQ = (VLF, SBP) +XDN = (HXN, SKC) +LCF = (FTM, CDQ) +HCQ = (DCF, RTN) +BPF = (KMQ, KMQ) +NNC = (SQB, SNM) +LQV = (SHQ, FTC) +VFH = (NRT, NRT) +VHK = (TMN, FNG) +LPH = (BMT, NHX) +PPD = (GCT, CDD) +BXH = (VTD, XTD) +LMT = (TLL, DSB) +TSM = (TKH, BHK) +KMQ = (NCS, NCS) +FTV = (RXM, RQJ) +XGJ = (MFQ, DPG) +RXM = (TSJ, HQG) +QBV = (SSH, QTB) +TBM = (HHR, FVK) +CCR = (MRR, JFS) +SKL = (GHG, XVN) +HRK = (JBM, TDP) +MFQ = (PQG, PDF) +DNK = (QJX, BGP) +BDL = (GMG, TBB) +MQQ = (HKN, KBP) +RQR = (THJ, BBG) +KFM = (GKN, DFN) +XKN = (HTL, PVS) +PDF = (JFM, PJH) +TTT = (GKQ, MJS) +RHG = (SFQ, XMX) +XTD = (NGG, NRM) +LXV = (SBT, HCQ) +HCD = (NPK, SBC) +TFT = (RFT, BMN) +DDK = (MCS, DFR) +DFR = (SBX, TRH) +BND = (GHM, BDJ) +SFN = (GXB, HND) +HQD = (QKD, XRD) +RMC = (NCS, LLZ) +RQQ = (PBK, KPD) +LKP = (PVK, SBM) +PQR = (SHC, NDN) +DGJ = (TKT, XXV) +CHF = (QCG, KMM) +SCG = (BDL, DNX) +TJG = (HHH, KJG) +PDV = (FVP, NXF) +HGG = (KJG, HHH) +VHB = (JRQ, DSF) +KBH = (THG, MVT) +PVD = (BRM, LSV) +MNJ = (HKB, SPH) +CJH = (THD, XDB) +DCF = (STL, MRN) +XLS = (GXS, NQR) +SBC = (RPV, KNQ) +BTH = (LDX, TSM) +CPV = (JXS, BTH) +DGR = (XLP, TFT) +NFK = (GQM, JSD) +VBP = (THN, BDB) +RTL = (HQN, XQT) +SJL = (FRP, FRP) +XPC = (QFM, PPD) +FXM = (VBT, KQD) +MCK = (FJJ, HKQ) +KRM = (DPD, JTB) +BNF = (MPN, BDP) +SQB = (MHV, FSN) +QKV = (JBN, RPD) +QBQ = (KQC, NNK) +FPF = (CPN, KBV) +SPH = (XBH, RXS) +PLV = (HHV, DKD) +DQV = (BFQ, HHK) +NJQ = (LHV, TQC) +PXH = (LKM, QVX) +TMN = (FLC, LKK) +LVF = (FBR, GTB) +BCS = (VDJ, HNN) +HHR = (JCB, NBM) +HHD = (NXD, CCT) +FGF = (QHS, NPB) +LSC = (XQT, HQN) +HQJ = (MRJ, KJH) +CHT = (PHJ, CSL) +HLH = (DGR, LTS) +NRD = (DDP, NSN) +JBN = (JDD, RPL) +TRT = (KBH, NCC) +HHV = (HSD, CNN) +DDL = (QCT, KLR) +CSV = (MTB, FLF) +SLH = (NMF, MRM) +THJ = (VLR, RNP) +CTG = (VJC, RCV) +MLL = (HVT, TDH) +HLV = (BPF, BPF) +XJS = (DQC, BJH) +RMD = (GHG, XVN) +BGP = (GCR, DVQ) +RCF = (FNX, XRC) +GHM = (XBL, CPV) +DLS = (HPT, MNT) +BDB = (BJB, QHM) +SVN = (BND, NJG) +NSV = (HVJ, PNP) +VQC = (GNB, CSV) +BHR = (PPG, RQR) +CCD = (KFF, KQF) +SBB = (TBJ, HLK) +VVC = (FBR, GTB) +SHQ = (VFH, TPL) +VMF = (MNJ, LSB) +MSV = (XPN, VSJ) +TDH = (JJQ, FTN) +RXC = (DQJ, VMF) +RSP = (MQQ, HNM) +SSH = (GLF, RVD) +LTS = (TFT, XLP) +HTC = (PLV, TQN) +GLF = (NSC, DCC) +BTT = (THN, BDB) +DFN = (RPC, CPJ) +NKM = (QMT, FJT) +RMP = (LLP, GHD) +PRQ = (DLC, VRJ) +TBJ = (CLM, DDL) +CPJ = (FSM, FQF) +LHD = (GSN, BCS) +GLL = (RBJ, RBJ) +TXT = (FKL, BNB) +NCS = (VHR, HCS) +GLQ = (JFN, TNL) +BMT = (RCF, RQF) +JRQ = (HCM, JNP) +FXJ = (VXT, BXF) +GMR = (LBT, TFV) +NMH = (XJS, BCN) +RQX = (JSJ, JSJ) +VXM = (JVV, SXB) +PCH = (SLH, NXX) +TXV = (XGJ, RGP) +XNB = (FKB, RFH) +JPS = (FTV, QNM) +JSJ = (TFD, TFD) +LLZ = (HCS, VHR) +HPN = (QTM, SVX) +DPG = (PQG, PDF) +NKD = (CTC, CGS) +TKZ = (BHR, BGC) +HRB = (KFM, LMM) +TLL = (NFK, BGV) +MPQ = (KDN, DSR) +BVB = (RHB, GCD) +JFN = (XKN, XGH) +QTB = (RVD, GLF) +BFQ = (NFR, XDR) +LCT = (SDS, LSJ) +SQL = (BCN, XJS) +LML = (MCS, DFR) +NMF = (SFR, NRD) +CPK = (BXH, QXK) +JHQ = (RFS, BQS) +QRH = (FNG, TMN) +MLT = (NQV, BTF) +BJH = (HQP, MLM) +XHC = (TBJ, HLK) +VQK = (FVK, HHR) +NXD = (LJB, NTS) +FSM = (NNC, XBB) +KHG = (GTC, RPG) +RTX = (BKH, VJF) +HSD = (PXH, JCX) +PND = (JTB, DPD) +CRV = (NKM, CMF) +FMH = (HPT, MNT) +BPX = (QPQ, RTR) +THN = (BJB, QHM) +XBH = (JTT, RNJ) +GVJ = (LTS, DGR) +KRL = (DFB, NSV) +XPS = (DFD, DSX) +TST = (GTM, FCD) +GKQ = (PDV, NQK) +HKC = (KDN, DSR) +DQH = (VBR, JLN) +GJF = (JFN, TNL) +QBS = (CHF, CHF) +HTL = (NXP, LGP) +MCS = (TRH, SBX) +RKR = (BRM, LSV) +VBR = (MBF, XLS) +FKD = (SBM, PVK) +FXF = (TVX, TCJ) +FBF = (KRM, PND) +QJL = (BTT, VBP) +QJX = (GCR, DVQ) +NGC = (FMH, DLS) +TPG = (BMT, NHX) +GTM = (HTC, XSK) +CTR = (KFQ, RQQ) +NQR = (HHD, BNR) +XGH = (PVS, HTL) +LKM = (VJK, PLL) +SHN = (JPM, PMF) +LMM = (DFN, GKN) +DDV = (SBB, XHC) +GQG = (QTB, SSH) +DDP = (DNF, TMT) +CSL = (HRH, LCF) +LLB = (VXT, BXF) +NPP = (VDB, CMR) +HKJ = (RHG, PNM) +QVL = (HGN, MCK) +TVV = (JBV, QKC) +MVT = (SXP, PTL) +VBT = (DNK, QGR) +XRD = (QFG, FXF) +GTB = (BFM, GQH) +JNP = (XPC, PHB) +KTC = (MDH, MCP) +QVX = (PLL, VJK) +QFN = (TRB, NVQ) +VLR = (HQS, MHH) +BDT = (SQC, KNP) +JCP = (TDH, HVT) +KKC = (GXX, LDD) +BDJ = (CPV, XBL) +GRH = (SHN, HRR) +GXB = (RBC, BTC) +MNF = (CHF, JLZ) +FGM = (RFS, BQS) +RVJ = (SXL, JQM) +FXG = (NGC, KFK) +HND = (RBC, BTC) +NXT = (XHC, SBB) +FKG = (KTC, TGT) +MQX = (QMR, TVP) +JJT = (GVB, MSR) +MHV = (SGG, NXL) +KJG = (JJB, XXF) +SBT = (DCF, RTN) +TPR = (QFN, HTG) +BNB = (XGV, MRQ) +XXT = (VBG, LHD) +PKP = (LLP, GHD) +HCS = (GLQ, GJF) +TKT = (XSF, PLN) +HRR = (PMF, JPM) +BHQ = (CGT, TQT) +FKL = (XGV, MRQ) +HRH = (FTM, CDQ) +QPB = (NXT, DDV) +XDJ = (SHQ, FTC) +PTT = (GTD, HQJ) +MDC = (KGV, GSV) +KXJ = (VBG, LHD) +FLF = (NJQ, MFB) +FTM = (VLF, SBP) +QCT = (FFV, MXB) +HTG = (TRB, NVQ) +TKH = (JCP, MLL) +XXC = (CGT, TQT) +MFN = (TTJ, KCP) +HQS = (MST, GGP) +GKN = (CPJ, RPC) +RQB = (XXV, TKT) +VKS = (TTJ, KCP) +QMR = (RLR, MQN) +XTT = (BGC, BHR) +MRJ = (JKQ, CCR) +SKC = (SMM, RVJ) +PVS = (LGP, NXP) +GXS = (BNR, HHD) +GVB = (GSG, CTH) +FQM = (LVF, VVC) +CMP = (XVX, VTG) +NVA = (VHK, QRH) +CCT = (NTS, LJB) +KJZ = (VQH, CTG) +STN = (TVC, QHQ) +HQP = (TVM, NBF) +DDC = (BXH, QXK) +QGR = (QJX, BGP) +GHD = (CJH, LVH) +MTB = (MFB, NJQ) +SSQ = (DRH, XDN) +QND = (FLR, BBK) +LGP = (CNJ, PCH) +RPG = (JSM, PTT) +XXF = (CDH, TXV) +XDM = (SRV, GMR) +VLG = (JPG, VJM) +NJG = (BDJ, GHM) +VCF = (GTC, RPG) +DSR = (QBJ, JPS) +DNF = (SLD, RSP) +MSR = (GSG, CTH) +BBG = (VLR, RNP) +XXV = (PLN, XSF) +MLJ = (VRJ, DLC) +MFB = (LHV, TQC) +QPQ = (KFB, VHB) +DCM = (CDV, BCH) +NRM = (SJL, VDX) +JNC = (CTC, CGS) +XQT = (TXT, NJF) +FLR = (NMH, SQL) +BQS = (DDK, LML) +BTC = (FVH, CXN) +QHM = (KRL, JNR) +RFT = (HLV, NMQ) +KLR = (FFV, MXB) +SHC = (MQM, JFF) +LNK = (VMG, SCG) +QCG = (VXM, XSH) +VMG = (DNX, BDL) + + diff --git a/2023/t/08b.t b/2023/t/08b.t new file mode 100644 index 0000000..4dc1c73 --- /dev/null +++ b/2023/t/08b.t @@ -0,0 +1,905 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use Data::Dumper; +use Test::More tests=>2; + +subtest "Test 1 $0" => sub{ + my $data = " +LR + +11A = (11B, XXX) +11B = (XXX, 11Z) +11Z = (11B, XXX) +22A = (22B, XXX) +22B = (22C, 22C) +22C = (22Z, 22Z) +22Z = (22B, 22B) +XXX = (XXX, XXX) + "; + + my $path = findPathsToZ($data); + my %exp = ( + '11A' => [qw(11B 11Z)], + '22A' => [qw(22B 22C 22Z)], + ); + + is_deeply($path, \%exp, "Path"); + + my @numSteps = map{scalar(@$_)} values(%$path); + my $lcm = multilcm(@numSteps); + is($lcm, 6, "Lowest common multiple"); + +}; + +subtest "Real $0" => sub{ + local $/ = undef; + my $data = ; + $data =~ s/^\s+|\s+$//g; # whitespace trim on each line + + my $path = findPathsToZ($data); + my @numSteps = map{scalar(@$_)} values(%$path); + my $lcm = multilcm(@numSteps); + # 1724072616 is too low + is($lcm, 18024643846273, "Lowest common multiple"); +}; + +=cut +GQA: cycle 22411 +AAA: cycle 18727 +XCA: cycle 24253 +HBA: cycle 14429 +GVA: cycle 16271 +NVA: cycle 20569 +18024643846273 +=cut + +sub findPathsToZ{ + my($data) = @_; + + # Left/right index + my %lrIdx = (L=>0, R=>1); + + my @data = grep {/\S+/} split(/\n/, $data); + + # For exmaple, if RL, then the @pattern is (1,0) + my @pattern = map {$lrIdx{$_} } split(//, shift(@data)); + + my %map; + for my $instruction(@data){ + $instruction =~ s/[^A-Z0-9]+/ /g; + my($from, $L, $R) = split(/\s+/, $instruction); + $map{$from} = [$L,$R]; + } + + # Figure out all the ghost start positions + my %path; + my @starts = sort grep{/A$/} keys(%map); + + for(my $i=0;$i<@starts;$i++){ + + my @path = ($starts[$i]); + my %seen; + my $key=""; + my $step = 0; + while(1){ + my $patternIdx = $step % scalar(@pattern); + my $leftOrRight = $pattern[$patternIdx]; + my $here = $path[-1]; + my $there = $map{$here}[$leftOrRight]; + + $key = $here.".".$leftOrRight; + push(@path, $there); + #if($seen{$key}++){ + if($there =~ /Z$/){ + last; + } + + $step++; + } + shift(@path); + #pop(@path); + + $path{$starts[$i]} = \@path; + + } + #die Dumper \%seen; + + return \%path; +} + +# https://www.perlmonks.org/?node_id=56906 +# least common multiple +sub lcm { + return($_[0] * $_[1] / gcf($_[0], $_[1])); +} +# greatest common factor +sub gcf { + my ($x, $y) = @_; + ($x, $y) = ($y, $x % $y) while $y; + return $x; +} +sub multigcf { + my $x = shift; + $x = gcf($x, shift) while @_; + return $x; +} + +sub multilcm { + my $x = shift; + $x = lcm($x, shift) while @_; + return $x; +} + +__DATA__ +LRRRLRRLRRLRLRRLRRRLLRRLLRRLRRRLRLRRLLRRLRRLRLRRRLRRRLRLRLRLRRRLRRLRRRLRLRRLLLRLRLLRLRRRLRLRRRLRRRLLLRRLRLRRLRRRLLRRLRRLRRLRRRLRRLRRLRRLRLRRLRLRLRLRLRLRRRLRRLRLLLRRRLRLRRRLRRRLLRRLRRRLRRLRRRLRRRLRLRRRLRRLRLLRRLLRLRRLRLRLLRRLLRRLLRRLRRLRRRLRLRRLRLRRRLRRRLLRLRRLLLLRRRLLRLLLRRLRRRLRRRLRRRLRLRRRLRRRLRRRLRLRRRR + +FJT = (XDJ, LQV) +VLP = (BJP, TTH) +NVD = (KTC, TGT) +VCC = (SRV, GMR) +PNM = (SFQ, XMX) +DPD = (HHJ, MGG) +GQA = (BGC, BHR) +VQH = (RCV, VJC) +VHR = (GLQ, GJF) +SQC = (CDT, HKV) +GSV = (PKP, RMP) +JLZ = (KMM, QCG) +THG = (PTL, SXP) +FTC = (VFH, TPL) +JTT = (VQC, QVC) +KQC = (RCR, TRT) +RGP = (DPG, MFQ) +TDP = (XJV, QCR) +PCC = (LRD, XXR) +MRQ = (PPS, KHB) +TTX = (VSJ, XPN) +JNR = (DFB, NSV) +KJK = (PCR, LMT) +JLB = (GXB, HND) +BJN = (KNX, NXQ) +VDV = (XNB, DTB) +TXB = (DXL, PCN) +MJS = (NQK, PDV) +RPV = (BNF, QNS) +CLM = (KLR, QCT) +SXP = (JMV, MGN) +HQG = (LNV, RTX) +RQJ = (HQG, TSJ) +LGD = (PNM, RHG) +XPN = (LGC, CTR) +JJB = (CDH, TXV) +HVZ = (QRH, VHK) +LSV = (FRK, LXV) +RFH = (KMJ, DKH) +FFV = (DJK, MCR) +BMN = (HLV, NMQ) +RBC = (FVH, CXN) +PVK = (HKJ, LGD) +BHK = (MLL, JCP) +VJF = (DCM, SGJ) +XVB = (QBS, MNF) +NRT = (GLL, GLL) +NXL = (CRV, PQB) +TVC = (RKR, PVD) +LDX = (TKH, BHK) +JPG = (DMK, HHQ) +PHV = (JJS, CKP) +NVQ = (RRC, SHR) +KJH = (JKQ, CCR) +LHV = (MVL, LNK) +BBK = (NMH, SQL) +NXP = (PCH, CNJ) +STL = (LMR, HRB) +CFK = (NGC, KFK) +FGC = (VJM, JPG) +SFQ = (CXR, LCT) +KDN = (JPS, QBJ) +PCR = (DSB, TLL) +JKQ = (MRR, JFS) +FNS = (XNB, DTB) +BBP = (LTR, VLP) +MGN = (RKL, RMN) +HCM = (XPC, PHB) +RNJ = (QVC, VQC) +HVT = (FTN, JJQ) +NGP = (JSJ, TKR) +XBL = (BTH, JXS) +AAA = (GFB, FBF) +HXN = (SMM, RVJ) +CMF = (FJT, QMT) +XLR = (HBL, RXC) +NNK = (RCR, TRT) +HNM = (HKN, KBP) +CNN = (JCX, PXH) +VSF = (QFN, HTG) +MQM = (SSQ, QTS) +NBM = (TPD, CVS) +LJB = (SMK, KJK) +VTD = (NGG, NGG) +BCH = (FXM, BPK) +VJM = (DMK, HHQ) +TVX = (HJP, XSP) +TFD = (TSD, TSD) +XDR = (XPS, RDX) +XPD = (VBR, JLN) +TSJ = (RTX, LNV) +NQK = (FVP, NXF) +DCC = (QJL, QFQ) +HKB = (XBH, RXS) +MCR = (RTL, LSC) +GFB = (PND, KRM) +CVM = (JSH, CMP) +QXK = (VTD, XTD) +QFG = (TVX, TCJ) +GQH = (JLB, SFN) +NPB = (PRQ, MLJ) +LRD = (VDV, FNS) +QBJ = (FTV, QNM) +TBB = (FKD, LKP) +HBL = (VMF, DQJ) +HVC = (PQR, BXX) +TQC = (LNK, MVL) +KFQ = (PBK, KPD) +TRH = (SQD, CHT) +TMT = (RSP, SLD) +JBM = (XJV, QCR) +BXX = (NDN, SHC) +JFM = (GVJ, HLH) +PPP = (HGX, JJT) +DXG = (NPK, SBC) +KDQ = (QKD, XRD) +CDH = (XGJ, RGP) +XMX = (CXR, LCT) +PQN = (CKP, JJS) +VDX = (FRP, KJZ) +FRK = (SBT, HCQ) +TDG = (QTM, SVX) +JSD = (HHN, TJM) +JJS = (TTX, MSV) +ZZZ = (FBF, GFB) +XSP = (JXG, CCD) +GXX = (RQX, NGP) +VTG = (QHF, PPP) +BGC = (RQR, PPG) +MQV = (BDT, RMH) +DKH = (PDS, FGF) +XCA = (VHR, HCS) +GTC = (JSM, PTT) +JVV = (LFG, MQV) +TPP = (RBJ, ZZZ) +SRV = (TFV, LBT) +RPC = (FSM, FQF) +CDD = (SQX, QKV) +QHQ = (PVD, RKR) +QCR = (FXJ, LLB) +VDJ = (NMD, BVB) +VLF = (XHR, JRG) +PDS = (NPB, QHS) +TVM = (DQH, XPD) +SJF = (DXL, PCN) +TPD = (VLG, FGC) +SNM = (MHV, FSN) +SGJ = (CDV, BCH) +TPL = (NRT, FNP) +NBF = (DQH, XPD) +GGP = (QND, CHR) +LMR = (KFM, LMM) +HHQ = (KHG, VCF) +XVN = (TGH, FQM) +QTS = (DRH, XDN) +JPM = (JHQ, FGM) +LSB = (HKB, SPH) +NMQ = (BPF, VCP) +QKC = (SKL, RMD) +SXB = (LFG, MQV) +MRM = (SFR, NRD) +GSG = (LFR, TST) +MRR = (CFK, FXG) +RFS = (DDK, LML) +PTL = (MGN, JMV) +NXF = (PPK, MLT) +KSN = (MCK, HGN) +SFR = (NSN, DDP) +RHB = (KDQ, HQD) +SBM = (LGD, HKJ) +BCN = (BJH, DQC) +KTJ = (QBQ, PPC) +NMD = (RHB, GCD) +DFB = (PNP, HVJ) +GHG = (TGH, FQM) +LGC = (RQQ, KFQ) +NTS = (KJK, SMK) +BFM = (JLB, SFN) +HHK = (NFR, XDR) +PCN = (KKC, TQG) +XJV = (LLB, FXJ) +PPC = (NNK, KQC) +DTB = (RFH, FKB) +QNM = (RQJ, RXM) +HGN = (FJJ, HKQ) +PHJ = (HRH, LCF) +CMR = (VQK, TBM) +SXL = (TVV, TCP) +HPT = (XLR, HGK) +XVX = (PPP, QHF) +XRC = (PCC, SFT) +QXB = (HRR, SHN) +JMV = (RKL, RMN) +RTN = (MRN, STL) +JDD = (LDQ, QPB) +JTB = (HHJ, MGG) +MLM = (TVM, NBF) +BJP = (XTT, XTT) +HQN = (TXT, NJF) +XGV = (KHB, PPS) +XDB = (BHQ, XXC) +QVC = (GNB, CSV) +SFT = (LRD, XXR) +MXB = (MCR, DJK) +NQV = (CVM, PBV) +JQM = (TCP, TVV) +LFG = (BDT, RMH) +SMK = (LMT, PCR) +BXJ = (QMR, TVP) +LDD = (RQX, NGP) +RDX = (DFD, DSX) +KNQ = (BNF, QNS) +JLN = (MBF, XLS) +QFM = (CDD, GCT) +RND = (RTR, QPQ) +FLC = (BJN, NBR) +RRC = (CPK, DDC) +RVD = (DCC, NSC) +KQF = (TDG, HPN) +MPN = (MDC, FDF) +HKQ = (XDM, VCC) +PPK = (BTF, NQV) +QHS = (PRQ, MLJ) +HGK = (RXC, HBL) +DNX = (GMG, TBB) +HVJ = (HCD, DXG) +NHX = (RCF, RQF) +KHB = (PQN, PHV) +LNV = (VJF, BKH) +QMT = (XDJ, LQV) +VJK = (TXB, SJF) +PJH = (HLH, GVJ) +QNS = (MPN, BDP) +TVP = (RLR, MQN) +GBR = (HGG, TJG) +BRM = (LXV, FRK) +JFS = (FXG, CFK) +TKR = (TFD, CDS) +NBR = (KNX, NXQ) +KMJ = (PDS, FGF) +LKK = (NBR, BJN) +KPD = (MBK, TTT) +FVH = (FLL, XPM) +DSF = (JNP, HCM) +FCD = (HTC, XSK) +RNP = (MHH, HQS) +XBB = (SQB, SNM) +SDS = (GNX, BBP) +KBP = (XXT, KXJ) +FDF = (GSV, KGV) +CKP = (MSV, TTX) +MST = (QND, CHR) +RMH = (KNP, SQC) +JJQ = (MFN, VKS) +BXF = (RQT, JGF) +TCP = (JBV, QKC) +LTR = (BJP, BJP) +MNT = (XLR, HGK) +NXX = (NMF, MRM) +KFF = (TDG, HPN) +NCC = (THG, MVT) +KGV = (PKP, RMP) +HVH = (NJG, BND) +RKL = (STN, GTF) +CTH = (TST, LFR) +FQF = (NNC, XBB) +LFR = (GTM, FCD) +SLD = (HNM, MQQ) +TTJ = (FFR, FFR) +DQJ = (MNJ, LSB) +RQF = (XRC, FNX) +XHR = (GGJ, KTJ) +HJP = (CCD, JXG) +CTC = (QVL, KSN) +GQM = (TJM, HHN) +TGT = (MCP, MDH) +PBK = (MBK, TTT) +JGF = (MQX, BXJ) +FLL = (NVD, FKG) +TGH = (VVC, LVF) +MQN = (NKD, JNC) +SVX = (XCM, PPX) +MCP = (HVH, SVN) +FSN = (NXL, SGG) +TQG = (GXX, LDD) +HBA = (QCG, KMM) +DMK = (VCF, KHG) +QKD = (FXF, QFG) +MDH = (SVN, HVH) +QTM = (XCM, PPX) +PMP = (HGG, TJG) +JXS = (TSM, LDX) +LDQ = (NXT, DDV) +KNX = (BPX, RND) +KNP = (HKV, CDT) +XCM = (MPQ, HKC) +KMM = (VXM, XSH) +FFR = (QBS, QBS) +PLN = (GRH, QXB) +JFF = (QTS, SSQ) +FVK = (NBM, JCB) +TQN = (DKD, HHV) +HGX = (MSR, GVB) +CSD = (HHK, BFQ) +CNJ = (SLH, NXX) +THD = (XXC, BHQ) +TNL = (XGH, XKN) +MHH = (GGP, MST) +KQD = (DNK, QGR) +TSD = (VHK, QRH) +DSB = (BGV, NFK) +CPN = (TPG, LPH) +KBV = (LPH, TPG) +DTS = (PQR, BXX) +PPX = (MPQ, HKC) +LLP = (LVH, CJH) +PLL = (SJF, TXB) +CVS = (VLG, FGC) +HHJ = (CSD, DQV) +QFQ = (BTT, VBP) +FVP = (PPK, MLT) +TFV = (QBV, GQG) +NPK = (KNQ, RPV) +DVQ = (RNV, FPF) +DSX = (DGJ, RQB) +PBV = (CMP, JSH) +SQX = (JBN, RPD) +VJC = (SBD, HRK) +RLR = (NKD, JNC) +FTN = (MFN, VKS) +TRB = (RRC, SHR) +LVH = (XDB, THD) +NXB = (CMR, VDB) +JSM = (HQJ, GTD) +HHH = (XXF, JJB) +RPD = (JDD, RPL) +XSF = (QXB, GRH) +XPM = (FKG, NVD) +BNR = (CCT, NXD) +HKN = (KXJ, XXT) +KCP = (FFR, XVB) +PHB = (QFM, PPD) +DLC = (PMP, GBR) +GMG = (FKD, LKP) +DQC = (HQP, MLM) +SMM = (SXL, JQM) +SBP = (JRG, XHR) +GCR = (FPF, RNV) +FNX = (PCC, SFT) +PQB = (NKM, CMF) +TJM = (NXB, NPP) +PPS = (PQN, PHV) +BDP = (FDF, MDC) +CXN = (XPM, FLL) +VDB = (TBM, VQK) +SBD = (TDP, JBM) +NXQ = (RND, BPX) +DRH = (HXN, SKC) +VBG = (BCS, GSN) +LSJ = (GNX, BBP) +VCP = (KMQ, RMC) +MVL = (VMG, SCG) +JCB = (TPD, CVS) +MGG = (DQV, CSD) +RXS = (JTT, RNJ) +BTF = (PBV, CVM) +DFD = (DGJ, RQB) +GGJ = (PPC, QBQ) +BPK = (VBT, KQD) +DKD = (CNN, HSD) +SQD = (PHJ, CSL) +PQG = (JFM, PJH) +RMN = (STN, GTF) +RCV = (HRK, SBD) +MBK = (GKQ, MJS) +CXR = (SDS, LSJ) +XSK = (PLV, TQN) +FBR = (BFM, GQH) +GCD = (KDQ, HQD) +PMF = (FGM, JHQ) +XLP = (RFT, BMN) +NSC = (QFQ, QJL) +SHR = (CPK, DDC) +DXL = (TQG, KKC) +TTH = (XTT, TKZ) +CGS = (KSN, QVL) +QHF = (HGX, JJT) +NFR = (XPS, RDX) +CHR = (BBK, FLR) +RPL = (LDQ, QPB) +GTD = (MRJ, KJH) +PNP = (HCD, DXG) +GCT = (QKV, SQX) +SGG = (CRV, PQB) +HNN = (BVB, NMD) +HLK = (CLM, DDL) +GSN = (VDJ, HNN) +KFB = (JRQ, DSF) +XXR = (FNS, VDV) +FJJ = (XDM, VCC) +TCJ = (HJP, XSP) +DJK = (RTL, LSC) +NJF = (FKL, BNB) +BGV = (JSD, GQM) +JSH = (VTG, XVX) +JBV = (RMD, SKL) +RNV = (KBV, CPN) +FKB = (KMJ, DKH) +CDT = (HVC, DTS) +TQT = (TPR, VSF) +FNG = (LKK, FLC) +RBJ = (GFB, FBF) +RTR = (KFB, VHB) +BKH = (SGJ, DCM) +JRG = (GGJ, KTJ) +GTF = (TVC, QHQ) +JXG = (KQF, KFF) +MBF = (GXS, NQR) +GNB = (FLF, MTB) +KFK = (FMH, DLS) +LBT = (GQG, QBV) +CGT = (VSF, TPR) +GVA = (CTG, VQH) +FNP = (GLL, TPP) +RQT = (BXJ, MQX) +CDV = (BPK, FXM) +JCX = (QVX, LKM) +XSH = (SXB, JVV) +HKV = (DTS, HVC) +MRN = (HRB, LMR) +SBX = (CHT, SQD) +FRP = (CTG, VQH) +HHN = (NPP, NXB) +NGG = (SJL, SJL) +BJB = (KRL, JNR) +GNX = (LTR, LTR) +RCR = (KBH, NCC) +NDN = (MQM, JFF) +VXT = (JGF, RQT) +PPG = (BBG, THJ) +CDS = (TSD, HVZ) +VSJ = (LGC, CTR) +NSN = (DNF, TMT) +VRJ = (GBR, PMP) +CDQ = (VLF, SBP) +XDN = (HXN, SKC) +LCF = (FTM, CDQ) +HCQ = (DCF, RTN) +BPF = (KMQ, KMQ) +NNC = (SQB, SNM) +LQV = (SHQ, FTC) +VFH = (NRT, NRT) +VHK = (TMN, FNG) +LPH = (BMT, NHX) +PPD = (GCT, CDD) +BXH = (VTD, XTD) +LMT = (TLL, DSB) +TSM = (TKH, BHK) +KMQ = (NCS, NCS) +FTV = (RXM, RQJ) +XGJ = (MFQ, DPG) +RXM = (TSJ, HQG) +QBV = (SSH, QTB) +TBM = (HHR, FVK) +CCR = (MRR, JFS) +SKL = (GHG, XVN) +HRK = (JBM, TDP) +MFQ = (PQG, PDF) +DNK = (QJX, BGP) +BDL = (GMG, TBB) +MQQ = (HKN, KBP) +RQR = (THJ, BBG) +KFM = (GKN, DFN) +XKN = (HTL, PVS) +PDF = (JFM, PJH) +TTT = (GKQ, MJS) +RHG = (SFQ, XMX) +XTD = (NGG, NRM) +LXV = (SBT, HCQ) +HCD = (NPK, SBC) +TFT = (RFT, BMN) +DDK = (MCS, DFR) +DFR = (SBX, TRH) +BND = (GHM, BDJ) +SFN = (GXB, HND) +HQD = (QKD, XRD) +RMC = (NCS, LLZ) +RQQ = (PBK, KPD) +LKP = (PVK, SBM) +PQR = (SHC, NDN) +DGJ = (TKT, XXV) +CHF = (QCG, KMM) +SCG = (BDL, DNX) +TJG = (HHH, KJG) +PDV = (FVP, NXF) +HGG = (KJG, HHH) +VHB = (JRQ, DSF) +KBH = (THG, MVT) +PVD = (BRM, LSV) +MNJ = (HKB, SPH) +CJH = (THD, XDB) +DCF = (STL, MRN) +XLS = (GXS, NQR) +SBC = (RPV, KNQ) +BTH = (LDX, TSM) +CPV = (JXS, BTH) +DGR = (XLP, TFT) +NFK = (GQM, JSD) +VBP = (THN, BDB) +RTL = (HQN, XQT) +SJL = (FRP, FRP) +XPC = (QFM, PPD) +FXM = (VBT, KQD) +MCK = (FJJ, HKQ) +KRM = (DPD, JTB) +BNF = (MPN, BDP) +SQB = (MHV, FSN) +QKV = (JBN, RPD) +QBQ = (KQC, NNK) +FPF = (CPN, KBV) +SPH = (XBH, RXS) +PLV = (HHV, DKD) +DQV = (BFQ, HHK) +NJQ = (LHV, TQC) +PXH = (LKM, QVX) +TMN = (FLC, LKK) +LVF = (FBR, GTB) +BCS = (VDJ, HNN) +HHR = (JCB, NBM) +HHD = (NXD, CCT) +FGF = (QHS, NPB) +LSC = (XQT, HQN) +HQJ = (MRJ, KJH) +CHT = (PHJ, CSL) +HLH = (DGR, LTS) +NRD = (DDP, NSN) +JBN = (JDD, RPL) +TRT = (KBH, NCC) +HHV = (HSD, CNN) +DDL = (QCT, KLR) +CSV = (MTB, FLF) +SLH = (NMF, MRM) +THJ = (VLR, RNP) +CTG = (VJC, RCV) +MLL = (HVT, TDH) +HLV = (BPF, BPF) +XJS = (DQC, BJH) +RMD = (GHG, XVN) +BGP = (GCR, DVQ) +RCF = (FNX, XRC) +GHM = (XBL, CPV) +DLS = (HPT, MNT) +BDB = (BJB, QHM) +SVN = (BND, NJG) +NSV = (HVJ, PNP) +VQC = (GNB, CSV) +BHR = (PPG, RQR) +CCD = (KFF, KQF) +SBB = (TBJ, HLK) +VVC = (FBR, GTB) +SHQ = (VFH, TPL) +VMF = (MNJ, LSB) +MSV = (XPN, VSJ) +TDH = (JJQ, FTN) +RXC = (DQJ, VMF) +RSP = (MQQ, HNM) +SSH = (GLF, RVD) +LTS = (TFT, XLP) +HTC = (PLV, TQN) +GLF = (NSC, DCC) +BTT = (THN, BDB) +DFN = (RPC, CPJ) +NKM = (QMT, FJT) +RMP = (LLP, GHD) +PRQ = (DLC, VRJ) +TBJ = (CLM, DDL) +CPJ = (FSM, FQF) +LHD = (GSN, BCS) +GLL = (RBJ, RBJ) +TXT = (FKL, BNB) +NCS = (VHR, HCS) +GLQ = (JFN, TNL) +BMT = (RCF, RQF) +JRQ = (HCM, JNP) +FXJ = (VXT, BXF) +GMR = (LBT, TFV) +NMH = (XJS, BCN) +RQX = (JSJ, JSJ) +VXM = (JVV, SXB) +PCH = (SLH, NXX) +TXV = (XGJ, RGP) +XNB = (FKB, RFH) +JPS = (FTV, QNM) +JSJ = (TFD, TFD) +LLZ = (HCS, VHR) +HPN = (QTM, SVX) +DPG = (PQG, PDF) +NKD = (CTC, CGS) +TKZ = (BHR, BGC) +HRB = (KFM, LMM) +TLL = (NFK, BGV) +MPQ = (KDN, DSR) +BVB = (RHB, GCD) +JFN = (XKN, XGH) +QTB = (RVD, GLF) +BFQ = (NFR, XDR) +LCT = (SDS, LSJ) +SQL = (BCN, XJS) +LML = (MCS, DFR) +NMF = (SFR, NRD) +CPK = (BXH, QXK) +JHQ = (RFS, BQS) +QRH = (FNG, TMN) +MLT = (NQV, BTF) +BJH = (HQP, MLM) +XHC = (TBJ, HLK) +VQK = (FVK, HHR) +NXD = (LJB, NTS) +FSM = (NNC, XBB) +KHG = (GTC, RPG) +RTX = (BKH, VJF) +HSD = (PXH, JCX) +PND = (JTB, DPD) +CRV = (NKM, CMF) +FMH = (HPT, MNT) +BPX = (QPQ, RTR) +THN = (BJB, QHM) +XBH = (JTT, RNJ) +GVJ = (LTS, DGR) +KRL = (DFB, NSV) +XPS = (DFD, DSX) +TST = (GTM, FCD) +GKQ = (PDV, NQK) +HKC = (KDN, DSR) +DQH = (VBR, JLN) +GJF = (JFN, TNL) +QBS = (CHF, CHF) +HTL = (NXP, LGP) +MCS = (TRH, SBX) +RKR = (BRM, LSV) +VBR = (MBF, XLS) +FKD = (SBM, PVK) +FXF = (TVX, TCJ) +FBF = (KRM, PND) +QJL = (BTT, VBP) +QJX = (GCR, DVQ) +NGC = (FMH, DLS) +TPG = (BMT, NHX) +GTM = (HTC, XSK) +CTR = (KFQ, RQQ) +NQR = (HHD, BNR) +XGH = (PVS, HTL) +LKM = (VJK, PLL) +SHN = (JPM, PMF) +LMM = (DFN, GKN) +DDV = (SBB, XHC) +GQG = (QTB, SSH) +DDP = (DNF, TMT) +CSL = (HRH, LCF) +LLB = (VXT, BXF) +NPP = (VDB, CMR) +HKJ = (RHG, PNM) +QVL = (HGN, MCK) +TVV = (JBV, QKC) +MVT = (SXP, PTL) +VBT = (DNK, QGR) +XRD = (QFG, FXF) +GTB = (BFM, GQH) +JNP = (XPC, PHB) +KTC = (MDH, MCP) +QVX = (PLL, VJK) +QFN = (TRB, NVQ) +VLR = (HQS, MHH) +BDT = (SQC, KNP) +JCP = (TDH, HVT) +KKC = (GXX, LDD) +BDJ = (CPV, XBL) +GRH = (SHN, HRR) +GXB = (RBC, BTC) +MNF = (CHF, JLZ) +FGM = (RFS, BQS) +RVJ = (SXL, JQM) +FXG = (NGC, KFK) +HND = (RBC, BTC) +NXT = (XHC, SBB) +FKG = (KTC, TGT) +MQX = (QMR, TVP) +JJT = (GVB, MSR) +MHV = (SGG, NXL) +KJG = (JJB, XXF) +SBT = (DCF, RTN) +TPR = (QFN, HTG) +BNB = (XGV, MRQ) +XXT = (VBG, LHD) +PKP = (LLP, GHD) +HCS = (GLQ, GJF) +TKT = (XSF, PLN) +HRR = (PMF, JPM) +BHQ = (CGT, TQT) +FKL = (XGV, MRQ) +HRH = (FTM, CDQ) +QPB = (NXT, DDV) +XDJ = (SHQ, FTC) +PTT = (GTD, HQJ) +MDC = (KGV, GSV) +KXJ = (VBG, LHD) +FLF = (NJQ, MFB) +FTM = (VLF, SBP) +QCT = (FFV, MXB) +HTG = (TRB, NVQ) +TKH = (JCP, MLL) +XXC = (CGT, TQT) +MFN = (TTJ, KCP) +HQS = (MST, GGP) +GKN = (CPJ, RPC) +RQB = (XXV, TKT) +VKS = (TTJ, KCP) +QMR = (RLR, MQN) +XTT = (BGC, BHR) +MRJ = (JKQ, CCR) +SKC = (SMM, RVJ) +PVS = (LGP, NXP) +GXS = (BNR, HHD) +GVB = (GSG, CTH) +FQM = (LVF, VVC) +CMP = (XVX, VTG) +NVA = (VHK, QRH) +CCT = (NTS, LJB) +KJZ = (VQH, CTG) +STN = (TVC, QHQ) +HQP = (TVM, NBF) +DDC = (BXH, QXK) +QGR = (QJX, BGP) +GHD = (CJH, LVH) +MTB = (MFB, NJQ) +SSQ = (DRH, XDN) +QND = (FLR, BBK) +LGP = (CNJ, PCH) +RPG = (JSM, PTT) +XXF = (CDH, TXV) +XDM = (SRV, GMR) +VLG = (JPG, VJM) +NJG = (BDJ, GHM) +VCF = (GTC, RPG) +DSR = (QBJ, JPS) +DNF = (SLD, RSP) +MSR = (GSG, CTH) +BBG = (VLR, RNP) +XXV = (PLN, XSF) +MLJ = (VRJ, DLC) +MFB = (LHV, TQC) +QPQ = (KFB, VHB) +DCM = (CDV, BCH) +NRM = (SJL, VDX) +JNC = (CTC, CGS) +XQT = (TXT, NJF) +FLR = (NMH, SQL) +BQS = (DDK, LML) +BTC = (FVH, CXN) +QHM = (KRL, JNR) +RFT = (HLV, NMQ) +KLR = (FFV, MXB) +SHC = (MQM, JFF) +LNK = (VMG, SCG) +QCG = (VXM, XSH) +VMG = (DNX, BDL) + +