summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Douillet <vincent@vdouillet.fr>2022-12-03 22:00:50 +0100
committerVincent Douillet <vincent@vdouillet.fr>2022-12-03 22:00:50 +0100
commit56d350f318f8cf9b580852b123d505845abad84e (patch)
tree00cc84eb598ef79c213f9b060788dfa2a67ef257
parent4382d5aaf86ccfc09c38f5ede0e1fa06beb04684 (diff)
day 3
-rw-r--r--03.c79
-rw-r--r--Makefile5
-rw-r--r--input/03.txt300
3 files changed, 383 insertions, 1 deletions
diff --git a/03.c b/03.c
new file mode 100644
index 0000000..d5b10fd
--- /dev/null
+++ b/03.c
@@ -0,0 +1,79 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <err.h>
+#include <string.h>
+#include "input.h"
+
+#define INPUT "input/03.txt"
+#define EXPECTED1 7446L
+#define EXPECTED2 2646L
+
+void part1(struct input_str* input) {
+ long priority_sum = 0;
+ char duplicate_item;
+ for(size_t i = 0; i < input->line_count; i++) {
+ int rucksack_size = strlen(input->lines[i]);
+ int compartment_size = rucksack_size / 2;
+ for(int j = 0; j < compartment_size; j++) {
+ for(int k = compartment_size; k <= rucksack_size; k++) {
+ if(input->lines[i][j] == input->lines[i][k]) {
+ duplicate_item = input->lines[i][j];
+ goto found_duplicate;
+ }
+ }
+ }
+ err(2, "rucksack %ld: no duplicate found", i);
+
+found_duplicate:
+ if(duplicate_item > 'a')
+ priority_sum += duplicate_item - 'a' + 1;
+ else
+ priority_sum += duplicate_item - 'A' + 27;
+ }
+
+ CHECK(priority_sum, EXPECTED1)
+}
+
+void part2(struct input_str* input) {
+ long priority_sum = 0;
+ char badge;
+ // loop on groups of elves
+ for(size_t i = 0; i < input->line_count; i += 3) {
+ // loop on first rucksack content
+ for(size_t j = 0; j <= strlen(input->lines[i]); j++) {
+ // second rucksack
+ for(size_t k = 0; k <= strlen(input->lines[i+1]); k++) {
+ // third rucksack
+ for(size_t l = 0; l <= strlen(input->lines[i+2]); l++) {
+ if(input->lines[i][j] == input->lines[i+1][k] && input->lines[i][j] == input->lines[i+2][l]) {
+ badge = input->lines[i][j];
+ goto found_bagde;
+ }
+ }
+ }
+ }
+ err(2, "rucksack %ld: no badge found", i);
+
+found_bagde:
+ if(badge > 'a')
+ priority_sum += badge - 'a' + 1;
+ else
+ priority_sum += badge - 'A' + 27;
+ }
+
+ CHECK(priority_sum, EXPECTED2)
+}
+
+int main() {
+ // read input
+ struct input_str input;
+ input_str_read(&input, INPUT);
+
+ // do stuff
+ part1(&input);
+ part2(&input);
+
+ // cleanup & exit
+ input_str_free(&input);
+ return 0;
+}
diff --git a/Makefile b/Makefile
index b42f264..088ac94 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
CC=cc
CFLAGS=-std=c1x -W -Wall -g -D_GNU_SOURCE
LDFLAGS=
-EXEC=01 01bis 02
+EXEC=01 01bis 02 03
all: $(EXEC)
@@ -17,5 +17,8 @@ all: $(EXEC)
02: input.o 02.o
$(CC) -o $@ $^ $(LDFLAGS)
+03: input.o 03.o
+ $(CC) -o $@ $^ $(LDFLAGS)
+
clean:
rm -rf *.o $(EXEC)
diff --git a/input/03.txt b/input/03.txt
new file mode 100644
index 0000000..9c0014b
--- /dev/null
+++ b/input/03.txt
@@ -0,0 +1,300 @@
+JppMDcJPcQbqGqFb
+ZStgnHtsSjGBhqFbBmsm
+djzzwgHHggdnfwjtMPDPMGpPlNfpLDll
+dRCtwtlCSttPtlNPNtgvPrDqmBsjGSpjBBsJsqqmrp
+ZhWnZhzMMfnWWTDzBrmsmjsBccJB
+TFQMrZrMfZrLZZnLQdlvNdCgdHPlCllHNF
+PVddPnZWDDPqmHZzqVPzqdHdMRMJjQtvmvjvtTQQtlRtbbQl
+fsNswFpChpNwfgtMvCbjTRJBbtRj
+SFgfSMShLcsLgNMFhpwShFFZPHqZGZPqHdzPZHZcdzDDqd
+dHffzCqSfJCCzCPvdcpzRrBDDBSBBBMtthDDrFMT
+bVsZbsrgbWshBTFtDTtZTD
+slWGNbNWgWwnmNnwgnlGjdJJdPHcvcrcHjqPzdqPvp
+vBFBzGvGBvjFpGWcvCCvBvGPPhZbgLhMnhrPgFgPFgLLPF
+dVlslfdJNVJJmQQwdNRNwLZZZrrqhbPbZndpdgMhLP
+HJRHJpNJlVmftHfNQNRsHmmGCtGWjGDDTvCzcjWDStvcvT
+cVQzCCCpVVjgHsNwwFRqSRSRRtNH
+PWfhfPhbWWdWllPDdTvdbnvhLJLLMJFTSNwJtMRwJLqJJNMq
+DnfblllPbDrbWmbdPFdvlhdgQzzZZzQgcpcsZGcGQQgcpr
+hdFnnrdLnJRrZMzVlMbrwZvz
+TgfjGCcfsqfqqBfRMPDVvVVvTZRPbP
+qQqffcGStBSCQcsqCCBRjGqWhHFptFdnhNLmhnLWmphLLt
+WHPqWhLWHBMqddCdtDRwStDSwgnw
+rfCfZTmvpvvpFVfFrbvTbvcgtwgtStntggwbSJttgJtwgw
+fpQFsmfFmfZcrFCMhWNQWLCzhhCM
+zdqqJHDWwqNNZjQSmtdjpmfnjj
+GFBcPfBLPThcTcLRbpTQQjpTQrjSnQjlvn
+MFVLcsPVbPcRGfVPFRgDzJsHZNDCZNCNZsHg
+WQdMhlmQMwfZlQdgdHfddvtzmbJbcsctbBJqqcvqzB
+rSTrDDCSSGRCnnSGwwzJsbBvJsCCttccsvsz
+VnFwDrNwPwVSDrLgjfZZdMQFMWgljQ
+rJNjBLNQjvLQjFFLQJCFTvGWlRRgfGWDWlCDzlGnRRWG
+tMMhShhwhbgplflwDlnnnzDH
+ZcSZVMSqshhQBQqQvqQgjJ
+btTtWGbvtcvHHccdNRhHdl
+TDzqLPSqBzqVSldPddHhhNNlRQ
+jBLDqDgZZBzJJmsbWjppmmpTWw
+LLDTRRfTwZRGZfDCRTwRsVHsVFBVZVlmVFBFlFJl
+QjWpQrzQcbhfMqrVVHVPFslFVpVmHH
+hqhzqMfNvjvMMzhdRDdCwGDSSdnvRn
+jmMdNCLjLmJPtHtSHhSVVJ
+pDBqgBgCvbfGBBbCGHZhtQZtPHVSVHPV
+pBnWgBpzWzBbWDWvzwpgCvqcmLNTrdLmmrnRLTrmrTdmLd
+dRWWtRGBDPQctQDZ
+CMfnCfFMmTTFVCmfmTLvsnMPZjccHRcPrRPsZQQZPQDRrQ
+fLCffmRTCvRnmTllzVvpdpphNJggpGbJJJpdlh
+cfsfbbWqqZqDScbhGDPDjTPmpVtmmPjPntFD
+dCBBCRQCHNHLMQvrJJJBJLrGPMnjVtPjVMmnjPFmPmMpFn
+HvRGLddgHHvqhwzbWhcgcf
+DHmhhDDhbqrRhvbrHqhPbPvBwwWwTmMGTVwwBMGWVNNwVw
+gSzJjnnjsscfcsZcSfWwQGdMMcWTBcTTMTMw
+nsFCCFZsnSlCFBFflfflsztRPCqvvHPttRbHbhvPrrRr
+SGNRLzpNpgNSNNlWFNwzqJfHfJHBtBdJhBJrHd
+bQnjPTnjVdZtPPrfLP
+TTnTccLnjGFcDNggFl
+lBJmNzJlzmmQBlzgVVjLWRDfLjRsRLWWRS
+vTMvTvtrfdhrrrPTdZwTTwtDqSSnWFWDFMMsRssjjsRqWD
+ZpbvHbZddtbrdrdhcBmmpGQfBQgJNcmz
+qsmhTmTVcDdcffhPhPvvzFhF
+BNNlJbjWBWjtRtNljbmBBCpFzPlFPgpPfwFnlffnlPgg
+JtBmmrrrRbDSrVqDqVSD
+VmSgpSLgJjVDMrFrmMlfFmsG
+bZWhZbzWcCwTWPRCwwwSPQzwMHnflHnGsMGnTrsflGMnlfTF
+CqWhWqWCCWRRZQcLqDLpVDDLNStpgD
+JwzTVzzcLzVJVVlJpVTwzGcrWhFjqsBjCjQFjWcCCjCjBF
+MDSNQMtbSSnSbgbRDvnRNgvhmrqrjBCBtmCrCCWFqthhWm
+bgMfNSSNZTwZQddGJZ
+jjPgbFjjStjjPcSbrbtpvNrGnGDvBnMGvNDNGG
+LwdZwsTdWTTmwDNCNppGBsnpBR
+mWmHwZWhTTJWHBdQQWBjcFczSgjlSftjbtQPzg
+fCBlrffzlCzcmfLDlfgRRnHScsHvRSQHMQvs
+LthpZqtpVThZhGJtqTFvHsVnvsvMsggjHQjgQH
+ZWFWGTLTWBNCWfDfmD
+BpFqJrpcZZBDhDsNqMHhRG
+zwlzPdmzPLhwvhMgsHnN
+mPlWjlQfQjjllWtjQCWzCrBFJFTBcSNcJbbZfcZJSb
+FpzNFTThBDChnnzNBCBNDzWGndgWqbJWVGqmPbJqQgQm
+HQRctcvwgddVcJGd
+LwRMZLjQfSRjFNzFSrhNsThS
+WgRWVLWhFqgqgcgWHqLRWHVRbbbNwBmtBcNcwdwwBNwBzwBN
+pSfssjDSrSvJpNJCztbJBtMNbt
+TzsvGGnjGPsPjSTpDrPfPDSHhWqLgZZVHVhZZZZVQQFLnZ
+sHjtPjQTtDbsfrrqWR
+ZmccchvlvSvvZNMVNhvBLWRJJblWJWJlJfwHbwlL
+hMMBzSMppVSzSNNmNgHjPgGPFTCpTTgTgG
+rPQpCPPCQQZdcFhcZgzVJgwt
+vDBSHmvHSSMlDWWmljnHBvFwzzcrwhVSJwVFtzcJJghw
+bmmrsrsbsvNdCTdbPTdb
+NgzBnsBNnfjgNvvfvWbtShSSFSMLJMFjjbPh
+CCcRHdlQrQPLTJPLGP
+HrDlRcqcDJCCDJHlcplrDJDfgfzBWWNZfvsnNqWwngZWwW
+TggFVbjVTVzRwFFjjqBBqpzNztqcQqNNqN
+SnZPrWndmShSZSPsnSLsJhpMQpcJtNqBClltqctC
+mfWsGdnZZWmZmrLSfsrnmPggwtggRgGTVHvRwgFDjTGT
+wQMZFQwppbPHPbLQJsgQNJJmBnds
+qrSGvRRCvTzTDNnhNgmCgdBm
+qzRrcRlGjvvzlzrvjcGqSSzMHWwVdPMWFpFMHMHWlPWMVV
+BccsFzrBcsfpccccgFmQqlGNqCTLTlQnqgLlRG
+MZbVSMddddSPPtdHPVJPJdTllqLNLGGTNCCRhTnHTQHh
+DMwtbVZDZbSbpprcpccppwrq
+bSZTdNqFjjzjqQMQ
+WtRztLsWJpPLzrsMDlDQjMhVMC
+pcgHRpHmWPJgLRzBJHBPPRBfvvfGNGvvFwfvSvfTmNNZfN
+RjvBljWTTWTlqmBvHjGptRgccZcbPtcttbpzbn
+VhDSDdJLJpSNNVVznPzzzSzcZFngZt
+LsMdQNVMHsBHjqps
+rSPSLTnSCClfSFCR
+MwtZgwNBzzTjzZMbbmjNtwmBcRvFqQllqtQRlFRVqRqVVcvq
+TsMhZsjNjBbTbBbwZLpDnHdDGdHWnpGHnh
+LfdssTFBjFHSwlhzCcZZgMMfMhZZ
+DmtDvrpmNStVvqpPczrZMMhZhhChCC
+vJtJpQWvNVDtJFbHlJSlBbSF
+PgvHLbcgRcGGHzRvgGgchBzsCZnmNZmZddrCrvdddZCZrF
+JQBMjlStJrQsZFrNCZ
+JSJTlqMtjptlplSSqJVDBqphwhhwHRPRggGbGzHbgzVRPH
+pBsztsZdBsnWhntVnhtVTqTWNQlGGTGGFFlQFlTl
+fDvLSMcbDbfMrGqFqSGwSQPzqz
+zjcvLMMvffLjgggzfjjJCCLcdBtRphddBmmZBpCZZpZpmmhs
+gmmSDplcPHDfHDlbVNrtCtCCNqHvTn
+QGwJjzdPMzJhFLwnbvMqrTVCCMnvMv
+LQQZdGjGdJhFBFQGjLGBJzzsBSWcPflllcfmDmfBsmBWPs
+sMppbLDRMQbrTDTJjwcqnfnjwwnw
+CgmFgSPHPzHgdmJWZZFzCzZZcVnGGnttWtVVVnccfjVqwVff
+PhCChPSNgPgPJhPHhFZgsDNRspsvMNQLRvNDvpbD
+pHnVnlRGVpfgpfgCpCTz
+LCNQPqZCqNSSZCStzPgTmztwPfzwzT
+dbSqhjhqQhNLQLFjLjGvFcRnCcsvRVvvsFnG
+QTdnDTDQbCnMdbqdwSmJBljFJZhttJZMSh
+HfNfLNzGLsgWBpGJthlZFBSB
+ssRPHPfNsWHzZZvrvHfgLzNwnbbVVRwwRbVVcqDTddCVdD
+ZhZBrJssjrNsbRtWpjwjlmlm
+qTfHzGTfTGqqLGMdCCRcmmRRZcbPMccWmcRw
+dVCZdDHdGHQhBVNJSsBhBF
+NsplbGDbblHcbCpDlDGDPlPpJjdrVjgrvHnghvVdJrJdvvdn
+tQFMZNWSmWFQRzQSwtzFmwFFJdVBghVrnBjVjBgrvVjMvrhJ
+FFRmFZZRzQRmFLQSZZWQWFCPCNGcTCpGpfGfLTpblpff
+dnhQHqQCnqWwNQCwCRRdJjjJVVPmVVJsJP
+LccFRDgfMgLFBJVlmVVmgjrPzZ
+pvfGpRpSpTnTQbvbTv
+nwNlWwhWwNmJvQQdzdzZGMqDzn
+rcVscPfrLcfvjTFcQDqGdZqMzMSHZHjS
+LsfbbFcvVgRRblJRNR
+Rmrrlmltcffhllfl
+DDZMMMFZVsFsWZDSHhPPfgQbPPnQgcHctf
+zGMGSBVDWCrvwjtBvm
+DCZHwdDwNNGNZDZCjjtpTHLvtlgLbRLttlTL
+BzPzBJffJJQgLlRgGztQ
+PJffcJhJfNNSwFhGZC
+blplfHbwZSfbcbwSbfVSHDHcNvdrvrWsCrvWVCRWnvNndtWW
+hQzBTQLLMBWBsnsnNC
+zMsgTjqTqPpZHbfp
+ZLNNLtfZhRJQtpQhNRttZRqcGFcqGBzjrcqclGScFljjcj
+VnvVVPMWHwgJCMvwdcGFdFrGcwzGBG
+WHgPJJvWVTgnvgvTHmWCHmsNZRtNRDZpfZQffZZssR
+rZgMFMVVjGbVSqZbhftLRDmCGRCNDCtm
+cdddQzdWsWnQvzscnfRHmfnDNtLNChRmfH
+zplDQdDzwszlDsWdPcldzMFFrFrBFgpqVBZgSgZFrF
+gbzfbTvbJgbvzvTvJvJmzvjcBBQSfWDLCSBQQfLZWSCdBHHD
+GhnMhsGrMNPPwnwsRPNsFCZDWHZdWBWHdrZLdCHBBC
+PsnGsssGNsNRFsLGwMVNccJVmbjcjJblbzTVjlTz
+RfBqNfVmPLTTTVRZMMBWjlMvBgbbMs
+rHJzDwJdHzQgbMQlWMhd
+HtJrpCcHflLPFfpq
+SSGtmjQFStDbQbqGWJNnpZwgPsZjnJNNfZ
+RdClRMhlldHdlvdThNgwfJNRspNwJpwZcN
+CMBLgvvBLhrrBHTCVVLBQrWtbrDGmbtWGtzDQFGb
+ZRRCqHpRdztLSqWz
+hRsGjMVccGshPVDVcBmfgFFzggFgfBmWWtSd
+PVjlGhcGJjGPsGMjjDVrMTpRnvRZlHnZNNQbHppTTC
+QjbjWWlndRbwwwQWQdtpTVVZtzRPhHDzThhP
+fFfLsvrLCrmvGlSfLSrlPHThDzTztHVtzDzGtTVh
+fvrgsfccFLLLSvfMCCSWBjdMqdqNWBdBQNnWld
+pjGPvvbllvqGvGjwMbpbRmgSmSwtRtShgSSWWQmW
+DffTZLLzFFFTCRJMhWBzhmhgJt
+CVVZLLTTsZTFCnMffMTFHffLVpGpNqGjNbNPljqVPcGNGlcv
+rvJfztqQJqqrqHHwCzClTbBhDBBDrbSgphbVTrrV
+FFGdNWFLGWMmLDbpRwVbgRBp
+dmNGmZjMjQwtHCCw
+MSGbqbqMbbGDhSSGDhLNBPNcrDPPfzfczPfrnv
+rRwsrljslRgslwwgpssCjRtBNvnmPmBmccvmPnmzcP
+CjVjsssJQpTCrCCgHJLMSZbhMhWGZhHG
+JtBGBFGRVGVLLctRttthLFRBDQlDppljJwNQlpHHQqDHbHHN
+szSZTrzdzTSMdzsmsqqQqwdbgDNqgQNjlN
+SzmrlWPrlfPMsMZTPtCVCFRhhvhccLFPvL
+chmbsMDMMcBnGbZBzZGL
+JjjgJrJJggNgtrQSQBLjWBZlGnnB
+rFNrFtFCRNVrrsHmMDcsLqMhMF
+DLMwrBGgrBBDrcBcNBgWhpGhqVhhqSjqqqmjjp
+JfJCZCdtlbZlHHbjWVpPmHWb
+lTtZtnFQCztWFzJflZLcsrLFNDRNBcswcLMM
+tsVttVCBsCcCqPqwvtqNPQjWDDWjzQQWnpJQSrWJJN
+LMRdZvHGgMmZZGGLGLbhLhJpjWrSjndWJpSJrJppJnpj
+RhRgLMlmgMGMFGLlTtcBvwcfFCtVvfFT
+llBBmtncBglfqwsdwsjdbHwQHm
+zGRhPJvFzhvFvMDGFvGPwSWWQpdpHSwSjWjHsWMw
+JGFhDPrLTzhLhvFPzPjLjTzFlBqltnCqqBffcTgfnZfCfCnB
+QWQGNHQBffCNDMPdRTDLPVMN
+hrtlhtzZwJtwwgFgtlJthJJtZMqPVVpLmDVqRDmVPmMPVRTV
+SJSSnJwJlsFFvcHSBbfLQHGL
+zMNVzhNFsdNssmhlvtQvlttBlVGbTt
+wHpFwjHjLFHlwtncTQlnwn
+CCpjpqLCLqJggghqRmFsNRFmPszh
+CTjmprmNcnmCNVQbstnstvbnQv
+jqqdGhHgPRdfRRQvfLQffz
+BGgqBhMdgqBHMDDqqMPwgdhSTJNjjmJWWCTCCmwTWZNpmZ
+LqSDFFmdqDBDbbBHWl
+dQcRpgwRQPngBWHbVWht
+vdQMJQCQQvrJNqrTNsSZSmZT
+cqrHcHHFNFPLLNPHLWnHHFHFjvlbZfWjSjBjZfSblhbBSbSf
+VdVTGwTzTwTpMJslvjfsbbZSvnBClj
+nJdGmmTpTTdmNQNNLPPmDFQL
+VcjpTTtpcbThJBTTcjBvSPJzJlvPlwfJrgrgvw
+dmshCNqnqdhmRsCsqCnrNgPPrPfzrNLfSwSgzl
+ddQZdFnhsMttFTbDDD
+hLThMTSdfMzzLzTLsFTbwtDvtsFTnttF
+pZlNllPWrPCQPQlWNqjrqrjsnfDFbbtbstwswtvDnwtwjt
+pCNNQBCClQrplrfHQpQdSRMSVRhJzRchRhGHSh
+RZfVfRnTcPQWZcRVcRNSvljQsSSjNvvNqvss
+pwbwgmqJhGlNvvzgMM
+pthrhpmthmwhHHpLbbdrJmLWWRPTRZnCnPCPBnWTWTZq
+nzsJJsMjGMMsQFbnNmLnmCfb
+HlllPPTPlWTPDRRDRHcwwhrLLZfQmgmmQCFHvNZCgfggZQ
+lPcNTwNWddGsMSttdjzj
+bTbJZJDVFdqpBZTFTZJprdcsjjGszmjQszcjzDvsgccv
+HHLnhMNCCPhfhCLMlPlnvgGfctscSvtSjGjztQtm
+wWNQMPPMwlPHHPnnRLwWpJbrbbqbdppqJVJdZV
+gpgpNnnrhwBVWFqgjqqF
+ZCTsdRbCGZpZzCSGbWmtMBmWtqBBqdjjmq
+LcsTSlplZrJNcQQPvH
+DJDpMcqJDcDddNcJPGcJGFfnfZZmZZfRQZRNmVQVnBNn
+WWThvSSHFshlSsHvgTHLlzBQfVWwmwnnfmRQWnQVRn
+vljlgHjhstHbLhjLjrbPqMGJcJFJCMPrdF
+pJlPMpMBrrMcnrBBMMrvdhdgFvmcFdWtmdtftg
+bVVRmTRVTVVSVVVzZZqsggFHWTWtWffWFfWdtHdH
+RjLQDSzmVsjRRZSZQrCMJDPwlnJJnGGrPB
+GRgJtglPGlCrhQQrfW
+vSjvZvZHNBjZSvwjvmvNDqhhFqhHrMhrHpfWqQfhpW
+NBmwDSbZbvsNNBjmZfJzJgbVnGJbzVzPVRtL
+QQZVQCdlVmdZnWmJBrLwSJRdggwdJr
+DqHhPhcpvDqPFjhHjtFPssSJNfSBwBvffrgJwwJLBJbr
+jpsHcptHsqtPttsjctpFhGlZwCMlWMmWGCWVQnTMVWmz
+zzvnHjHWSfnvzpnfSRHdgrrsmWmhVrrwwbTrTmsrwm
+NlLNGqqclqlZZCLCGGCPllJhhPJbrmpmrwVshFVsJbwr
+DMLDNCZQCGLQGDtQpGtMjRdfdSRSSBtjtBjfjgjS
+WBBJfjBQJjftGCbttVJptC
+sdlmTHsqNsqpRtGcbWdbnR
+svNMhmWHNmvmvHZWTvBQDgSSjDFPSBSFPP
+mrlgqncgwHdqWWhRNtRttSvbRwwSvN
+jZLCZVZzVcCTcpCDVSBBSbvvRFbfDBSDNS
+VPJVpQjTZLjVLJJQGZTZGcQVghsGlmhshlqnghqrdrgldhlW
+qwGDMqMFWbFbqbDwMgqgnjfnffffcTTjNnpTfBncZZ
+lSdclSltlzPsJlhNNfTQPTmQhpPh
+LtllsscLLLvvJlSzWGqwrDGqvbqMwMGb
+bnfvnnQsVTdHQDmdNN
+fwlttwrfSfLwdGZGmGND
+qlPrjjplfSpjSltfttBBsvgzgbgnggBqWVvC
+HHrBSmBqBHdHCFcQsc
+WqtMDDnMMZhMhcsQVM
+bqtbGDLLTTnRPwvGgBNmNrwvjm
+RwWzWFwBcdSdMgJW
+mrTjVQDQthQvjrvTmggFbbdgSJcJDFgSdg
+phhFtvjNvFvTTvmTHZzlGlzZRZLBlzRp
+cHlZmZmJSHZcTVGmvZVcGVHlNtbDNbtWFWdtlbCWbWtQDFdr
+pwfwgRhngPjjtdWdNtFrdFwT
+RTgMpfhBcMJGHqcz
+dmCbpCLQVFmCRddCTFLCgZtWPNBhSNNwZWgWZvSwhN
+rDzGDjJHhhwzThBS
+rJrclsjjsJMJnJMLnbQQQFmRTqLVRT
+TgFTGPtrWHzgCJDz
+fQbfLwbbFbWjHJHWjd
+LvQvwVfQvQhLLLLsmMBfLfBhqchtGFSNSFNqrSqPcqSGttSN
+MsMmFgTVMMgMdFVMhdzWqCCBCWjWqBWqhzzL
+nHfZDlbvcrDpcpcfDJbNJqGLbCjBmjLzJC
+RnDZHwmmTwVMTsMS
+NpdpdnjNCRjBnHRPpBDnhSdSwFFLFdScFFWcFWLd
+stqMrMZtsQMJmMqvrtqMbstQVchPFWgFVVFVwfWJcSSWVSSV
+MQrZzbvMrrrZZtZmstMtMsDRRjPHCGTjBnzpnDHTCGjG
+ClGGvDMGMNhNSmFVPbpgFgmFgZPb
+WhTTLWsBBWTcrPpggtQpsQFpVb
+fBRTqWLjTrzDNhMvCSGDzl
+jbzjttVzpbWzWVbTtzWzVwPbPPcwDDccccFNFLMFsm
+rlghJZHmCHvHJvRLSNLhhhccNPwcMP
+QffmBZRBGtVTBdTG
+bDRqHwwRpNPnbppn
+FqrlQSQJSVsQrSCmpdPNpcNCcP
+jFZjrssjBhrZVhJLLGHfMHfwtqRjMqRTvD
+SMMCTBzFfSRhTThCSMRSzzHnJgqGDHQgGVDnqrqnqqnqcQ
+ljvjpWPbrWWtrbmDVDlmnDnqVmgJ
+bNjsNPrNPtswfZzfTSTBwhSM
+hNMNdssdMqdTQchqgNZzHtwmwGHHzmQZGHDH
+JrbJvJrvLrPjrPCVCjRBLPbzfRFZmzwHgFHmGHmwFwzFZR
+rpbrvVjPCBbCJrCSLSPsTlphNncMglcNTMWMql
+fGWGHbrllCCWWllFNPQSZvdPSvdZTffZ
+tqssVjJMJWzWVvSvWS
+qtwMwDWjnRRwssWjngwjjnhhDcCLhhCFHlcmcbCHFmDC
+rFTdFjdRDTTlDWCqvhwLhwZdLS
+QzfJfnfsbsJHMnNmHhVpCZwSQSWqSqVQhS
+nJnczsHzNMmBJnbnbNwnfzJfcDTltllRTgPlFlgPrTDjPRGl
+ZLCGDvvJlvGChSPZWPSsZWdRRN
+rQccBwcccnHmQggnVLPLWpgVWPpWzSRs
+fmwTfTHnMBTfJDbfftJLvhlL