summaryrefslogtreecommitdiff
path: root/03
diff options
context:
space:
mode:
authorAlex Pickering <alex@cogarr.net>2025-02-07 12:49:48 -0600
committerAlex Pickering <alex@cogarr.net>2025-02-07 12:49:48 -0600
commit3555be54c2abb8d5ece008a60dbdfbde0ffbddd7 (patch)
tree278876284d07118ecdea5c48cb6453f3122887f0 /03
downloadadvent_of_code_2022-3555be54c2abb8d5ece008a60dbdfbde0ffbddd7.tar.gz
advent_of_code_2022-3555be54c2abb8d5ece008a60dbdfbde0ffbddd7.tar.bz2
advent_of_code_2022-3555be54c2abb8d5ece008a60dbdfbde0ffbddd7.zip
inital commitHEADmaster
Diffstat (limited to '03')
-rw-r--r--03/1.lua26
-rw-r--r--03/2.lua33
-rw-r--r--03/example.txt6
-rwxr-xr-x03/ext.lua62
-rw-r--r--03/input.txt300
5 files changed, 427 insertions, 0 deletions
diff --git a/03/1.lua b/03/1.lua
new file mode 100644
index 0000000..b9a97a3
--- /dev/null
+++ b/03/1.lua
@@ -0,0 +1,26 @@
+#!/usr/bin/env lua
+require("ext")
+local sacks = {}
+local common = {}
+for line in io.lines() do
+ local compart_1 = {}
+ for i = 1,(#line/2) do
+ compart_1[line:sub(i,i)] = true
+ end
+ for i = (#line/2+1), #line do
+ local sb = line:sub(i,i)
+ if compart_1[sb] then
+ table.insert(common,sb)
+ break
+ end
+ end
+end
+local sum = 0
+for _, p in pairs(common) do
+ if p >= 'a' and p <= 'z' then
+ sum = sum + (p:byte() - ('a'):byte() + 1)
+ elseif p >= 'A' and p <= 'Z' then
+ sum = sum + (p:byte() - ('A'):byte() + 1) + 26
+ end
+end
+print(sum)
diff --git a/03/2.lua b/03/2.lua
new file mode 100644
index 0000000..8c2d155
--- /dev/null
+++ b/03/2.lua
@@ -0,0 +1,33 @@
+#!/usr/bin/env lua
+require("ext")
+local items = {}
+for start, finish in pairs({a = 'z', A = 'Z'}) do
+ for k = start:byte(), finish:byte() do
+ items[string.char(k)] = true
+ end
+end
+
+local groups = {}
+for line in io.lines() do
+ local expanded = {}
+ line:gsub("(%w)",function(w) expanded[w] = true end)
+ table.insert(groups,expanded)
+end
+local common = {}
+for i = 1,#groups,3 do
+ for item, _ in pairs(items) do
+ if groups[i][item] and groups[i + 1][item] and groups[i + 2][item] then
+ table.insert(common, item)
+ break
+ end
+ end
+end
+local sum = 0
+for _, p in pairs(common) do
+ if p >= 'a' and p <= 'z' then
+ sum = sum + (p:byte() - ('a'):byte() + 1)
+ elseif p >= 'A' and p <= 'Z' then
+ sum = sum + (p:byte() - ('A'):byte() + 1) + 26
+ end
+end
+print(sum)
diff --git a/03/example.txt b/03/example.txt
new file mode 100644
index 0000000..f17e726
--- /dev/null
+++ b/03/example.txt
@@ -0,0 +1,6 @@
+vJrwpWtwJgWrhcsFMMfFFhFp
+jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
+PmmdzqPrVvPwwTWBwg
+wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
+ttgJtRGJQctTZtZT
+CrZsJsPPZsGzwwsLwLmpwMDw
diff --git a/03/ext.lua b/03/ext.lua
new file mode 100755
index 0000000..c1eb1cc
--- /dev/null
+++ b/03/ext.lua
@@ -0,0 +1,62 @@
+-- Override tostring to display more info about the table
+local old_tostring = tostring
+local numtabs = 0
+local printed_tables = {}
+
+local function tostring_helper(el)
+ assert(type(el) == "table", "Tried to call helper with something that was not a table, it was a " .. type(el))
+ local mt = getmetatable(el)
+ if mt and mt.__tostring then
+ return mt.__tostring(el)
+ elseif printed_tables[el] == true then
+ return old_tostring(el)
+ else
+ printed_tables[el] = true
+ numtabs = numtabs + 1
+ local strbuilder = setmetatable({"{"},{__index = table})
+ for k,v in pairs(el) do
+ local key,value
+ if type(k) == "table" then
+ key = tostring_helper(k)
+ else
+ key = old_tostring(k)
+ end
+ if type(v) == "table" then
+ value = tostring_helper(v)
+ else
+ value = old_tostring(v)
+ end
+ strbuilder:insert(string.format("%s%s : %s", string.rep("\t",numtabs), key, value))
+ end
+ strbuilder:insert(string.rep("\t",numtabs - 1) .. "}")
+ numtabs = numtabs - 1
+ return strbuilder:concat("\n")
+ end
+
+end
+function tostring(el)
+ printed_tables = {}
+ if type(el) == "table" then
+ return tostring_helper(el)
+ end
+ return old_tostring(el)
+end
+
+-- Functions to save my hands
+function printf(fmt, ...)
+ print(string.format(fmt,...))
+end
+function errorf(fmt, ...)
+ --Our error isn't actually in this function, it's 1 above us (1) = 2
+ error(string.format(fmt,...),2)
+end
+function assertf(bool, fmt, ...)
+ assert(type(fmt) == "string", "Assertf arg #2 was \"" .. type(fmt) .. "\", expected string")
+ if not bool then
+ args = {fmt}
+ for k,v in ipairs({...}) do
+ table.insert(args,tostring(v))
+ end
+ error(string.format(unpack(args)),2)
+ end
+end
diff --git a/03/input.txt b/03/input.txt
new file mode 100644
index 0000000..cb4dee4
--- /dev/null
+++ b/03/input.txt
@@ -0,0 +1,300 @@
+rNZNWvMZZmDDmwqNdZrWTqhJMhhgzggBhzBJBchQzzJJ
+pHlSVbVbFHgHBzzhQHqg
+nVsqGpbbtDtTNmrmfZ
+zrBMnbzBchshsttfbMRBgmJggmmCHGgDhDgNDGHL
+VddZqQqdvSQMJHJGdCDCDDmH
+pZWWllPQlPZQvZvwpSVlqlvtfswMRzBbntzRbzbfstsRzF
+NnjjRlnWNSWWbGwccbcchfPfTvfjfTBBpvmdMjTfvB
+FVzJtDDJDqTMlmlM
+gVQZlFLlzHhLGShGww
+rPZtvtFrFPgWjQvCBlcqMzlqQC
+QGVDJJnLnVTCJBczqqTM
+fNSSnmLDSVLhhhSNSLhGSGfVPjrFHwmQwtwWFRWRjWPHrwgt
+SvmlrVrCvmNhSSVZVCrsgqPfbwGFwwwsflbbGb
+QHffdnHDDQdMGbgqPwztdPds
+DjBjWHfQDfTQWTBfpMBQLVmmmcCCcVhCBBBhhCmC
+trLHFFQHTLHJQrflfCnLLHrRfRRPqSRPbPbbsRGqqGqhjj
+mcMpNWVVNmNVsSbSJPcGhPRR
+NpzNgwzZDVNZVWNpHJQLQHtQrZQHrBCl
+JVCMfgJVrJtMBhhrfVVfhVsjvpFGFgjSSgFdSGGqjvjvqF
+mHllHlHpmWlDSFqbdSTS
+nmZRLzQnWVpctMVpQs
+BrvRzWBPWbRwGRjbbRGrtrfqjCJCjCJgJsZJscFCZcJC
+MnnnVMVhTMQhsccVfwqFJgqf
+mMShHHppQmHrrBzwtSbWwR
+pWWGJMJJwlnZSqjWmvSWZC
+gtHrLttDtgFjjqRZZCrjpp
+bFtbTpHFHLbfLFbHVttccttddJGQdJzTwdTzJlMnMBwwJJ
+JhqHFhVMzJPQcdcVncdc
+NhgfwSjwCWwltSfnrnRWZdpcPrrRnp
+NNhlltBjssNBgwLFFvDmDqLzHqBB
+LnFrnddfrLnMFjWzpFhcWpjpFc
+ntCwgtNggCqCgCqqPPltvcjjhvmWhmvDzTzDzD
+lqlVQgVCSPVllVQSNGMHHrdQsHrJJBnMHHJf
+ZGZcRZNWpcHZhJfbbNblrfrgllNr
+stBMtzCCsHMfFQjfSSPgtt
+qmszdsCzMncdGwdWZGvH
+PccqPqbhvSvvvtWNjTtWsWcscp
+gRwdDzHJQgHzfdRhgHRffzwsTTjTTCjNjssCpmWWDjtCLW
+zdRMwdRHhGJwgHlnGGSFvvSrnSrr
+rRpMJtPwrcCTNNQNMZQm
+mDWdWVddbbbmBflFhvTHjjQjfZTgZgLLfH
+bhBbFFnDVhdddFBhdmpJRrzStJmwnPzcsJ
+RjlpRRWzzRGRmGzlCRRlQjCgtvTJTtJrTPttrWTwhFvvVJFT
+bSBdLLqbcqcLndLHZNqcZdBDPrVTDDTJSFrJJvVthTwwDS
+cqVsnBfHffVdqnZccGMmCsGzQmjsjlljgz
+wMzJhLtwbnMWtHcFCCFqFNNbgq
+fMlMfjrRRmdmGCGVVCHcVqcVTC
+MmRRRlvmQWzpvnZpwJ
+gRmgMRMmRwzzmwHbwcTNqPDVBbPTZVqPNZ
+fWHphpGFpfJrrhPsNTNZVsNVhT
+WGfJdvltJJfHrJpRgvMRMSwRznwMmw
+htJFGsGspCppCFCGthCdpmJmgmWZfqqzWzlWcfgZHgzHlg
+nwVMjVcVcWlbnBlfWB
+wcNDTvPPDMFJLLppDGDD
+hjCBgPbvMvmQDzlWnWjm
+HrHtgZRRRNwczDWwwDzsQQWW
+LpTqNtFtLFqHLHRrqgFHffVVBChvhhVPBCPhbPbp
+CwpbCwjGqSjVllpGCllBfhZZRDPNcPPNvLLLDSDN
+WshFFWsgTHsdMzQvPczLfLZDZRcLfR
+rWsJQTMhWWHdsQTgsFJgllClVpqVbqnGblCppCVr
+gRBSGcBDBSJSvPQwrTFLjggQTQ
+HMMnHHHZfFVFrrMT
+HhlhppCNcJzCTtBT
+CCffCCmRLTsQRPHQQMPF
+dWdbgcDSNclbbdwdSqHsvHPQPTPJplPMFMGJ
+DWbDNcqZDSWSccNTVBCzVVfmBVZnVz
+BnsrrvZwBsBSJrrrqSTgJQjCbCjgbCHDJgJFjQ
+hLmGlnLmGWcjGDgfFFjQdF
+hhWPmhPtczWpNRmppzRhLchMsnwZvTMZvVSwwrsNwSsBvr
+tDCCltNVttJhNGlMPSWdqBqSjM
+RFQcpcRTpFcnFzdLmLSWjMSSBLSQ
+jwzzczpFbwnHcDCsthDJJsNbst
+dLRWTHSwTmTwTcTWvQNVVQCvVvNFps
+GnBPtBMJBPrjGGJMjrlqChNpNlsnhVFhQsVQ
+JtMtGJfrJgDJjPjRTZLdFcRZRmwSDH
+VSccPJSBLgZPDLDQ
+zfpLMmLsHQGqgQHnDD
+zdLLMssmrdfhddcVdJtScB
+VvpTVQHSqSHSHqqHJVmRJVHpgDBwDgjcDDDgZjBZBjwBZbRw
+PCdssGlstdWslFPfNPrtClGjwBgBJgJNwcjBjBgZwwMBJD
+tlJldhdhdsdhTqSTqVQqQq
+VGqTcTqbpPwrjfbl
+BvntnZNNsLZvLszSnCsvJthlfjTrZwlrjrpPlwlhfwrl
+QBtNtJLvTsFdQcqWmQRR
+fjcjhmjBvcvcSvcZ
+HMwZtRQQpGGRgzMvLnWWnbLlSntlbv
+JQPzzJHqQRqGMMQwHwzDZZhmmPfjDjmjsCZhPj
+cBlZZMfBrCBMwBMCvQzTwFbQzPnbwjTbTg
+WtzpVDzmtthzGFQTbTThnnTQQg
+sGWstpHdpGDmdHdmGmmmJNstRMrCcBSfBSzNBNRrSRNMcMMv
+mMPDVBZZLSmRdcFpjr
+fggGGfbfgQStjjsdbtdt
+gNqQgCQlNCCJgJHvnvnHMjPHjv
+bLsRQrQsGQbLrbRZMGgbJJBJFtlFFngJphhcfBBq
+jjdHCCjfVNmmmNDFcBcpBthcplFDFq
+jmvvmWVjjHTCVvNjSbQGLrRzwMWsMRwfGG
+sJNCsCFFCNPhCzlrSvRrvwhRjj
+MMGMTwpMHGzrGczzlG
+qVmwgHtDtmCdWCsNFmNJ
+fmhWhjVjNpqRRJjwRw
+gnGQGDDCgSsCvPlvPgnPgnPtwqbpHRHqHdJpzpQJJJRJRF
+wgPGsDGPsZgGgBmBWNZNfLWWrZ
+WdsCVtjWWWHRRqLLHncC
+fbSpMSPSZHRRcqlpRc
+cGMmJmfMPPPccZMNQPWvjTtdTjvgmdtTsggw
+tPBQhHWBtQHgWQCtLwddcGnfpGpwwnbhVb
+vqQzTNJJJTvRrTNFJsZrrzFlbbfcnVbbcwmGGGpVzmddcdfd
+NSSqJvFFFFFQjQCjQDSDPD
+rQZnVVrZmZmgSWqHrSzHPC
+LGFLwcMBcllBjFNwGjltggSqSWCCzvNgSqSHtt
+wdhqqGBwwqGMcDhcwdFFbbJppZbssbfZQsQsdVQm
+lqBZlsjVTbVqmFrSnTFSvwncPP
+zQztHfZQtWLJzPFnnQScFcFrvS
+ftHJWHhfttHWffhtgLNfZDWbdqBqjbVssBDCqCdCsmClGG
+MlbWFTJQFbFFzRdNjNtjdtBT
+srwnrsLVHzQPQsjjSQ
+gLpnwgnwnHCvcHHcvwgCvGFFhWGmFmqMMbQFQFFhlGmJ
+qqNcJgJccdqhsqgsggdgqgcrtfNWNZzVbvVFzttMfzbVMZ
+GLlpPpCpwPLDGvrFVWrWWbZt
+DlRCDDLSjTjDjSRSjPClwnwSHHHQmmQvTJcQgvddHsqdcgmB
+jmRjRbRQLLZbPnbrcTTHHHNn
+MfhhmmwtvStrpnJJHc
+fgqlvfhvFzMwqfvMfFWlmMvLZsdQsZVdCdLZdGQjRzdQjD
+lTPcDlVdTlVVMSDfTJccVzdlmMgGBmppgBmnHGHqHqQqqQMH
+ZRjWFPsLNLLrPhWNtnBBvnpGpHGpQmHnmR
+CtwssCNLrsZWjrjcbfPzwJJJffDbTl
+cjMvvqpJFqhShNCRQR
+ldtDgQZDPdzztLZgPTtfbnStfBSbNNSbnbhhSS
+TDsrzsZZZTFHmVHjcsQW
+BQmQchrmBddcmZZdpSgrpswWWswVsnnnDJVnnZFnGN
+TfStMPLTHvbvRVGnHGsNnJWFNV
+qtvMRMMPbbPMLqRPvRTRzMjSSmprpQdBchlmmgldgjzm
+nRRnvNPhrbZDLjvS
+HCszMwcHHcLDrbQDWr
+ptszqwdMbnnhPBqN
+QbzhhfbFhBbpbzwwLjLJjSjltL
+mNndGrSStHJTJLln
+rDMMNVWdVpCbSbSp
+tDTSTSTTTTJDwqjWqBWttdjg
+nNPmVfnGfPNVLmNzfnzPVFMjdpBwWZwZHwBLBqgjqpWH
+dfGPfVQGVPhGzlmnzSvsSTDJhTbTTrrSRD
+ZfgtZBptBfRQNQggjjrjjwmwsQJPzrwm
+TwTGGwTwzzsJzTsH
+lFvwqFLhFMnqcLlVLMLfptNWppppDBDbDfbFgW
+mjftBfVPjttmjcSjcPttzJlvnrwvTRrTnvwvlRrHHTHRTR
+WZDWDNLFWbZbcMDWGZDbNdMCRsnTdTvdnqrHCTrvsRRvwC
+DQFZLNNgtBJQcBzJ
+HbZQZFVbQVpQplQZGbGchDffltfLtmdgDjggTmtm
+zWzRCdnCRBRdJrzDjLhDthjLJTTtjq
+CPPnwSrRdRSzCGMcZZZMwFwMZF
+WBQqNQnQllwnWQlvBBMlljHTqqFdGfmTdFfcFTFFcqmP
+rsRRVrZhrzbtpZRRhFDmPvfFFrfTdFHGvc
+VtSCtSLbtsZVtttthCbJSWSlJlwJQggWWglvwW
+QfFLWCvRfSLFCtvtFhNcqDDcGVbhGcqh
+ZVgrdZZPPZZzPwdjzZhmccsqJGqDdsDDNddD
+pzzwpgZzZZTznZnjZZzPVRLQLlvfSlQRSpWlCvtSQv
+RtcHhRMcrHhBrrTNDVBNLqLqQqfBPm
+wCbWzWbvdWCjbWppmtmNmqmLLsfsNV
+lwjWdbztgHTgggnnnR
+flBbzbMfbrTlrMvBCcwPggdmcdmg
+VDVVRFZRZSFFhQLSGFQhjSVZCgpvPwLCzpdWWzccwdvvvwcC
+hDHRGQVHHQVRZSQGbqqfNTlbHzrbbsqb
+MTFdTsZpPTcMpFCPdCBmMBmRfRGBmQgQRRgt
+vbDSwvhzznnbbhDWnvSzRBgQQLgLQltqtqlmwfGB
+jVjhfSnNDNbzzWzjWSjrCFNpcHdpTTJddJFpsJcc
+ZrrZPHfChPdDPVVdDq
+vFmsbTsmSbbBJssmSBvTmmnTrnrwlWqwVlLrVTLLTWqL
+JrFbpsvFBMBmzBzFStcRhjZjfCCpZNCtct
+TGgRrTggwwtvtQtdCdQNqN
+sJHZJVZHDBpFBZBBNzNdhzdpSzddvqhN
+VZcvFsJVFvsmvssbcnrwbrnGMbMlRn
+SdcdWzMJdSMWMddZJdVcmBmwrwqrrnVnVNtr
+mlQHCfgbjsfQTbfCBNtVhVnntVBnVh
+HLDslDDmblgHfvLHPJFSZPpDFpFFpdPS
+qNqPNJvcSzGGPQnGQp
+bWhbgsshZWBhltthhbWtCsZNjrzpnQnnznnjtQFrjGjVFGnn
+bRDNddhNdDsZdNChmvDmmwqqvLqwSJDq
+TnSfPnCSmnSgpSTmfLzfMFLWFJJLWWsBsr
+jdQjcdqDVVwDcPsPzMRJMLqPqR
+PGhGchjhtZlTGTHCCb
+ZZRrJJqSqJwNFFphsGsLPJ
+blcMCflvTTPFFNpVvsFv
+CcTlltTmtmMdmCmnlllBDDSDQSwSjRDQSdswjR
+MCCPNsnQFWbvvTPF
+CcCVJJhjVJZRtcCclDDlbcbTcGFFDz
+HpjtVwVZfpjJVhZgCVtLmrBwdMrLsNNsMmdLqB
+TJTDTnrFzzdWgWGJSSMJwg
+LhPVttjtLmsPqqqVsVpsjLlgWlwHvGnlHWlgHlGgwvlP
+mQshLhmsnsqZcqhZqpshsLVpNTNbBfzTRBQdFRzNNFBTdbzR
+ZGqMLGqvJsJsMJmd
+PDVQPfPcrrcFrrzrTdgCjSSCzgszmlJjBj
+PfRtVfttVcWtVJrfbGqvwqLpRRwvpppH
+HmLmMSnnWnrTrnvpqFCHVGfzVFVHQj
+ttsstRhhcNwbswNtdwsdNPFfjzQppQPjfGGfQVPCpR
+bbsDNtDcbhstsSZLDmSSgCmnSS
+tfwBBLcJVrDnqvLv
+zmWWJRZhWRRRGRNdgSZGgWTvpnjvrDqvpHjjzrpnrPDnHj
+NdJmSGZWRhRNsghWTJmdGfQCtllCcFMwffBftsfMQc
+lTLgTghpGZJDBrnGWnnm
+VlRwlHttwqmHHbDWHJ
+twldzCvsRdsFFtRtSczTjSgMcfSpSzTM
+pBpMBTcSlNtMcTfFCmbPDzCDLb
+JgrjjJqhGZQrQrZhnJGDDCZfvPDdDzFFdzfmZL
+QHhqqnrVJJPhHrnGQgwMNwMMctcWRWSBMNtNsW
+FJrlhpcfDCcFWpNpwWwjNQwz
+RTTvPdbjWzMbnNNM
+GRZTGggGgtvjGcqrBcttcDlFhr
+pMRVdVbbMMMSdWWqHpCTvTjnBBBFFGGB
+smNfZgcsNrcmzggZszsgRnPGFHjBPTBTjGjPTBNj
+RmwgsmgfrzzsZtfgZLQQSVWlwbdMhlwdqQ
+mRRjPmLrrSmzSczSzPgVZFpTCpZCMWrZQMQrZJZT
+BvdbHNdnJtvBDbqqdBlvwvqpDQMpZQFMCsQCspZTMMCZCF
+nBlfbfbndJBHPfLRfmhhhhPL
+ScJDFBNLLbVRqVfZ
+rWrgmdMgnnBhBtnntf
+CwBWWMgCwddCgwsQjsrvNvlTJzSNHwNTHFJHzS
+vnddCrNpCgtjLdSdgCgCCvLnWqDhWBQhHqQHDqBhQHDHNNDl
+wPTVfVTJmZGJVJGffZBwHMWlWlHlWtbQDqbl
+mGsJVVJsTVTTmtJVzzTJjdSjjprzCvpSLSCjdnLg
+zLNggsVHmNNsssLmwzLQZLwDRvGQBqGGDDBBvvDBDqPhRG
+WrCjbtJdbFhBRglGgjqv
+JWCJcWcSdWcctnJCcJJJbcbmzwwznmgLzNzmLHmHZMwsZL
+JRRDNNhhszMTzNMwCG
+MnHPqmgmHjPnnvjqdmjFLQwLwTLwzTwTdGLCzS
+BnPPZqmcfqgqnnZmBmqjqhfWVJlRMlhWlRDlVsssbh
+nmTLTqsvqnwqsvwDPnLHdNVrMMHHCBlmVdmGNV
+RgRpcJhQRfQZcJbWhQpBHCjVCdjCVGdddMllHp
+fczbZhzbtcZfgRRBcWSPPwFsLSDswSwTsSzw
+rbFpzFCVBrrBZCjbCzHHBVdJllGDLsLrDtsswswstGJs
+QNhNNnNnnQhNWSnRhnJtdpJpJtMDGsGLLtsQ
+ScmRvNRNnWWvNvNvfpTccjVZbqgZgVzqHjCjTVTVVq
+BTppwCwBpwwBqnjlHcLBTHnbbSbDthsSSJgsnDDRgJRD
+FVGzzvrdMGSSsdtZtZgd
+QvQtvtGFlBLLjLQL
+gsWWsNMjwgPMPWnMjShHHZSZbmZbbmTSnb
+rlCvVQrCfqffpVjQRqCCvDDTTTmmZhZTmZhThFmhhZZhqb
+CDDVJpVfrJJVJLMNzMwWwLwj
+nHrcsZrssPcBPtQJLJtQQCZQpV
+GFWzNzNFdNbTMMqbGTqTqzqqdLCpfDQCtRVVCLtdCfQsdCCt
+TlNqGTWFNmMMszhGsmFTWGFzwHnvSjgPgvgSjllBvBnvwPBB
+mpMggjgMlmtjtGMwZpcSscBlcsSblhsfSdfs
+zzPVDRrLrCTQNCzNRTVFNLhBhBSqdQbcfSsJBJdbjJfB
+RPTRPTVNTFzVrHVDCrTHmHtwMvwWMmtwmGjWgvGv
+rLMcvfHVfMgLFvfNnBBzwRbBwnrGNs
+dttJjJCtdjmwzwBCRRCqcs
+TddDQDJDtQJtcJFpPQHPQMvfQlFL
+LQSqqpqTCSJcsDcqQMMhnnjMjppZhwHZbZ
+NRtvtmgmvdBffgtVCBWVRgFbPzHbMHbnwwjMPZfHbPjzPP
+RNtvCvNdgtNNmldgvCFRNVLsQLqJcQGJJrccGSlDLDLr
+GdwwqqqwGVtjdPvTCplbHTPbPzPTpp
+RpLmLLpFfNsgTzclhzClThgH
+ZFsWZLFZJsNsnWsnRsRfnfJQGBttjdGJjBvvwjdpjjttvj
+tfPzzLrrdrQlTlvn
+qJRBhNhNGVRBFRTlnJvCmvmJPCCl
+VVPDNchNMVFGRMFcRVBjsZZcttSLSZzzStcWtZ
+pTrwTrnjtttjprTSTNTQfcjcgPsPZfPgjdgdsQ
+mCmCzvzhmJDHzJDbhFCDPsgddcsfcdsbdgVRpdVs
+zqJzFCDhmqvGhMmCvmGhMCGJnSlnllSBLllLMtNpWtpNBnlt
+JBhJrFLhGrnJZrlcbffndnggfggf
+jqmWMGGSsqCsmpjmsDQzlcHgbtdzjjlVfctjHV
+GWSmSCspCsMSpRmSmqMMCBvFLJLhTTwFhRFLLBTwrv
+BCdWccqcqpQqrsNgGsWMgfNW
+lFttLzzLwnfsLrsNsNLG
+zjNlznlwvRPZnltwvPFnZRCbmjCcqjpcpQcqVVdbdVBm
+CwTbbCGNFHtHwwjSjJpzjLMdMMzT
+rscqqVvWgWrZMjrlmSzzmLrM
+WPqqZnPqgncnBQQVRbCDwRHGSFHPwRNw
+ZQnZwWjFvdsHwBJltfmfSlsqlJ
+gPprhMDTpMpPMVNqNRqNlJhltJdJ
+pLGCcCrgppCrVcMpdzjvzvjLwQQzFjwzHF
+NmmmvfqcvmLSQhCLvtvL
+TVlWTZVJZJsFbwWbQQhtQgLFCnSgghLt
+hZJTJZhwZlRJrJWHVlblMBffmqfdNMjdGdBBqqcH
+GJJfLfptGqqqnsVqVVjjDnNc
+mZPSvPmBCdmwdCLDshSbRnnDDhRL
+gvBrBvPBPPZCTLZmwmrgQdwfTJMHGzHfWffJzFzttHWFzW
+sBMvmzWzmFmNWJfffZNLfbqZbtZq
+jRQVRnhhppnVhjgnDLttLqbLqLQfDLss
+jRRgpGVGhwhnspgpRppwSnBvMMcWvGczGJJHdmHJmJFF
+VCLHFwHMhLghHHWhFFgWNMMVzmdmbvWdJqBPJPPBppqmBdzm
+SRTsjGZTsZZnSnGZGqdBmrqPvmqqqsPpmv
+GvQSGtZSQllVhtLMcLLNMH
+GsNdWpdVWGSHjFCWCqFFgqngvW
+mRQTcrLRmZTPRLPZfqqqHbDDDgFvFnvqzQ
+hfZHrwwmcZRwlLfwlmrRjMJJsVjslVNBGNjpVBBG
+pllpztRqBBvvGPpG
+QQhhZQbVcZQTPMWWGbvvbMHM
+cwgCQCLZChQwwLZVzCrzzqNCzrDqdFPF
+bgcLPvvpcbdsbpSsHRTCqsRfWfsHRm
+lZlQtthrnlVMmTHqqqqHSChB
+rDtlzttnlSNrMtQjZVrcgGDLLddcdcpPgPGJJd
+jvGbvLLQDSGlRmmSLjlDmRQggFBrMCwWdsBFWBFjdrrWrr
+PpTfcPZpNTVNpHzTzzzpPJhBcwrrhFsrMdFcMCBFhgMF
+JTTqdtfzfzJpqffNdTTHGtQRnmDQGGLQQlQRbblD
+CQQCshCMwgQhMdjWJFBPpbjgmmWj
+SNNvcGNSZSTDtGDcczJJBmzbjBJjmppbppms
+cDtfDVNTGGGNNrwLLwHdqLhfLs
+ngghZCChzhNjjNbbJfdh
+slPPRLlBBlVRMvRllLLHvcpcdFfJjvdFpfHfcZ
+RDZPZBLmPVWDVrQtnzSTmgTwmTSg