aoc: solve day 8
Signed-off-by: Ivan Reshetnikov <admin@comfycamp.space>
This commit is contained in:
parent
27892ff860
commit
10872cf5db
10 changed files with 1103 additions and 0 deletions
4
advent-of-code-2023/elixir/day_08/.formatter.exs
Normal file
4
advent-of-code-2023/elixir/day_08/.formatter.exs
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
# Used by "mix format"
|
||||||
|
[
|
||||||
|
inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"]
|
||||||
|
]
|
26
advent-of-code-2023/elixir/day_08/.gitignore
vendored
Normal file
26
advent-of-code-2023/elixir/day_08/.gitignore
vendored
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
# The directory Mix will write compiled artifacts to.
|
||||||
|
/_build/
|
||||||
|
|
||||||
|
# If you run "mix test --cover", coverage assets end up here.
|
||||||
|
/cover/
|
||||||
|
|
||||||
|
# The directory Mix downloads your dependencies sources to.
|
||||||
|
/deps/
|
||||||
|
|
||||||
|
# Where third-party dependencies like ExDoc output generated docs.
|
||||||
|
/doc/
|
||||||
|
|
||||||
|
# Ignore .fetch files in case you like to edit your project deps locally.
|
||||||
|
/.fetch
|
||||||
|
|
||||||
|
# If the VM crashes, it generates a dump, let's ignore it too.
|
||||||
|
erl_crash.dump
|
||||||
|
|
||||||
|
# Also ignore archive artifacts (built via "mix archive.build").
|
||||||
|
*.ez
|
||||||
|
|
||||||
|
# Ignore package tarball (built via "mix hex.build").
|
||||||
|
day_08-*.tar
|
||||||
|
|
||||||
|
# Temporary files, for example, from tests.
|
||||||
|
/tmp/
|
94
advent-of-code-2023/elixir/day_08/README.md
Normal file
94
advent-of-code-2023/elixir/day_08/README.md
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
# Day 8
|
||||||
|
|
||||||
|
You're still riding a camel across Desert Island when you spot a sandstorm quickly approaching.
|
||||||
|
When you turn to warn the Elf, she disappears before your eyes! To be fair, she had just finished warning you about ghosts a few minutes ago.
|
||||||
|
|
||||||
|
One of the camel's pouches is labeled "maps" - sure enough, it's full of documents (your puzzle input) about how to navigate the desert.
|
||||||
|
At least, you're pretty sure that's what they are; one of the documents contains a list of left/right instructions,
|
||||||
|
and the rest of the documents seem to describe some kind of network of labeled nodes.
|
||||||
|
|
||||||
|
It seems like you're meant to use the left/right instructions to navigate the network.
|
||||||
|
Perhaps if you have the camel follow the same instructions, you can escape the haunted wasteland!
|
||||||
|
|
||||||
|
After examining the maps for a bit, two nodes stick out: AAA and ZZZ.
|
||||||
|
You feel like AAA is where you are now, and you have to follow the left/right instructions until you reach ZZZ.
|
||||||
|
|
||||||
|
This format defines each node of the network individually. For example:
|
||||||
|
|
||||||
|
```
|
||||||
|
RL
|
||||||
|
|
||||||
|
AAA = (BBB, CCC)
|
||||||
|
BBB = (DDD, EEE)
|
||||||
|
CCC = (ZZZ, GGG)
|
||||||
|
DDD = (DDD, DDD)
|
||||||
|
EEE = (EEE, EEE)
|
||||||
|
GGG = (GGG, GGG)
|
||||||
|
ZZZ = (ZZZ, ZZZ)
|
||||||
|
```
|
||||||
|
|
||||||
|
Starting with AAA, you need to look up the next element based on the next left/right instruction in your input.
|
||||||
|
In this example, start with AAA and go right (R) by choosing the right element of AAA, CCC.
|
||||||
|
Then, L means to choose the left element of CCC, ZZZ. By following the left/right instructions, you reach ZZZ in 2 steps.
|
||||||
|
|
||||||
|
Of course, you might not find ZZZ right away. If you run out of left/right instructions,
|
||||||
|
repeat the whole sequence of instructions as necessary: RL really means RLRLRLRLRLRLRLRL... and so on.
|
||||||
|
For example, here is a situation that takes 6 steps to reach ZZZ:
|
||||||
|
|
||||||
|
```
|
||||||
|
LLR
|
||||||
|
|
||||||
|
AAA = (BBB, BBB)
|
||||||
|
BBB = (AAA, ZZZ)
|
||||||
|
ZZZ = (ZZZ, ZZZ)
|
||||||
|
```
|
||||||
|
|
||||||
|
Starting at AAA, follow the left/right instructions. How many steps are required to reach ZZZ?
|
||||||
|
|
||||||
|
## Part Two
|
||||||
|
|
||||||
|
The sandstorm is upon you and you aren't any closer to escaping the wasteland.
|
||||||
|
You had the camel follow the instructions, but you've barely left your starting position.
|
||||||
|
It's going to take significantly more steps to escape!
|
||||||
|
|
||||||
|
What if the map isn't for people - what if the map is for ghosts? Are ghosts even bound by the laws of spacetime? Only one way to find out.
|
||||||
|
|
||||||
|
After examining the maps a bit longer, your attention is drawn to a curious fact:
|
||||||
|
the number of nodes with names ending in A is equal to the number ending in Z!
|
||||||
|
If you were a ghost, you'd probably just start at every node that ends with A
|
||||||
|
and follow all of the paths at the same time until they all simultaneously end up at nodes that end with Z.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
```
|
||||||
|
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)
|
||||||
|
```
|
||||||
|
|
||||||
|
Here, there are two starting nodes, 11A and 22A (because they both end with A).
|
||||||
|
As you follow each left/right instruction, use that instruction to simultaneously navigate away from both nodes you're currently on.
|
||||||
|
Repeat this process until all of the nodes you're currently on end with Z.
|
||||||
|
(If only some of the nodes you're on end with Z, they act like any other node and you continue as normal.)
|
||||||
|
In this example, you would proceed as follows:
|
||||||
|
|
||||||
|
```
|
||||||
|
Step 0: You are at 11A and 22A.
|
||||||
|
Step 1: You choose all of the left paths, leading you to 11B and 22B.
|
||||||
|
Step 2: You choose all of the right paths, leading you to 11Z and 22C.
|
||||||
|
Step 3: You choose all of the left paths, leading you to 11B and 22Z.
|
||||||
|
Step 4: You choose all of the right paths, leading you to 11Z and 22B.
|
||||||
|
Step 5: You choose all of the left paths, leading you to 11B and 22C.
|
||||||
|
Step 6: You choose all of the right paths, leading you to 11Z and 22Z.
|
||||||
|
```
|
||||||
|
|
||||||
|
So, in this example, you end up entirely on nodes that end in Z after 6 steps.
|
||||||
|
|
||||||
|
Simultaneously start on every node that ends with A. How many steps does it take before you're only on nodes that end with Z?
|
788
advent-of-code-2023/elixir/day_08/input.txt
Normal file
788
advent-of-code-2023/elixir/day_08/input.txt
Normal file
|
@ -0,0 +1,788 @@
|
||||||
|
LLRRRLLRRRLRRRLRLRLLRRLRRRLLLRLRRRLRRRLRLLRRLRRRLLRRLRRLRLRRRLRRLLRLRRLRRRLRRLLRRRLRLLLRLRRRLRRLLLLRRRLRRRLRRRLRLRRLRRLRLRRLLRLLRRRLRRLRLLRRLRRLLRLLRLRRRLRLRLRRRLRRLLLRLRRRLLRLLRRRLRLRLRRRLLRLLLLRRRLRRRLRLRRRLRRLRRLLRLRLRRRLRRRLRLRRLLLLRLRRRLRRRLRLRRRLRLRRLRLRRRR
|
||||||
|
|
||||||
|
BQV = (HFG, GDR)
|
||||||
|
VQT = (JLQ, TNJ)
|
||||||
|
SGR = (TLQ, FGP)
|
||||||
|
BXN = (TTQ, HJH)
|
||||||
|
FXV = (RDS, NGH)
|
||||||
|
MXR = (BXN, PXF)
|
||||||
|
MJN = (RSQ, LBL)
|
||||||
|
PTG = (GSC, SFM)
|
||||||
|
TPD = (CXX, TCD)
|
||||||
|
FXD = (NDP, PVL)
|
||||||
|
GSB = (SVM, RHH)
|
||||||
|
LPX = (GSS, RHC)
|
||||||
|
JCS = (RKT, XHN)
|
||||||
|
TTQ = (MDT, BNX)
|
||||||
|
NXP = (QSK, JXB)
|
||||||
|
PRK = (TCT, JGS)
|
||||||
|
BDL = (PXH, RJH)
|
||||||
|
RGS = (MRL, VTT)
|
||||||
|
VFR = (VHS, QDB)
|
||||||
|
KFL = (PGM, KNL)
|
||||||
|
KJP = (QCQ, TKC)
|
||||||
|
NDN = (CLT, FKK)
|
||||||
|
FPG = (JJT, JJT)
|
||||||
|
XNH = (LSH, SQQ)
|
||||||
|
PBM = (GCD, VTD)
|
||||||
|
XGD = (FDN, XHT)
|
||||||
|
HQR = (KDD, RTX)
|
||||||
|
KQH = (BMQ, GLQ)
|
||||||
|
HLH = (GHM, FQL)
|
||||||
|
LGP = (RNT, DHG)
|
||||||
|
BCV = (VFL, XNC)
|
||||||
|
GSS = (DJT, PND)
|
||||||
|
VRM = (CPT, RGH)
|
||||||
|
LJX = (RXR, LNC)
|
||||||
|
FSB = (XJG, TFG)
|
||||||
|
XSJ = (DXJ, HBD)
|
||||||
|
FHB = (MBN, TPD)
|
||||||
|
NVR = (MLR, LMQ)
|
||||||
|
PCM = (CMS, XCH)
|
||||||
|
TDJ = (BBT, BMS)
|
||||||
|
GCD = (KHC, BDL)
|
||||||
|
NLM = (XSM, LML)
|
||||||
|
CKP = (NKS, PXJ)
|
||||||
|
CXD = (XGK, JLR)
|
||||||
|
FMS = (DNC, VJN)
|
||||||
|
XCV = (LML, XSM)
|
||||||
|
MBN = (TCD, CXX)
|
||||||
|
SDQ = (GRQ, CBJ)
|
||||||
|
KKF = (PRG, NCQ)
|
||||||
|
GJL = (RSQ, LBL)
|
||||||
|
MPV = (VTD, GCD)
|
||||||
|
NBQ = (MCG, RBN)
|
||||||
|
QQS = (RRQ, HJB)
|
||||||
|
QGS = (MXB, BFG)
|
||||||
|
NGB = (HRV, FCN)
|
||||||
|
VNP = (LDF, DJB)
|
||||||
|
XXQ = (QPJ, STL)
|
||||||
|
BLJ = (KCL, TXD)
|
||||||
|
QFV = (RFF, FFL)
|
||||||
|
FKS = (QQV, BTH)
|
||||||
|
DKX = (VXQ, RDX)
|
||||||
|
LVF = (LBH, QFT)
|
||||||
|
QQT = (CVJ, KNQ)
|
||||||
|
TRJ = (GRC, BHN)
|
||||||
|
MTC = (TKV, VTM)
|
||||||
|
SCV = (MHT, MHT)
|
||||||
|
FNT = (HRF, RDR)
|
||||||
|
FQS = (QVQ, LDX)
|
||||||
|
CMS = (GSK, LNQ)
|
||||||
|
HKH = (MHD, NRV)
|
||||||
|
MPQ = (FMS, LHR)
|
||||||
|
MFS = (KXL, KXL)
|
||||||
|
XXN = (SJQ, DBF)
|
||||||
|
RQG = (NQV, QFV)
|
||||||
|
SML = (HLD, MGG)
|
||||||
|
KVM = (SGJ, RBB)
|
||||||
|
XNC = (PMG, FXD)
|
||||||
|
TQB = (XND, NGX)
|
||||||
|
QRG = (GXR, XCB)
|
||||||
|
BNV = (PJJ, NLH)
|
||||||
|
KMK = (KJP, VSM)
|
||||||
|
CML = (PJK, HQB)
|
||||||
|
RBM = (HFK, JBH)
|
||||||
|
ZZZ = (NTL, GVD)
|
||||||
|
PGM = (HQK, LPG)
|
||||||
|
TSH = (NVK, JXD)
|
||||||
|
FXZ = (NGX, XND)
|
||||||
|
VNT = (JPB, VHM)
|
||||||
|
BFF = (HDD, CXP)
|
||||||
|
QRR = (FJP, NXN)
|
||||||
|
XLC = (KPR, FSB)
|
||||||
|
RNM = (PBM, MPV)
|
||||||
|
CMG = (VCK, GXX)
|
||||||
|
MPC = (FVT, JMM)
|
||||||
|
NMC = (TPC, TRF)
|
||||||
|
BBS = (PDP, PHC)
|
||||||
|
FCN = (QNF, MDM)
|
||||||
|
HPG = (MTC, MJB)
|
||||||
|
TCH = (BXH, FHH)
|
||||||
|
PPK = (DSQ, DSQ)
|
||||||
|
PMS = (FFV, TTG)
|
||||||
|
BML = (FXS, RKP)
|
||||||
|
QNF = (KTP, LTV)
|
||||||
|
PBQ = (TLQ, FGP)
|
||||||
|
BKP = (BMQ, GLQ)
|
||||||
|
LBL = (RDG, HLB)
|
||||||
|
BKL = (LJX, VCM)
|
||||||
|
LLS = (FXQ, CHG)
|
||||||
|
HFD = (CMS, XCH)
|
||||||
|
SJQ = (QBG, CGS)
|
||||||
|
TKC = (JXV, HRJ)
|
||||||
|
DKL = (HHP, SCK)
|
||||||
|
DPS = (RNP, RQG)
|
||||||
|
GMG = (PFN, LLV)
|
||||||
|
DNS = (SCV, TDD)
|
||||||
|
RDG = (XSP, QQT)
|
||||||
|
MHT = (TQB, TQB)
|
||||||
|
RKX = (DKX, DKX)
|
||||||
|
MJC = (KGT, CRJ)
|
||||||
|
LTV = (GKT, LVJ)
|
||||||
|
PLM = (MPS, NLC)
|
||||||
|
PHC = (FXV, VMD)
|
||||||
|
QLN = (QPJ, STL)
|
||||||
|
FTX = (PFM, SDQ)
|
||||||
|
XSP = (CVJ, KNQ)
|
||||||
|
XND = (BBS, TTF)
|
||||||
|
LSQ = (LCM, NJF)
|
||||||
|
HDV = (BBX, RKH)
|
||||||
|
DJG = (JBH, HFK)
|
||||||
|
XPM = (NNM, KNX)
|
||||||
|
FGP = (LVN, JMB)
|
||||||
|
QBG = (XBC, SGD)
|
||||||
|
HQK = (NVR, NKQ)
|
||||||
|
GMN = (SBP, KHJ)
|
||||||
|
NDR = (VHQ, MGN)
|
||||||
|
RQQ = (QVQ, LDX)
|
||||||
|
XFD = (BKX, QRG)
|
||||||
|
FCH = (SMF, BHJ)
|
||||||
|
JMM = (LVT, BCV)
|
||||||
|
SBR = (LBD, RGS)
|
||||||
|
NLH = (FPG, QVF)
|
||||||
|
TPC = (HFD, PCM)
|
||||||
|
GGP = (TPD, MBN)
|
||||||
|
LDF = (PMX, NMP)
|
||||||
|
TQP = (MQH, PJD)
|
||||||
|
SMD = (FCH, CCF)
|
||||||
|
HJB = (RFL, RMH)
|
||||||
|
JCJ = (BNV, RCM)
|
||||||
|
DJD = (LVS, HQD)
|
||||||
|
XHT = (CRH, NTS)
|
||||||
|
KXL = (XPT, XPT)
|
||||||
|
MCK = (PRG, NCQ)
|
||||||
|
TVQ = (XHN, RKT)
|
||||||
|
PGN = (GDR, HFG)
|
||||||
|
KTD = (VML, HLN)
|
||||||
|
RKH = (XNH, TJK)
|
||||||
|
VPC = (FDS, DPS)
|
||||||
|
HBD = (CCR, XGP)
|
||||||
|
FQL = (BCN, KBS)
|
||||||
|
QJN = (MJN, GJL)
|
||||||
|
KSV = (NBQ, GTR)
|
||||||
|
CBT = (PCN, DTB)
|
||||||
|
KJR = (TDH, HBJ)
|
||||||
|
PND = (JGM, PFL)
|
||||||
|
MFM = (XMD, QRP)
|
||||||
|
VBB = (HVH, SFP)
|
||||||
|
JKM = (SQP, LSQ)
|
||||||
|
SCP = (JPC, SML)
|
||||||
|
DFQ = (GRC, BHN)
|
||||||
|
RSQ = (HLB, RDG)
|
||||||
|
NCB = (CPS, KCG)
|
||||||
|
LVJ = (FLG, KXQ)
|
||||||
|
FQB = (RKX, RKX)
|
||||||
|
XPT = (GVD, NTL)
|
||||||
|
XGP = (LNK, XKG)
|
||||||
|
CBG = (LDF, DJB)
|
||||||
|
XFH = (LLV, PFN)
|
||||||
|
GGJ = (PXF, BXN)
|
||||||
|
LTJ = (CPS, KCG)
|
||||||
|
CPS = (DMN, QGD)
|
||||||
|
LRR = (DRN, NCJ)
|
||||||
|
XFS = (BKL, LXM)
|
||||||
|
NDP = (PQF, SVL)
|
||||||
|
BCN = (XGS, BJF)
|
||||||
|
GVK = (FXQ, CHG)
|
||||||
|
JKB = (LPX, MPH)
|
||||||
|
JBD = (MKH, XGD)
|
||||||
|
CNM = (KMG, CKD)
|
||||||
|
NSS = (MQL, RHX)
|
||||||
|
VCM = (LNC, RXR)
|
||||||
|
TTL = (FLD, DBS)
|
||||||
|
BJS = (TVC, FLF)
|
||||||
|
DNR = (KCP, BJS)
|
||||||
|
XSH = (JDF, QKN)
|
||||||
|
HHZ = (GVK, LLS)
|
||||||
|
RRC = (TSK, DNK)
|
||||||
|
SQP = (NJF, LCM)
|
||||||
|
QXR = (JHC, MXQ)
|
||||||
|
BKH = (VHS, QDB)
|
||||||
|
KJV = (KTT, LVD)
|
||||||
|
DHK = (FPV, NLS)
|
||||||
|
NMP = (NGB, PBF)
|
||||||
|
GJH = (VCN, CPP)
|
||||||
|
FBB = (MJC, VMF)
|
||||||
|
CMK = (LGP, GKD)
|
||||||
|
VTM = (XST, SRS)
|
||||||
|
DHG = (LRR, SNF)
|
||||||
|
DBS = (RVX, DCQ)
|
||||||
|
GSL = (NBX, JNN)
|
||||||
|
XSM = (BHS, HRT)
|
||||||
|
JBH = (NSS, FTN)
|
||||||
|
DXJ = (XGP, CCR)
|
||||||
|
JGS = (JKS, HHZ)
|
||||||
|
NTS = (GMG, XFH)
|
||||||
|
FHH = (BPG, KRM)
|
||||||
|
LBS = (KNL, PGM)
|
||||||
|
MQH = (FQB, FQB)
|
||||||
|
QVF = (JJT, PRK)
|
||||||
|
KSM = (PMS, LLF)
|
||||||
|
XQM = (JLC, KTD)
|
||||||
|
SXQ = (JXD, NVK)
|
||||||
|
GHC = (MGN, VHQ)
|
||||||
|
PJK = (CXG, DNR)
|
||||||
|
HHP = (NXC, KVM)
|
||||||
|
NHK = (XSJ, NHB)
|
||||||
|
SLP = (TNJ, JLQ)
|
||||||
|
HNK = (XSN, NHK)
|
||||||
|
KQX = (DHK, SQV)
|
||||||
|
XRX = (BGR, PVS)
|
||||||
|
MGH = (RLQ, TBJ)
|
||||||
|
FSV = (LKK, DNS)
|
||||||
|
NJP = (BGR, PVS)
|
||||||
|
PFM = (GRQ, CBJ)
|
||||||
|
LCF = (HBJ, TDH)
|
||||||
|
CPC = (JLC, KTD)
|
||||||
|
CXK = (JGP, JGP)
|
||||||
|
LJJ = (SQP, LSQ)
|
||||||
|
LNC = (BML, TNN)
|
||||||
|
VCN = (TBT, PLK)
|
||||||
|
NPF = (FBH, JPD)
|
||||||
|
LHR = (VJN, DNC)
|
||||||
|
BXJ = (VKV, BLJ)
|
||||||
|
KMB = (FSB, KPR)
|
||||||
|
CJQ = (QRG, BKX)
|
||||||
|
XVK = (PBX, DKQ)
|
||||||
|
GTL = (VKF, VJD)
|
||||||
|
BXH = (BPG, KRM)
|
||||||
|
NGX = (BBS, TTF)
|
||||||
|
JXT = (RHH, SVM)
|
||||||
|
DMN = (MFS, MFS)
|
||||||
|
BKX = (GXR, XCB)
|
||||||
|
KTP = (GKT, LVJ)
|
||||||
|
LXS = (JHC, MXQ)
|
||||||
|
LCM = (KKF, MCK)
|
||||||
|
VVL = (FGD, FNT)
|
||||||
|
CRC = (DKV, JKG)
|
||||||
|
HRJ = (KJF, QTD)
|
||||||
|
TSF = (HMJ, CMG)
|
||||||
|
HLN = (PCB, HHC)
|
||||||
|
VSM = (QCQ, TKC)
|
||||||
|
TKV = (XST, SRS)
|
||||||
|
PCL = (VCF, VLX)
|
||||||
|
QQV = (TRP, QBL)
|
||||||
|
FLF = (FJB, RGC)
|
||||||
|
MCL = (SCK, HHP)
|
||||||
|
GRQ = (VGV, GTL)
|
||||||
|
TCT = (JKS, JKS)
|
||||||
|
DMQ = (NMC, PDV)
|
||||||
|
LMQ = (SXX, FKS)
|
||||||
|
XPK = (FKK, CLT)
|
||||||
|
CDK = (FRX, BRM)
|
||||||
|
JLR = (KGR, TCC)
|
||||||
|
TDH = (KFL, LBS)
|
||||||
|
XXP = (CML, CLM)
|
||||||
|
KCG = (DMN, QGD)
|
||||||
|
LTL = (RQH, PTX)
|
||||||
|
QVR = (VPC, KXT)
|
||||||
|
DRN = (LCC, NLQ)
|
||||||
|
NQV = (RFF, FFL)
|
||||||
|
PLS = (LQJ, QVR)
|
||||||
|
DBF = (QBG, CGS)
|
||||||
|
KTT = (HNK, LRN)
|
||||||
|
MRL = (HFH, HFT)
|
||||||
|
BJG = (PTG, XJX)
|
||||||
|
FTQ = (PCD, RMP)
|
||||||
|
XQP = (TSC, QQS)
|
||||||
|
QCQ = (HRJ, JXV)
|
||||||
|
NJX = (XFL, XFX)
|
||||||
|
BNJ = (MGB, TGT)
|
||||||
|
CKD = (NTT, TBD)
|
||||||
|
NKS = (SDB, KQX)
|
||||||
|
NRQ = (PLR, NJX)
|
||||||
|
MBX = (MXR, GGJ)
|
||||||
|
LVS = (GHC, NDR)
|
||||||
|
KJF = (DKL, MCL)
|
||||||
|
NRV = (DFQ, TRJ)
|
||||||
|
DPA = (NBQ, GTR)
|
||||||
|
XCH = (LNQ, GSK)
|
||||||
|
RHC = (DJT, PND)
|
||||||
|
SVM = (XLC, KMB)
|
||||||
|
GRF = (VTF, HDR)
|
||||||
|
LLF = (TTG, FFV)
|
||||||
|
PHV = (FSG, VRJ)
|
||||||
|
SGD = (NND, CMK)
|
||||||
|
SSP = (GJL, MJN)
|
||||||
|
PVL = (PQF, SVL)
|
||||||
|
FVT = (BCV, LVT)
|
||||||
|
BNX = (SSM, HQR)
|
||||||
|
XSV = (JCS, TVQ)
|
||||||
|
MCJ = (RGM, GPV)
|
||||||
|
XXL = (SCP, XKM)
|
||||||
|
XST = (JKB, JFB)
|
||||||
|
GSK = (VRM, TCR)
|
||||||
|
NKQ = (MLR, LMQ)
|
||||||
|
VXQ = (SXQ, TSH)
|
||||||
|
GPV = (MVT, VKR)
|
||||||
|
RNL = (CQF, KQL)
|
||||||
|
VBR = (BFG, MXB)
|
||||||
|
MRR = (BKH, VFR)
|
||||||
|
GDR = (MMB, HKH)
|
||||||
|
MGS = (KMK, NGJ)
|
||||||
|
MLQ = (KNX, NNM)
|
||||||
|
NGH = (SQR, MGF)
|
||||||
|
QRP = (NBR, TCS)
|
||||||
|
MKH = (FDN, XHT)
|
||||||
|
JLQ = (DTL, PHD)
|
||||||
|
JBM = (MJB, MTC)
|
||||||
|
DNC = (HJF, GJH)
|
||||||
|
QRV = (CCF, FCH)
|
||||||
|
TJQ = (XRF, FRB)
|
||||||
|
VKR = (FTX, BCG)
|
||||||
|
SRS = (JFB, JKB)
|
||||||
|
TSK = (CJQ, XFD)
|
||||||
|
TGT = (BQX, CNM)
|
||||||
|
MDN = (XGD, MKH)
|
||||||
|
TVC = (FJB, RGC)
|
||||||
|
KCP = (FLF, TVC)
|
||||||
|
PMG = (PVL, NDP)
|
||||||
|
JHC = (LCF, KJR)
|
||||||
|
FMP = (KTL, JCN)
|
||||||
|
RBB = (DJD, JLG)
|
||||||
|
KQV = (QKN, JDF)
|
||||||
|
PFH = (GLP, STP)
|
||||||
|
CXP = (VNP, CBG)
|
||||||
|
MVG = (TSK, DNK)
|
||||||
|
PCN = (QJN, SSP)
|
||||||
|
HDR = (CGR, XLF)
|
||||||
|
KQL = (BDV, QPF)
|
||||||
|
BHJ = (TDJ, XVJ)
|
||||||
|
PJD = (FQB, GBN)
|
||||||
|
TRF = (HFD, PCM)
|
||||||
|
GKT = (FLG, KXQ)
|
||||||
|
KRF = (NPF, RVD)
|
||||||
|
RMP = (VVL, GXF)
|
||||||
|
NBR = (MDN, JBD)
|
||||||
|
QBL = (DMQ, QDD)
|
||||||
|
VGV = (VKF, VJD)
|
||||||
|
XHN = (PBQ, SGR)
|
||||||
|
CXG = (BJS, KCP)
|
||||||
|
VTD = (KHC, BDL)
|
||||||
|
HFK = (FTN, NSS)
|
||||||
|
MHD = (DFQ, TRJ)
|
||||||
|
RNP = (NQV, QFV)
|
||||||
|
QLA = (VXQ, RDX)
|
||||||
|
LVD = (LRN, HNK)
|
||||||
|
GLQ = (RQK, KJV)
|
||||||
|
FPP = (MNG, RNM)
|
||||||
|
LXM = (LJX, VCM)
|
||||||
|
SSJ = (MKR, SGH)
|
||||||
|
JMB = (KPN, CTM)
|
||||||
|
JPB = (PNM, DNF)
|
||||||
|
XFL = (GKB, XXN)
|
||||||
|
HBJ = (LBS, KFL)
|
||||||
|
SRM = (KBJ, HLH)
|
||||||
|
CRH = (GMG, XFH)
|
||||||
|
VFL = (FXD, PMG)
|
||||||
|
KCL = (QRR, PNN)
|
||||||
|
DNK = (CJQ, XFD)
|
||||||
|
RQV = (NLC, MPS)
|
||||||
|
TCD = (GMN, RDH)
|
||||||
|
BMS = (DTV, VJC)
|
||||||
|
BMQ = (KJV, RQK)
|
||||||
|
PNM = (MSJ, SBK)
|
||||||
|
XSN = (XSJ, NHB)
|
||||||
|
JJN = (NBV, DJM)
|
||||||
|
TBJ = (GLD, HDV)
|
||||||
|
MSJ = (SBV, PJF)
|
||||||
|
MFD = (LXM, BKL)
|
||||||
|
BCG = (PFM, SDQ)
|
||||||
|
BGR = (FXF, KVB)
|
||||||
|
KVK = (QSK, JXB)
|
||||||
|
LBH = (MPC, PFB)
|
||||||
|
QFT = (MPC, PFB)
|
||||||
|
BPG = (BJG, MGX)
|
||||||
|
XKM = (SML, JPC)
|
||||||
|
HMS = (BKR, TJQ)
|
||||||
|
MQL = (RQV, PLM)
|
||||||
|
SGH = (XXV, RJV)
|
||||||
|
GRC = (PLS, NFT)
|
||||||
|
NCQ = (FTQ, KCC)
|
||||||
|
MKF = (XRX, NJP)
|
||||||
|
KGR = (DJG, RBM)
|
||||||
|
HJF = (VCN, CPP)
|
||||||
|
CGR = (TSF, HDB)
|
||||||
|
JFF = (MQH, PJD)
|
||||||
|
PXJ = (KQX, SDB)
|
||||||
|
DKQ = (MVG, RRC)
|
||||||
|
RDH = (KHJ, SBP)
|
||||||
|
PVS = (KVB, FXF)
|
||||||
|
HTM = (NTJ, MPQ)
|
||||||
|
TKF = (PPK, PPK)
|
||||||
|
KPB = (PMS, LLF)
|
||||||
|
FKK = (PDS, CDK)
|
||||||
|
BKR = (XRF, FRB)
|
||||||
|
PNN = (NXN, FJP)
|
||||||
|
VQK = (JNN, NBX)
|
||||||
|
KMG = (TBD, NTT)
|
||||||
|
XMZ = (RDX, VXQ)
|
||||||
|
BBT = (DTV, VJC)
|
||||||
|
GXX = (BKP, KQH)
|
||||||
|
FGS = (MXR, GGJ)
|
||||||
|
FFV = (SRM, FDJ)
|
||||||
|
MQK = (XQP, JHF)
|
||||||
|
NHB = (HBD, DXJ)
|
||||||
|
SNF = (NCJ, DRN)
|
||||||
|
RTH = (JGP, FRG)
|
||||||
|
LRN = (XSN, NHK)
|
||||||
|
JCN = (DQV, LTL)
|
||||||
|
RBT = (HDR, VTF)
|
||||||
|
LDC = (TJQ, BKR)
|
||||||
|
FJP = (BFF, FML)
|
||||||
|
GKD = (RNT, DHG)
|
||||||
|
CSD = (NPF, RVD)
|
||||||
|
GTR = (RBN, MCG)
|
||||||
|
FSG = (XSV, GTH)
|
||||||
|
HLB = (XSP, QQT)
|
||||||
|
BHN = (PLS, NFT)
|
||||||
|
NGJ = (KJP, VSM)
|
||||||
|
PJX = (PPK, SKN)
|
||||||
|
KPR = (TFG, XJG)
|
||||||
|
SFP = (HNG, PHV)
|
||||||
|
CGS = (SGD, XBC)
|
||||||
|
FLG = (KQV, XSH)
|
||||||
|
FDN = (NTS, CRH)
|
||||||
|
CLT = (PDS, CDK)
|
||||||
|
KRM = (MGX, BJG)
|
||||||
|
DTL = (HDM, RNL)
|
||||||
|
QDB = (MBK, PCL)
|
||||||
|
QDD = (PDV, NMC)
|
||||||
|
FXQ = (GFT, HTM)
|
||||||
|
TBD = (NTF, FBB)
|
||||||
|
RDX = (TSH, SXQ)
|
||||||
|
MGX = (PTG, XJX)
|
||||||
|
CCF = (BHJ, SMF)
|
||||||
|
MVT = (BCG, FTX)
|
||||||
|
LVC = (KPB, KSM)
|
||||||
|
NFT = (LQJ, QVR)
|
||||||
|
MDC = (JFF, TQP)
|
||||||
|
SCK = (NXC, KVM)
|
||||||
|
FML = (CXP, HDD)
|
||||||
|
QCM = (TPJ, MDC)
|
||||||
|
VJA = (SCP, XKM)
|
||||||
|
PXH = (QGS, VBR)
|
||||||
|
KNL = (LPG, HQK)
|
||||||
|
MMB = (NRV, MHD)
|
||||||
|
HFG = (HKH, MMB)
|
||||||
|
LML = (BHS, HRT)
|
||||||
|
DPR = (TPJ, MDC)
|
||||||
|
GKB = (SJQ, DBF)
|
||||||
|
BTC = (SFP, HVH)
|
||||||
|
DJT = (PFL, JGM)
|
||||||
|
VCK = (KQH, BKP)
|
||||||
|
KVB = (NHT, HTX)
|
||||||
|
LRJ = (DBS, FLD)
|
||||||
|
CCR = (XKG, LNK)
|
||||||
|
MGB = (CNM, BQX)
|
||||||
|
SDB = (DHK, SQV)
|
||||||
|
KMP = (VNT, HBM)
|
||||||
|
JGP = (XXL, XXL)
|
||||||
|
CLM = (HQB, PJK)
|
||||||
|
JKS = (LLS, GVK)
|
||||||
|
TBT = (GGP, FHB)
|
||||||
|
NTT = (NTF, FBB)
|
||||||
|
HRT = (MCJ, LBF)
|
||||||
|
BMX = (SGH, MKR)
|
||||||
|
HJH = (MDT, BNX)
|
||||||
|
DJB = (PMX, NMP)
|
||||||
|
CRJ = (MFM, HQQ)
|
||||||
|
XXV = (SLP, VQT)
|
||||||
|
MXB = (LVF, KKP)
|
||||||
|
LXN = (VNT, HBM)
|
||||||
|
RMH = (NJG, BKD)
|
||||||
|
MLR = (SXX, FKS)
|
||||||
|
SQV = (NLS, FPV)
|
||||||
|
XKG = (MFD, XFS)
|
||||||
|
LVN = (CTM, KPN)
|
||||||
|
NTR = (QCM, DPR)
|
||||||
|
NTF = (VMF, MJC)
|
||||||
|
MGN = (FMP, DLQ)
|
||||||
|
PLR = (XFL, XFX)
|
||||||
|
SSM = (RTX, KDD)
|
||||||
|
GBB = (RLQ, TBJ)
|
||||||
|
VTF = (XLF, CGR)
|
||||||
|
SHQ = (JLR, XGK)
|
||||||
|
CXX = (GMN, RDH)
|
||||||
|
FLD = (DCQ, RVX)
|
||||||
|
QPF = (CXD, SHQ)
|
||||||
|
RDR = (TCH, QKP)
|
||||||
|
GSC = (MGS, DRQ)
|
||||||
|
GTA = (XND, NGX)
|
||||||
|
VHQ = (FMP, DLQ)
|
||||||
|
MRF = (VKV, BLJ)
|
||||||
|
XCB = (SMD, QRV)
|
||||||
|
NBV = (MKF, GGB)
|
||||||
|
SBK = (PJF, SBV)
|
||||||
|
XRF = (CBT, SMB)
|
||||||
|
TPJ = (JFF, TQP)
|
||||||
|
KDD = (BGD, MQK)
|
||||||
|
DKV = (KFM, NTR)
|
||||||
|
FBH = (MBX, FGS)
|
||||||
|
RGH = (PGN, BQV)
|
||||||
|
FXS = (RJC, JJN)
|
||||||
|
SVL = (LKD, XXP)
|
||||||
|
JXS = (NKS, PXJ)
|
||||||
|
SMX = (LKK, DNS)
|
||||||
|
QTD = (DKL, MCL)
|
||||||
|
CPT = (PGN, BQV)
|
||||||
|
BDV = (CXD, SHQ)
|
||||||
|
BFG = (KKP, LVF)
|
||||||
|
PSM = (DKJ, XVK)
|
||||||
|
CBJ = (GTL, VGV)
|
||||||
|
XJG = (LXN, KMP)
|
||||||
|
MPH = (GSS, RHC)
|
||||||
|
KFM = (DPR, QCM)
|
||||||
|
SQR = (XPK, NDN)
|
||||||
|
VJC = (VFB, JCJ)
|
||||||
|
DQV = (PTX, RQH)
|
||||||
|
FJB = (VVJ, PSM)
|
||||||
|
RQK = (KTT, LVD)
|
||||||
|
PDV = (TRF, TPC)
|
||||||
|
KNQ = (TKF, PJX)
|
||||||
|
HHC = (XPM, MLQ)
|
||||||
|
RHX = (PLM, RQV)
|
||||||
|
GXR = (SMD, QRV)
|
||||||
|
HMJ = (VCK, GXX)
|
||||||
|
JJT = (TCT, TCT)
|
||||||
|
XLF = (HDB, TSF)
|
||||||
|
RFF = (XXQ, QLN)
|
||||||
|
GFT = (NTJ, MPQ)
|
||||||
|
LQK = (KSM, KPB)
|
||||||
|
TXD = (PNN, QRR)
|
||||||
|
KBS = (XGS, BJF)
|
||||||
|
NLS = (GRF, RBT)
|
||||||
|
RFL = (BKD, NJG)
|
||||||
|
MPS = (LRJ, TTL)
|
||||||
|
DCQ = (PFH, GNX)
|
||||||
|
FXF = (HTX, NHT)
|
||||||
|
BGD = (JHF, XQP)
|
||||||
|
NBX = (MRF, BXJ)
|
||||||
|
LKD = (CML, CLM)
|
||||||
|
VJN = (GJH, HJF)
|
||||||
|
TCC = (RBM, DJG)
|
||||||
|
NXN = (BFF, FML)
|
||||||
|
DTB = (SSP, QJN)
|
||||||
|
HRV = (MDM, QNF)
|
||||||
|
LNK = (XFS, MFD)
|
||||||
|
KHJ = (FPP, RLV)
|
||||||
|
MKR = (XXV, RJV)
|
||||||
|
LQJ = (KXT, VPC)
|
||||||
|
HDM = (KQL, CQF)
|
||||||
|
PTX = (LQK, LVC)
|
||||||
|
PJF = (JBM, HPG)
|
||||||
|
RNT = (LRR, SNF)
|
||||||
|
RKP = (JJN, RJC)
|
||||||
|
JCH = (SBR, XVT)
|
||||||
|
MJF = (XPT, ZZZ)
|
||||||
|
DXN = (TGT, MGB)
|
||||||
|
VST = (NXP, KVK)
|
||||||
|
NJF = (MCK, KKF)
|
||||||
|
KGT = (HQQ, MFM)
|
||||||
|
SXX = (BTH, QQV)
|
||||||
|
PCD = (GXF, VVL)
|
||||||
|
PXF = (TTQ, HJH)
|
||||||
|
FPV = (RBT, GRF)
|
||||||
|
LKK = (SCV, SCV)
|
||||||
|
KTL = (LTL, DQV)
|
||||||
|
QKP = (FHH, BXH)
|
||||||
|
TLQ = (JMB, LVN)
|
||||||
|
MNG = (PBM, MPV)
|
||||||
|
AAA = (GVD, NTL)
|
||||||
|
JFB = (MPH, LPX)
|
||||||
|
VTT = (HFH, HFT)
|
||||||
|
RDS = (MGF, SQR)
|
||||||
|
FGD = (RDR, HRF)
|
||||||
|
CQF = (QPF, BDV)
|
||||||
|
TCR = (CPT, RGH)
|
||||||
|
HVH = (PHV, HNG)
|
||||||
|
DNF = (MSJ, SBK)
|
||||||
|
MGG = (RQQ, FQS)
|
||||||
|
GGB = (XRX, NJP)
|
||||||
|
FFL = (XXQ, QLN)
|
||||||
|
VCF = (GSB, JXT)
|
||||||
|
TNN = (RKP, FXS)
|
||||||
|
LLV = (LTJ, NCB)
|
||||||
|
HQQ = (XMD, QRP)
|
||||||
|
LQG = (MRR, RKM)
|
||||||
|
GHM = (KBS, BCN)
|
||||||
|
JXD = (CSD, KRF)
|
||||||
|
RKT = (PBQ, SGR)
|
||||||
|
QKL = (CKP, JXS)
|
||||||
|
BKD = (LJJ, JKM)
|
||||||
|
SBP = (FPP, RLV)
|
||||||
|
SKN = (DSQ, JHM)
|
||||||
|
JLC = (HLN, VML)
|
||||||
|
JPD = (MBX, FGS)
|
||||||
|
JLG = (HQD, LVS)
|
||||||
|
NJG = (LJJ, JKM)
|
||||||
|
TCS = (MDN, JBD)
|
||||||
|
VKV = (KCL, TXD)
|
||||||
|
MCG = (MGH, GBB)
|
||||||
|
BJF = (HRC, QNX)
|
||||||
|
PHD = (HDM, RNL)
|
||||||
|
MHF = (JXS, CKP)
|
||||||
|
FTN = (MQL, RHX)
|
||||||
|
PLG = (NJX, PLR)
|
||||||
|
RLV = (MNG, RNM)
|
||||||
|
XJX = (GSC, SFM)
|
||||||
|
GVD = (BMX, SSJ)
|
||||||
|
JHF = (QQS, TSC)
|
||||||
|
NVK = (KRF, CSD)
|
||||||
|
RVX = (PFH, GNX)
|
||||||
|
HNG = (FSG, VRJ)
|
||||||
|
MDT = (SSM, HQR)
|
||||||
|
TFG = (LXN, KMP)
|
||||||
|
DSQ = (KSV, KSV)
|
||||||
|
RXR = (TNN, BML)
|
||||||
|
KCC = (PCD, RMP)
|
||||||
|
TTG = (SRM, FDJ)
|
||||||
|
VML = (HHC, PCB)
|
||||||
|
HDB = (HMJ, CMG)
|
||||||
|
PFN = (NCB, LTJ)
|
||||||
|
JXB = (JCH, HHB)
|
||||||
|
XVJ = (BBT, BMS)
|
||||||
|
FDS = (RQG, RNP)
|
||||||
|
RJH = (VBR, QGS)
|
||||||
|
GLD = (RKH, BBX)
|
||||||
|
PLK = (FHB, GGP)
|
||||||
|
RCM = (PJJ, NLH)
|
||||||
|
HRC = (RFN, CRC)
|
||||||
|
RGM = (MVT, VKR)
|
||||||
|
DLQ = (JCN, KTL)
|
||||||
|
NTL = (SSJ, BMX)
|
||||||
|
KKP = (LBH, QFT)
|
||||||
|
RQH = (LQK, LVC)
|
||||||
|
CTM = (QKL, MHF)
|
||||||
|
FRG = (XXL, GLZ)
|
||||||
|
VLX = (GSB, JXT)
|
||||||
|
QGD = (MFS, RLL)
|
||||||
|
LCC = (CPC, XQM)
|
||||||
|
TSC = (HJB, RRQ)
|
||||||
|
JGM = (PLG, NRQ)
|
||||||
|
KPN = (QKL, MHF)
|
||||||
|
VMF = (CRJ, KGT)
|
||||||
|
STP = (DXN, BNJ)
|
||||||
|
LPG = (NVR, NKQ)
|
||||||
|
VFB = (RCM, BNV)
|
||||||
|
HLD = (RQQ, FQS)
|
||||||
|
VHM = (PNM, DNF)
|
||||||
|
PFB = (JMM, FVT)
|
||||||
|
RKM = (BKH, VFR)
|
||||||
|
CVJ = (TKF, PJX)
|
||||||
|
NCJ = (NLQ, LCC)
|
||||||
|
LBD = (MRL, VTT)
|
||||||
|
HHB = (XVT, SBR)
|
||||||
|
JDF = (LXS, QXR)
|
||||||
|
BTH = (QBL, TRP)
|
||||||
|
QDP = (DKX, XMZ)
|
||||||
|
DKJ = (PBX, DKQ)
|
||||||
|
PDS = (FRX, BRM)
|
||||||
|
DJM = (MKF, GGB)
|
||||||
|
HFH = (VQK, GSL)
|
||||||
|
QNX = (RFN, CRC)
|
||||||
|
RFN = (DKV, JKG)
|
||||||
|
LDX = (VST, QKJ)
|
||||||
|
TJK = (SQQ, LSH)
|
||||||
|
NLQ = (XQM, CPC)
|
||||||
|
LVT = (XNC, VFL)
|
||||||
|
PJJ = (FPG, QVF)
|
||||||
|
XGS = (QNX, HRC)
|
||||||
|
GTH = (JCS, TVQ)
|
||||||
|
SMB = (PCN, DTB)
|
||||||
|
SBV = (JBM, HPG)
|
||||||
|
MBK = (VLX, VCF)
|
||||||
|
STL = (CXK, RTH)
|
||||||
|
PQF = (LKD, XXP)
|
||||||
|
KNX = (NLM, XCV)
|
||||||
|
XBC = (NND, CMK)
|
||||||
|
VHS = (PCL, MBK)
|
||||||
|
GLZ = (XKM, SCP)
|
||||||
|
NHT = (SMX, FSV)
|
||||||
|
HTX = (SMX, FSV)
|
||||||
|
MDM = (LTV, KTP)
|
||||||
|
BHS = (MCJ, LBF)
|
||||||
|
PDP = (VMD, FXV)
|
||||||
|
SFM = (DRQ, MGS)
|
||||||
|
HDD = (CBG, VNP)
|
||||||
|
RVD = (JPD, FBH)
|
||||||
|
DTV = (VFB, JCJ)
|
||||||
|
PMX = (NGB, PBF)
|
||||||
|
RLL = (KXL, MJF)
|
||||||
|
PCB = (MLQ, XPM)
|
||||||
|
PBF = (HRV, FCN)
|
||||||
|
VRJ = (XSV, GTH)
|
||||||
|
QSK = (JCH, HHB)
|
||||||
|
RRQ = (RMH, RFL)
|
||||||
|
KBJ = (GHM, FQL)
|
||||||
|
FRB = (CBT, SMB)
|
||||||
|
KHC = (PXH, RJH)
|
||||||
|
JNN = (MRF, BXJ)
|
||||||
|
BRM = (VBB, BTC)
|
||||||
|
FRX = (VBB, BTC)
|
||||||
|
NXC = (SGJ, RBB)
|
||||||
|
NTJ = (FMS, LHR)
|
||||||
|
QVQ = (QKJ, VST)
|
||||||
|
BBX = (TJK, XNH)
|
||||||
|
VKF = (HMS, LDC)
|
||||||
|
HQB = (CXG, DNR)
|
||||||
|
RJC = (DJM, NBV)
|
||||||
|
NND = (LGP, GKD)
|
||||||
|
VVJ = (DKJ, XVK)
|
||||||
|
LBF = (GPV, RGM)
|
||||||
|
RHH = (KMB, XLC)
|
||||||
|
HQD = (GHC, NDR)
|
||||||
|
VMD = (NGH, RDS)
|
||||||
|
JKG = (KFM, NTR)
|
||||||
|
XGK = (TCC, KGR)
|
||||||
|
VJD = (LDC, HMS)
|
||||||
|
FDJ = (HLH, KBJ)
|
||||||
|
KXQ = (XSH, KQV)
|
||||||
|
GLP = (BNJ, DXN)
|
||||||
|
SGJ = (JLG, DJD)
|
||||||
|
JPC = (MGG, HLD)
|
||||||
|
XFX = (XXN, GKB)
|
||||||
|
PBX = (RRC, MVG)
|
||||||
|
GBN = (RKX, QDP)
|
||||||
|
PRG = (KCC, FTQ)
|
||||||
|
RJV = (VQT, SLP)
|
||||||
|
HBM = (VHM, JPB)
|
||||||
|
XVT = (RGS, LBD)
|
||||||
|
CPP = (TBT, PLK)
|
||||||
|
QKN = (LXS, QXR)
|
||||||
|
MJB = (TKV, VTM)
|
||||||
|
BQX = (KMG, CKD)
|
||||||
|
MXQ = (LCF, KJR)
|
||||||
|
KXT = (FDS, DPS)
|
||||||
|
XQA = (LLS, GVK)
|
||||||
|
TRP = (DMQ, QDD)
|
||||||
|
TTF = (PDP, PHC)
|
||||||
|
SMF = (TDJ, XVJ)
|
||||||
|
CHG = (GFT, HTM)
|
||||||
|
LSH = (LQG, BQF)
|
||||||
|
JXV = (KJF, QTD)
|
||||||
|
RLQ = (HDV, GLD)
|
||||||
|
GXF = (FNT, FGD)
|
||||||
|
PFL = (NRQ, PLG)
|
||||||
|
HFT = (VQK, GSL)
|
||||||
|
JHM = (KSV, NGZ)
|
||||||
|
NNM = (XCV, NLM)
|
||||||
|
RTX = (MQK, BGD)
|
||||||
|
RGC = (VVJ, PSM)
|
||||||
|
LNQ = (VRM, TCR)
|
||||||
|
GNX = (STP, GLP)
|
||||||
|
MGF = (XPK, NDN)
|
||||||
|
SQQ = (BQF, LQG)
|
||||||
|
TNJ = (DTL, PHD)
|
||||||
|
TDD = (MHT, TMT)
|
||||||
|
BQF = (MRR, RKM)
|
||||||
|
DRQ = (NGJ, KMK)
|
||||||
|
HRF = (TCH, QKP)
|
||||||
|
NLC = (TTL, LRJ)
|
||||||
|
RBN = (MGH, GBB)
|
||||||
|
NGZ = (GTR, NBQ)
|
||||||
|
QPJ = (CXK, CXK)
|
||||||
|
XMD = (NBR, TCS)
|
||||||
|
TMT = (TQB, FXZ)
|
||||||
|
QKJ = (NXP, KVK)
|
85
advent-of-code-2023/elixir/day_08/lib/navigator.ex
Normal file
85
advent-of-code-2023/elixir/day_08/lib/navigator.ex
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
defmodule Navigator do
|
||||||
|
@doc """
|
||||||
|
Count steps for the first part.
|
||||||
|
|
||||||
|
# Examples
|
||||||
|
|
||||||
|
iex> Navigator.count_steps(["R"], %{"AAA" => ["AAA", "ZZZ"], "ZZZ" => ["ZZZ", "ZZZ"]})
|
||||||
|
1
|
||||||
|
"""
|
||||||
|
@spec count_steps(list(String.t()), map()) :: integer()
|
||||||
|
def count_steps(instructions, maps) do
|
||||||
|
count_steps(instructions, instructions, maps, "AAA", 0)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp count_steps(full_instruction_list, [dir | next_instructions], maps, state, steps) do
|
||||||
|
new_state = pick_destination(maps[state], dir)
|
||||||
|
|
||||||
|
case new_state do
|
||||||
|
"ZZZ" ->
|
||||||
|
steps + 1
|
||||||
|
|
||||||
|
_ ->
|
||||||
|
# Go to the beginning of the list of instructions if we are at the end.
|
||||||
|
next_instructions =
|
||||||
|
case next_instructions do
|
||||||
|
[] -> full_instruction_list
|
||||||
|
_ -> next_instructions
|
||||||
|
end
|
||||||
|
|
||||||
|
count_steps(full_instruction_list, next_instructions, maps, new_state, steps + 1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Count steps for the second part.
|
||||||
|
|
||||||
|
# Examples
|
||||||
|
|
||||||
|
iex> Navigator.count_ghost_steps(["R"], %{"BBA" => ["BBA", "BBZ"], "BBZ" => ["BBZ", "BBZ"]})
|
||||||
|
1
|
||||||
|
"""
|
||||||
|
def count_ghost_steps(instructions, maps) do
|
||||||
|
maps
|
||||||
|
|> Map.keys()
|
||||||
|
|> Stream.filter(fn x -> String.ends_with?(x, "A") end)
|
||||||
|
|> Stream.map(fn x -> count_ghost_steps(instructions, instructions, maps, x, 0) end)
|
||||||
|
# compute least common multiple
|
||||||
|
|> Enum.reduce(1, fn x, acc -> Math.lcm(x, acc) end)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp count_ghost_steps(full_instruction_list, [dir | next_instructions], maps, state, steps) do
|
||||||
|
new_state = pick_destination(maps[state], dir)
|
||||||
|
|
||||||
|
if String.ends_with?(new_state, "Z") do
|
||||||
|
steps + 1
|
||||||
|
else
|
||||||
|
# Go to the beginning of the list of instructions if we are at the end.
|
||||||
|
next_instructions =
|
||||||
|
case next_instructions do
|
||||||
|
[] -> full_instruction_list
|
||||||
|
_ -> next_instructions
|
||||||
|
end
|
||||||
|
|
||||||
|
count_ghost_steps(full_instruction_list, next_instructions, maps, new_state, steps + 1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Pick destination.
|
||||||
|
|
||||||
|
# Examples
|
||||||
|
|
||||||
|
iex> Navigator.pick_destination(["AAA", "BBB"], "L")
|
||||||
|
"AAA"
|
||||||
|
|
||||||
|
iex> Navigator.pick_destination(["AAA", "BBB"], "R")
|
||||||
|
"BBB"
|
||||||
|
"""
|
||||||
|
def pick_destination(destinations, direction) do
|
||||||
|
case direction do
|
||||||
|
"L" -> hd(destinations)
|
||||||
|
"R" -> hd(tl(destinations))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
53
advent-of-code-2023/elixir/day_08/lib/parser.ex
Normal file
53
advent-of-code-2023/elixir/day_08/lib/parser.ex
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
defmodule Parser do
|
||||||
|
@doc """
|
||||||
|
Parse file with instructions.
|
||||||
|
"""
|
||||||
|
def parse_file(filepath) do
|
||||||
|
File.stream!(filepath)
|
||||||
|
|> Stream.map(&String.trim_trailing/1)
|
||||||
|
|> Enum.to_list()
|
||||||
|
|> parse_input()
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Parse instructions.
|
||||||
|
|
||||||
|
# Examples:
|
||||||
|
|
||||||
|
iex> Parser.parse_input(["LLR", "", "AAA = (AAA, ZZZ)", "ZZZ = (ZZZ, ZZZ)"])
|
||||||
|
{["L", "L", "R"], %{"AAA" => ["AAA", "ZZZ"], "ZZZ" => ["ZZZ", "ZZZ"]}}
|
||||||
|
"""
|
||||||
|
def parse_input(lines) do
|
||||||
|
instructions =
|
||||||
|
lines
|
||||||
|
|> hd()
|
||||||
|
|> String.graphemes()
|
||||||
|
|
||||||
|
steps =
|
||||||
|
lines
|
||||||
|
|> Stream.drop(2)
|
||||||
|
|> Stream.map(&parse_instruction/1)
|
||||||
|
|> Map.new()
|
||||||
|
|
||||||
|
{instructions, steps}
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Parse instruction string.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
iex> Parser.parse_instruction("BBB = (AAA, ZZZ)")
|
||||||
|
{"BBB", ["AAA", "ZZZ"]}
|
||||||
|
"""
|
||||||
|
def parse_instruction(src) do
|
||||||
|
[key, tuple] = String.split(src, " = ")
|
||||||
|
|
||||||
|
destinations =
|
||||||
|
tuple
|
||||||
|
|> String.slice(1..-2//1)
|
||||||
|
|> String.split(", ")
|
||||||
|
|
||||||
|
{key, destinations}
|
||||||
|
end
|
||||||
|
end
|
30
advent-of-code-2023/elixir/day_08/mix.exs
Normal file
30
advent-of-code-2023/elixir/day_08/mix.exs
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
defmodule Navigator.MixProject do
|
||||||
|
use Mix.Project
|
||||||
|
|
||||||
|
def project do
|
||||||
|
[
|
||||||
|
app: :navigator,
|
||||||
|
version: "0.1.0",
|
||||||
|
elixir: "~> 1.16",
|
||||||
|
start_permanent: Mix.env() == :prod,
|
||||||
|
deps: deps()
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
# Run "mix help compile.app" to learn about applications.
|
||||||
|
def application do
|
||||||
|
[
|
||||||
|
extra_applications: [:logger]
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
# Run "mix help deps" to learn about dependencies.
|
||||||
|
defp deps do
|
||||||
|
[
|
||||||
|
{:dialyxir, "~> 1.4", only: [:dev, :test], runtime: false},
|
||||||
|
{:math, "~> 0.7.0"}
|
||||||
|
# {:dep_from_hexpm, "~> 0.3.0"},
|
||||||
|
# {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
|
||||||
|
]
|
||||||
|
end
|
||||||
|
end
|
5
advent-of-code-2023/elixir/day_08/mix.lock
Normal file
5
advent-of-code-2023/elixir/day_08/mix.lock
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
%{
|
||||||
|
"dialyxir": {:hex, :dialyxir, "1.4.3", "edd0124f358f0b9e95bfe53a9fcf806d615d8f838e2202a9f430d59566b6b53b", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "bf2cfb75cd5c5006bec30141b131663299c661a864ec7fbbc72dfa557487a986"},
|
||||||
|
"erlex": {:hex, :erlex, "0.2.7", "810e8725f96ab74d17aac676e748627a07bc87eb950d2b83acd29dc047a30595", [:mix], [], "hexpm", "3ed95f79d1a844c3f6bf0cea61e0d5612a42ce56da9c03f01df538685365efb0"},
|
||||||
|
"math": {:hex, :math, "0.7.0", "12af548c3892abf939a2e242216c3e7cbfb65b9b2fe0d872d05c6fb609f8127b", [:mix], [], "hexpm", "7987af97a0c6b58ad9db43eb5252a49fc1dfe1f6d98f17da9282e297f594ebc2"},
|
||||||
|
}
|
17
advent-of-code-2023/elixir/day_08/test/navigator_test.exs
Normal file
17
advent-of-code-2023/elixir/day_08/test/navigator_test.exs
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
defmodule NavigatorTest do
|
||||||
|
use ExUnit.Case
|
||||||
|
doctest Navigator
|
||||||
|
doctest Parser
|
||||||
|
|
||||||
|
test "part 1" do
|
||||||
|
{instructions, maps} = Parser.parse_file("input.txt")
|
||||||
|
res = Navigator.count_steps(instructions, maps)
|
||||||
|
IO.puts("Part 1: #{res}")
|
||||||
|
end
|
||||||
|
|
||||||
|
test "part 2" do
|
||||||
|
{instructions, maps} = Parser.parse_file("input.txt")
|
||||||
|
res = Navigator.count_ghost_steps(instructions, maps)
|
||||||
|
IO.puts("Part 2: #{res}")
|
||||||
|
end
|
||||||
|
end
|
1
advent-of-code-2023/elixir/day_08/test/test_helper.exs
Normal file
1
advent-of-code-2023/elixir/day_08/test/test_helper.exs
Normal file
|
@ -0,0 +1 @@
|
||||||
|
ExUnit.start()
|
Loading…
Reference in a new issue