summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Grois <andi@grois.info>2022-12-06 22:04:30 +0100
committerAndreas Grois <andi@grois.info>2022-12-06 22:04:30 +0100
commitc79cf86f6382d5924963866c87438412fdd8c769 (patch)
tree8a4fe0e85d3868b6bd5c31553f8775da0d0c8ab5
parent15392a2813dd0902e9276deecbea9004049c0268 (diff)
Day 3
-rw-r--r--Day3/CHANGELOG.md5
-rw-r--r--Day3/Day3.cabal34
-rw-r--r--Day3/app/Main.hs94
-rw-r--r--Day3/input300
4 files changed, 433 insertions, 0 deletions
diff --git a/Day3/CHANGELOG.md b/Day3/CHANGELOG.md
new file mode 100644
index 0000000..af6b183
--- /dev/null
+++ b/Day3/CHANGELOG.md
@@ -0,0 +1,5 @@
+# Revision history for Day3
+
+## 0.1.0.0 -- YYYY-mm-dd
+
+* First version. Released on an unsuspecting world.
diff --git a/Day3/Day3.cabal b/Day3/Day3.cabal
new file mode 100644
index 0000000..fca66ee
--- /dev/null
+++ b/Day3/Day3.cabal
@@ -0,0 +1,34 @@
+cabal-version: 2.4
+name: Day3
+version: 0.1.0.0
+
+-- A short (one-line) description of the package.
+-- synopsis:
+
+-- A longer description of the package.
+-- description:
+
+-- A URL where users can report bugs.
+-- bug-reports:
+
+-- The license under which the package is released.
+-- license:
+author: Andreas Grois
+maintainer: andi@grois.info
+
+-- A copyright notice.
+-- copyright:
+-- category:
+extra-source-files: CHANGELOG.md
+
+executable Day3
+ main-is: Main.hs
+
+ -- Modules included in this executable, other than Main.
+ -- other-modules:
+
+ -- LANGUAGE extensions used by modules in this package.
+ -- other-extensions:
+ build-depends: base ^>=4.16.3.0
+ hs-source-dirs: app
+ default-language: Haskell2010
diff --git a/Day3/app/Main.hs b/Day3/app/Main.hs
new file mode 100644
index 0000000..2399b86
--- /dev/null
+++ b/Day3/app/Main.hs
@@ -0,0 +1,94 @@
+module Main (main) where
+
+import System.Environment
+
+main :: IO ()
+main = getArgs >>= readFile . head >>= print . solveDay3
+
+solveDay3 :: String -> (Integer, Integer)
+solveDay3 x = (solveDay3Part1 x, solveDay3Part2 x)
+
+solveDay3Part1 :: String -> Integer
+solveDay3Part1 = sum . map getLinePriority . lines
+
+getLinePriority :: String -> Integer
+getLinePriority = getCharPriority . findCharacterInFirstAndSecondHalf
+
+getCharPriority :: Maybe Char -> Integer
+getCharPriority (Just 'a') = 01
+getCharPriority (Just 'b') = 02
+getCharPriority (Just 'c') = 03
+getCharPriority (Just 'd') = 04
+getCharPriority (Just 'e') = 05
+getCharPriority (Just 'f') = 06
+getCharPriority (Just 'g') = 07
+getCharPriority (Just 'h') = 08
+getCharPriority (Just 'i') = 09
+getCharPriority (Just 'j') = 10
+getCharPriority (Just 'k') = 11
+getCharPriority (Just 'l') = 12
+getCharPriority (Just 'm') = 13
+getCharPriority (Just 'n') = 14
+getCharPriority (Just 'o') = 15
+getCharPriority (Just 'p') = 16
+getCharPriority (Just 'q') = 17
+getCharPriority (Just 'r') = 18
+getCharPriority (Just 's') = 19
+getCharPriority (Just 't') = 20
+getCharPriority (Just 'u') = 21
+getCharPriority (Just 'v') = 22
+getCharPriority (Just 'w') = 23
+getCharPriority (Just 'x') = 24
+getCharPriority (Just 'y') = 25
+getCharPriority (Just 'z') = 26
+getCharPriority (Just 'A') = 27
+getCharPriority (Just 'B') = 28
+getCharPriority (Just 'C') = 29
+getCharPriority (Just 'D') = 30
+getCharPriority (Just 'E') = 31
+getCharPriority (Just 'F') = 32
+getCharPriority (Just 'G') = 33
+getCharPriority (Just 'H') = 34
+getCharPriority (Just 'I') = 35
+getCharPriority (Just 'J') = 36
+getCharPriority (Just 'K') = 37
+getCharPriority (Just 'L') = 38
+getCharPriority (Just 'M') = 39
+getCharPriority (Just 'N') = 40
+getCharPriority (Just 'O') = 41
+getCharPriority (Just 'P') = 42
+getCharPriority (Just 'Q') = 43
+getCharPriority (Just 'R') = 44
+getCharPriority (Just 'S') = 45
+getCharPriority (Just 'T') = 46
+getCharPriority (Just 'U') = 47
+getCharPriority (Just 'V') = 48
+getCharPriority (Just 'W') = 49
+getCharPriority (Just 'X') = 50
+getCharPriority (Just 'Y') = 51
+getCharPriority (Just 'Z') = 52
+getCharPriority _ = 0
+
+findCharacterInFirstAndSecondHalf :: String -> Maybe Char
+findCharacterInFirstAndSecondHalf x = findElementInBothLists (splitAt (length x `div` 2) x)
+
+findElementInBothLists :: (Eq a) => ([a],[a]) -> Maybe a
+findElementInBothLists (a:as,b) = if a `elem` b then Just a else findElementInBothLists (as,b)
+findElementInBothLists _ = Nothing
+
+-- Todo
+solveDay3Part2 :: String -> Integer
+solveDay3Part2 = sum . map getGroupPriority . elfGroups
+
+getGroupPriority :: (String, String, String) -> Integer
+getGroupPriority = getCharPriority . findElementInThreeLists
+
+findElementInThreeLists :: (Eq a) => ([a],[a],[a]) -> Maybe a
+findElementInThreeLists (a:as,b,c) = if a `elem` b && a `elem` c then Just a else findElementInThreeLists (as,b,c)
+
+elfGroups :: String -> [(String, String, String)]
+elfGroups = groupThree . lines
+
+groupThree :: [a] -> [(a,a,a)]
+groupThree (a:b:c:as) = (a,b,c) : groupThree as
+groupThree _ = [] \ No newline at end of file
diff --git a/Day3/input b/Day3/input
new file mode 100644
index 0000000..0761a34
--- /dev/null
+++ b/Day3/input
@@ -0,0 +1,300 @@
+WwcsbsWwspmFTGVV
+RHtMDHdSMnDBGMSDvnvDjtmpTpjTFggpmjmTFggTjmpP
+vtCSGRMBDzHddvBHBzRhrlcZhlLzWNlqblhzcr
+shhszHNHHZWqSzVNdClMjlFjBBbNTB
+tQQGmnrMnJnGfmvrRRPCjlbljFBdjFCjTjnP
+mRwtfGrMmJtwRDvQJQrJpMLSzVDHzhzHZqZzqSzcWVWH
+WsWWgrtgsrhTQtsFcWPcRMCCTvqvMvqNNqMMHlMq
+bBJrBGbzzLJznJrbSDGGJLqmlvqMqvlmLHRqRZZRNZ
+bzJfDGVSzVrJGwjVGPPpQthdPsPpjdphsc
+pJpCCBSWlczWWBWMHdMmMsFmpddrgF
+wfVqZZGVQvzsMqmMgHjm
+vDZGvPttQTVtGDQDDDGwbSCcSJSCJWTcRRSRczRJ
+HLVHsVWLwbWswbpWFWrrmThfTPNnhNSDDNhDfznTnhnS
+pBRcvGvvBtpGcqqQvgcphPfzfDGhzdzPDzDDhnhS
+ZQRvqBptjJgZCtJqqMMMLHWwMWZWHHFFHm
+PvPFPvLLLSvNFvQNWNPvrPLrZjwhMttTwtTtQZBwqjqtZqwM
+HJDDbHjgppzCDCmzpgzsGbCsTMZqZllqhJBhMTtVBBhMtMth
+zgGncmGGzHCnHDpDgDCGsmFLLPFjPRRWLRjdcjrcdRLd
+zHnWzntnBRWTSBzRBddpFvZVcHpLFvjvLppvHP
+MmmWmNGQhbCpZVLLbccvpj
+QDMCGrNWfwNznBJsJzDBdg
+tcRcZccZmdZJctRcjrlhNNDfrdNdSfNsNT
+QHQpBVvMpRMwgBgvnHRFlhrSsgNFThgTFFflNS
+vvHpVBBBGBppHvpLvHGbjmmtCqWLJJZRzZZZZb
+ZBtTDZRWsTsDZVWVZDmjpbLbpSSzmLpWrbrS
+MFNNFvvwFHwlhmNrCStLNtjzrb
+vwffwcHwflGqGflHJfDBBZtQVBgZQJtBBsnT
+pTJcmMJTspmpMZZJJZHCQQMzPBlQdWWWFzWP
+LDnwrdnDnqjfqgvfDjrfFlBBPFHFSHPQCBvQSSWB
+nLbjgLjdbrwVRcppsscJVRRR
+mHnfggmMtpHPPBCs
+PJjlQQRrJhJNPPTtBsCbCCTlpptd
+rSSDhNQwShRRjhmMPmzMDfPmfLzL
+HzLFBgrCthtFrrhFSCCCvBQNRVmJJJmnpnddmppddVtJ
+MPZsjDWPjZsVzNTzpVdRdZ
+qMfjWfwclsPsjwzqHgLFhwGFwHrFFrSC
+llllmSbhNmSbNzlPmRNCcgLLchHHpTGsCTQGpT
+dVjBrvBBVLJQsLpC
+frZBWBDMFndStFsSwzlPlq
+vmTVVtmJHwCwDllttTsrcPcMrfqPMMpjMq
+LQGBRgGGRNgGgBhgzHfpjPqsMjpLcLjrPLpq
+BdgzgSRGBnNHJtJlVStVmt
+FbDQsFjPVHFZFSbrVjSVvMJlGBJhDcqBBllJGccJnh
+RfTCTTpmppfgwCpwpLwRMnMGMlcPGqhddPcJnl
+zgLPLNCCpLggzmTzTWmVrjVvrNvjjjvbVHQZZH
+RBjjpwmRszBdvhLdSvpVpV
+GrbfbJWmQJGWrGZZQMbSLggfCgSHhCSgShghSC
+DWNDZQcrbWQrZJZGQQZPsztzBsPmBTzwcwRwjT
+rlvgglvZqbrbWbWWdvdmPHBBNMNJGqjGRRnHnPBJ
+cDFDcfcCDhLzsCfLDVpGPRJMPsRJMPNRnjHHGJ
+DCfMVDFVScVMVQlgmZgdmWQQmS
+nWTWWgwNgGDdBZBVcvDzzJccVlCzHD
+RLppMMLpRqfMtMjtMCHJFSpzHSvSpczJdl
+RdLRbQRjsRMrMRRMfbQLqPjbmnQgQWWwZmggnNTgnnWwhBhn
+TmzjMjrmjmjBmHLvGPpbvWGqJzJJ
+CfScwNDssDVCccdNVcNDQfbqJLqSLPpJpJJvJPpGTWJb
+nddCQTfQVVrHmjMnrMFM
+WHDnTwvwcwZmWwQTnBtgbVLLbgfSlTfrfb
+CPPGdJRzNhNpzPJtMgBLbgtlLLfLMz
+GJptpdFRhJwDmFHDjvnD
+PNcWDNnNDcLjDDcSRWtQFfzzzQgPgsssZtPZ
+MGhJRJGGrlpVGVHVCqqGqBQvzFzFfBvZvvtZtvFzvZvQ
+JmJplCrlMNdmjbNbWR
+pqpqFJPPSswJshNghg
+zTHHrrbLzDQHccfhqmDshgCwfmqm
+rtqqtTTHtzGLPWBdnGBSWGSS
+gmNvgVqjjqzfMRgrRtPcft
+WswSQwWWHGCsHQhlGGLLJRbLMRfRGcMb
+dQCRCWhhwCwFwQshhRTmmBmFjFTTVNpqTnTj
+FZvqSWqjjZvvrNSvbblcbslDppDHbcsS
+MmwLTwPmBwmLJJmLlWzWnDllHcHzcDHM
+QRwtQtLTwwQBTPfFfZdFvqqrFGWjrh
+MqlnnNvJJZnNNdJZZLvLJnMzjjCTCChgWjccWqcjhcgcWR
+tbddSHDBbHgHhHTCjh
+mffBfbpsFSdQQDbQsrlJvwJNLLJMrrlsJr
+RjqbNRRbDDqHndbcHDqdRHcChsffCQJJssZGpzpCpJphJd
+VrMmSbrWVMtMtLmQGCfZWJZCfpZfJW
+PgSPgTvSSHjjBbvbvq
+whclNQQfcCFCcrJRjmmHNWsmLs
+PPzMbqBPLVtnTppPTPzHJrGWJRRvsjjjRHssRb
+PtgPVZTtTLMtBzqPqttPVMClcdDcgCCfCQDSdSgCwlhh
+DrcrsvcNtLWSFPSFszbM
+HqTdHJdQhGJBHQHWWDTnnPzbMMzPnS
+hdwfqdhQJfjlccrfvNDLfl
+BBPCWvjvTLrHTHHPCTndfwhbdnnZZfDhJwfJVb
+msmgNMMcgmgczlmmgQNlddpVDDZpZpDfhZfJwsJF
+mmQmMgSgzmqSRllGmgjPHrvvwHttjLrLRWWB
+RwvDvhjhMvwlFNwNwCWCCWWLZcbGGZLGJVrppbZVcjmpmJ
+tfnfsStnPPfTfgnPSSzPflJZZZrlZJVzLLmZJrzVmG
+nPHqgfsHQnffqgSTldHTPnPHWMRFFqqFhNNNCwNCFMMhDMhh
+FmwFHmnlGJfnlSlmrfsSvWgZNWNvLvtqLqDJhWJD
+BVVTTMqRWvRZRbhW
+pMBPCzVPQcQsGqSFmPFwSF
+TcpTpwqZqMpZqlZCpZlwDjjcPNdgdPjHHHdvhHQgvv
+zQFBRbmsQbLLBnGBvFdPghddNgHjNSSj
+QnszWVzLfsLGbnGQbwpVtMrwZTqpCqpppr
+WrZmrJcGwZdGZZmHdJcwGWcZsdFFLqTtLVtSTLtvvLtLLqSs
+fnpCCQClfpQlzbbpQpflBpjhLVSTvFhjqtstVsjtstFVMs
+QBQRnbCRpnPngnbggCzzRClZwJHFHDwZJPJGWHwmNGHPZr
+fDhjvftQtDwgPhdRcRRP
+bbNSgllVNMCWVnbWmcdFdmmFdpFpRrPPPw
+NBzBglNzBvvGZDJQ
+rGbbtStjSdbGtDpjjJbbRRbdrcCsCCrFqhllrFHsFsCvqCWH
+TzgMMgmTVgzzTMLLfMHvTFsFCqHTvFsTvshF
+gLMPBgQmQmNzVZLPzPppjbRhhddGBGSttbpR
+zMJTpMzpVczHbCzVJVFCpJPngnBqVZqsRZZPnjqRgmjR
+wttwNdfLQwLhwhhDDhWvgRmnPqsQqjnBPSZRgjPS
+DdLwGGvNvhlvrrMFlFTcZrpC
+llBQWMScQlSSBjMrvrrPpFHFBDFDFJTmTtFFmF
+nzZzfVgzCNtnJppDHPnPpp
+LdRNfVdzbzCCjcvllMcsbtjj
+pWFwpFhprTnFfWwZrsBDmsqBvZvjjv
+VbcHCthtzQtNqBsvsZvQmQsj
+cltzzVcJSMtRWdhJLhRwdh
+lmmmLRdZnjBlGgVhNSVvRMWN
+bDwCqCGPbwpPwDPPpCpqpPbScvMSMSDWgVcSShNNVfgWWv
+bTpzqJHPFFJqbTHswLlGlBntGnjQtGBZTT
+pVjVlDDhmRPlHlHPWzWVWrVrcWztVdzv
+GCqGGGJSFbnLJLLfrLfPrLdgrrgfWd
+PbJSQGSsGnbMbqSFGBMMbsGTNwpTRwppDRsjwlNpsmHwDl
+GcnPbbbLqDPDBPPDlQ
+JtTChNfRpNJMTCfMTlJVsdVHvDddHBVmQm
+TzlffWNfjTfjjCjfTtRrLgbnbbnSSwbnLzZZzr
+hggWzjLhzhLhjzVWgpCpTFFHtCJFTJTHHHdG
+lvSBvNNSNSSmlbwmMJCGtJQCHmdT
+cfSlSSlvBDBPnlPPDZLsgtggZZVVfhzRgV
+gGVJGvVVZZLvQLWQppccpctpNptMhnhSjjnM
+fzQBsBzmwPzdQrRbSFNFnsSDchjnFhMN
+bCwQRbbCJvlGCHgL
+NMgdHVSqgQcVHmlllLDjlCLdjL
+whTRJtJTnthWBlLLLmlFtVmV
+wRhnGTpzzTRnVbzzWWbJwbhNQrZHfpNgMQpfZQHHNZZHHQ
+qNNlMdbNrlVsQQfswQNCmW
+LJzBvSdLSHpDJzzzHJnHnzFQCCmmswmfwBGhsQfWfCwW
+HzSvHppDDRvgHzzcnqTrTtllZdRrbRVVZZ
+TWVVVFVPpjVFtRfPBmmzMMPCvmLm
+hDDrwndQQbbhZDMSMvcflMLmfnBL
+grdggqsbrhdJJJrhbwbbsZGHVNHtTWpVBFVTTTVTHtNg
+tLbvnTCzCVnzzwVTJVlwltMFvQFQRFFrQPBFdNgrMBNF
+pShsqqmGjZfZccsqSfbdNBMMRQGBPgMdPMPF
+HhspDpjhSjbcSmcqhZDcZZjTttLVwlTJJVWtnWVlWHCltL
+DwQBvwBnBrSVRrZM
+JWWGRssgRsFgzsFPJrNHVMHrlVrPSMNjHH
+gspgFzRCFWLJpgqqRWgqpCJwnQCnhQvwcTdcdddnwbDfhf
+fMMCwFDGNNMTdTDLlVlZZmdZBdBtVr
+jjpjtbpRcPvSPnPnpPnvPPPnbZlmrWmLWHmHBWHlrmrmlZWl
+jqjjnPqngtQfGFftFq
+qnzhhbzzqGgsqGtnwcJrlCMlCjvcCCcrCRrvCv
+mVSNZdTQdVVWmVFHQrpCjpjDRvjMRjdLRt
+WBHZTHHTFWWNNBNHQTZPsPggghfgsnsgsffthszJ
+sDwpdMgvHrZgwbdggzZZgPhFNFFcjPPqhLhjMlPqLq
+JffJfnJGtBtCQQRBJZTQJJGfcNjqCLcFhFWCPLjhFLPjcPhl
+VZZVmtGQQZmHrwgddppb
+NNNlpjbVpGglNbvpTwBQQvfWvfBrWvBW
+JthDJsLhhHPcGcqPshJsshSBwCWwfWSLCfSfSSRBrfWB
+dhDtZqGmctZDtZHqDGVgVgNbbbFjndMFNlFg
+jqDVzzDMdDwsVQLCZVCRWLGBQC
+bbHFbSSpFbFHJHStJNbtJprZlCGLQsLGZRBLRQLQpLBClZ
+SmFmTPJvFTNbmmsMdqqjscwz
+RqMbHGJRJpgJgGgQjgrLTrTzjcrTrrLg
+lwfwdhnflPlbCsVVjhCSbV
+fwnNtwmlFZpbFZtM
+QNSQrLTNrLNQRRrfHFrSjqhblWtSltqlWqtWWl
+DvgBgnzgcvVZMljv
+DGJdjBPDngDnDjBpBmFpTRmRFLRRmmCmHH
+dtgSdTqdlvdJJvFqTvSqJqqRMPBtLHPBnWbsbWbsbWtWtWHV
+DjfCfmcpNrwZQCmmNrDZNZNpsHLHWBBbHVVcGGGbHGBbMVMB
+fpNjCfzLNZjTllvzdSgFgJ
+nHBfZmHTRwsZffjBnHfmRZHtLtdNPPlWvddWLWJlJldCldLC
+zwrbphMMVFzMwdCWNPlCbPdDCD
+hccMSpqShMSrhZTBwmTqHjqZmf
+NJGGLwGsTSsNlJZhmtgCVlbWQWlQMtCbvb
+pDjppDBRdjzqpHqDSDzjVMCCrCrWtgQWdtdQQCdb
+fHpfRBPRzDpBFSqcSBRBSNhPNwwNNswJLhmmLNGJZL
+RZbsPgnVDzTJcdGjDGmD
+NwfQHQtpfppQhjVVjqVNJJTN
+tLLtwSptVCSWpvVtRnrbWbMgFPMsgZss
+VsQjSwwVSwsZzsvdscZvfrhPRpqBrBrbpzMrrTMh
+JtNDTmtGJTmLCGFDCHtDhMMBRhqqRbPrfrbNRrbR
+GDWLlDnFgZdTSTWv
+gfQHRRpQgRqNSBtjqwjztzjtnL
+FvsPgvDlFcmvmTLlBMVztnLwWLzL
+cvZGDcvbPcmbTbrcDDPgvbTJdJfJHRhZSRSpRRfHdSpSZd
+FGHHHWvBWrHHrWVZJvVtcSrtrTcrtcjMTjStSM
+swpwfRhRmmmRQDzcJlcqMSMMqtbMTz
+dQDRDDRQfmmQDNsLfwRJvZJWFWVnPWvvPddBnC
+zVhHvhMVTnMJgcTzMcfGJtfBWRtBRqJWtqJb
+hlZjZSQCZtfBbGjqbb
+SQDNwplrDVnhDcVHgT
+HHZmttZVLVMQQJwMfcDRfDbbMN
+phWvTgBqqgBWsTPTzhWzhzfNGNNwfqfcDwJRRbNcJcbl
+FnTsvnhppTPFTBpPzPvpBBpFVmtfCjfmjtCmFdStLmtdfjSd
+hMTPPMNlLZNSGNbRBB
+gjmrsrttsCnsCsttVsjvttvtZGFHdbZGWWWdZSWddBHHnSWH
+BmvptjsrfjBgsvvfgmfQchMpMqqhcQPMMPMhLQ
+dJHGnrJJpGpDpFzzDmfsfSSCbfTfMbbRDb
+vLcwtWNgtVtSNWmTmTMCmhNhTRfM
+jqVgqVvWwwLwwgqZgjVSrPGzHHHqFnrHnFGHJGdr
+QcQcdgbzwJnzfgVnVwdHQbdBrrpplHvmhLjrlTphppLrjl
+MsPssfSZMWGWqWssSNPqrmmLBvjhqTvhjBprhB
+GRDDZMFNMGFCSNWFPDMMFWNnwVtdVdQfcgtddwQwzRJfQd
+pMqCMBGpMMCnwnpBMGBlbVRFJFWsJzRdzHlWzzJdJsJd
+jLLZjDgPbNPZTDbvftvZgzRFsRzRrRRHWFsJsFJc
+TZZLDPjtmDmbqQGwQnVM
+RjnNhBnnNNmJmBNhrqGpsHbHtstgTtTjqb
+WVMfWwQTzWZDMtlsfldqpplstf
+WVTWSTzwQWSSvQVZCQPTSZPvBcnmcvnrhmNcRFncNLRLJmnB
+lffQcnNTQBBcwqsdcqjSspcWtD
+MPMGrHGMMTqWTtDg
+VGRGLrJHZzLHPzTNTmmBfZQFTNBQ
+lQBPPrBrlnqBgSRhgZZZrLJr
+VNcWMDZbJHhWfWff
+VwvMwMvdwvdwjcwdwDDqsqsZQqPPzqzldPQtps
+VVJcZJVrRSdcsddfsvvbvFZBnngBMzMZFD
+hLLqLpqqWWphWjhlGlCHDFgzbvFBbgBFtnQpnngg
+HlhlmmHBTqTHHmlLqjTGhHhPdwdmsdcSNSfNJRrRcfwVJdrr
+HmhvmRzzHHrRMBJBjNJGDJRnJD
+cbqcPqLWZwsgQWZwWPwWgPPbntJnrNftNNNBtNJJNDBNqdjB
+lgwWgggQcWSzrlTHMHlp
+FZhQpClCWLBlrNDZvrwrrNSH
+ztTfjMjJjgsGrqvzDGwG
+bMjfnjndjnJtfgMTwPjFhQhCLdQCFWQQLWQhch
+PtrqPrrMCPChzCtLFRbtNgbdTjbF
+GdZGvJSWWDGplFjbjLjLSTlL
+vspvnZsVppBdBnBpDCszhzMsMzzPzPhcPC
+PdCtdfCMfGmtfmtBSWrMQwSlwWwJNQ
+qTqbcjqHTZTbcDqczTjjZvWrQvVWJQSVQZZSVVrJNr
+qbqjRFTcHTcDFgcczRqFrPsGGGgnhtGssCdnffGmsP
+vVbcMvqjjjmHCBCBBmBSSH
+PzzLTrcrwQgfLGrJBHSGFSCHtRFBJt
+cfsPrLDwQNgsrTNTQgLwVpWnVWvMNvqjjqvpMvlj
+jbqZNjLbZQvcfhhQ
+CWdCDWWMCgmJDnJmdQVzMSchvfcQVFShzf
+WPgWGRWRHdPBsttrHvNtrl
+MCJCCMCqcCqJsnssjQRlTvQQQQqTvqfQ
+HGVmwmLVlZRzcGZG
+FcchHmDFpFbDMDMbntsJ
+vfNvvttvDRcrvRNRNTLDNRcVsFhwVBVTwbbFFVbVhbJMBB
+CJGgSJHdgPPSnQnjnddHGGFMSMwMMsmsFMMFhFShMWMM
+dGCdjgzHCPPGlHDDqJtqRcqJlpfR
+CwtqqvwLwnwhtRLtdRnwnnRhPHpLLppTPPpTVfTHzJWVLTWB
+sGDsZDllDrMFZVmGgsmDMlmHpJBHpcJFPPTHfJJPzfTHWz
+srgVlGSgZVGGrRvwQwdqwtCvnS
+MLPgDrgLzThhCTgg
+GVfCbvVbVvhBHlmhvhHv
+ZqRQffRwtNZWVZfZSMsSssncnDCDnL
+VwBNhNNmhJswqjJsRzPgDvSgJvtgvgDt
+rRMblbHFfRrSWvPPPgMzLW
+ZFpFpCcprGfbrGfGCHclZfnGqmsjmBdNVjQqRBnqBsVNQwBh
+VLQlZWQbcPgcPmWbgmDWLQzdpGMTTqdpMTNsbGsNpMSqdq
+HChrwfffhJtfHwJTsDqThhDMpTGsjj
+HvffCrtBzclQZvQD
+dCBVJJmrJDlBdQJWZTTsWbdWThWpbM
+FHjSPjwqwssSgqTMGbGWhTMHMMZG
+FwLvLfLjjSPqFqgzwffFSvrlDJvrQrDVrnmBvrJsQm
+hZCRbddrgrRSVgcGZjjLFGLZFQFp
+nzPvMsPvtmvPNssPMqpcWVjGGcGLlqGcGN
+TBzmTmzmVmrBSBRrRgdR
+bwZZmwfFmcfCRswNWNBsjC
+VDSdglSStRCCTNCD
+VVVppGHGlrQnnGJbMmnmCh
+nFhgnFVNtgtFVssgdgVtVtsqJPTNJvDSNqTZZzbzTDDzDq
+HqLHqcwlBjLzPvPJCCvJ
+HGrlHqlllHBppRrlwWFnnWfFFVhMnnWdFhfn
+FsMFVszjggMMzWlPJlPPlLQsJv
+nqnBSNlfZqSvLHnHvWLQTW
+hShpfCCSRtfjgFjMzdjlpr
+jsbDsQnnwPsFbZgSltWGdgJgpnSp
+SCVvLhLRrzCNBhrCvddMJpWdWGvJGlgtpv
+cHLBBVCcCNHrbcSQFwQTbDws
+rMlbLgrRgpwTDbflcnHtSScwHdJdwHJB
+CQCjjZPzGGzCzZQvBVBNdQNSJVcJ
+jsPhCzhPqFZzZzChFlsbRRLrMfTbbcLTpD
+dqjzmmmQBjBHCmWrgVGWrrrvrpgVpM
+PLJnTFbJnhTDzrGgMlvrFMzF
+SssPcDttntDSsLcCzHBmmwcmZQqH
+fFfFSPHllPRpRfnmmFfHvHjgbsBQjsptBdBTTddjsDdt
+ZqLJCLCZzzTgWjdzDjzb
+ZhNLMrNcGrchLqcCVMqRvlSnFnRnmmGRggnPnP
+HMCMCMrHfwMHtFwTtgHHbVjjbsRZDwDVRbZqjhBD
+cDpmpdpNLNDcdZjZqZBNBqssRR
+SLJSdPcznSvdvDcHFCftFTFWCTHnWt
+NlMmlPClmdGldRZHJs
+tgJJcJQcntHBsnBt
+TfSgQhhccczSVQqrgSgTjFWqLWmwLFNJLWWPPwqM
+GGwTHqWVdnTTVVqgngzzqHzGFbJspFccRsjDpDcjsRFDsdjR
+rtLflllZSrhQPLBtQStZvhjDNjbcDNDRNFjCsCDCFs
+mPLBQPtvtQZtBlLSmMqVGwHbVMqTHWmz
+VvJCrqTvPvQrCpRNVRFGfZfmfG
+HMzsdWsjhZSsJJZNZf
+wHlbjnlzWCvqJBQlrD
+FnVRRsVdSnSnFSRqTVdqBBDBhrDdmcddMcMQMhzm
+HtZvJwHlgjlGlHJLNjJrMmrcmDQfDLczDrMhhh
+vGGpJjttvlZljZllZvJZvwGqsSTRWSCpnCWTVPVmWWTWWn
+wSHCNwwmcSMLSDFcwwSSHQvZnQjLZffZjZZbVZjVVb
+JqsNJJGGqprJNtpWhGhspfnffTnTvZvVbZnTrfBQvV
+GsWhdGtPWpghJRqhtNPmClczSlDglHMlczmwCH
+TzRpjVRjFpVLTTdgrTgrGsZwrZZwgg
+vQfSBdbDbMbQNBJrlhmGnrgrgwZhvm
+SHSCbdbddcVWqqFPCLqR