Browse Source

Solved part1

Piotr Czajkowski 1 year ago
parent
commit
a338a687f4
2 changed files with 378 additions and 0 deletions
  1. 78 0
      03/code.go
  2. 300 0
      03/input

+ 78 - 0
03/code.go

@@ -0,0 +1,78 @@
+package main
+
+import (
+	"bufio"
+	"fmt"
+	"log"
+	"os"
+)
+
+type rucksack struct {
+	first  map[byte]int
+	second map[byte]int
+}
+
+func readInput(file *os.File) []rucksack {
+	scanner := bufio.NewScanner(file)
+	var rucksacks []rucksack
+
+	for scanner.Scan() {
+		line := scanner.Text()
+		if line == "" {
+			continue
+		}
+
+		edge := len(line)
+		half := edge / 2
+		start := 0
+
+		current := rucksack{make(map[byte]int), make(map[byte]int)}
+		for {
+			if half >= edge {
+				break
+			}
+
+			current.first[line[start]]++
+			current.second[line[half]]++
+			start++
+			half++
+		}
+
+		rucksacks = append(rucksacks, current)
+	}
+
+	return rucksacks
+}
+
+func part1(rucksacks []rucksack) int {
+	sum := 0
+	for i := range rucksacks {
+		for key, _ := range rucksacks[i].first {
+			if rucksacks[i].second[key] > 0 {
+				if key < 96 {
+					sum += int(key) - 38
+				} else {
+					sum += int(key) - 96
+				}
+			}
+		}
+	}
+
+	return sum
+}
+
+func main() {
+	if len(os.Args) < 2 {
+		log.Fatal("You need to specify a file!")
+	}
+
+	filePath := os.Args[1]
+	file, err := os.Open(filePath)
+	if err != nil {
+		log.Fatalf("Failed to open %s!\n", filePath)
+
+	}
+
+	rucksacks := readInput(file)
+	fmt.Println("Part1:", part1(rucksacks))
+}

+ 300 - 0
03/input

@@ -0,0 +1,300 @@
+gfWpjRRQffQGCHHJsGqjsj
+SclzJZZvmmnPbJtVSqqNBqVCBdSCsd
+tlbvZJDZtmtPcJmlPnhMFQWWpMRFTfLDRRTWRp
+HjMPgSWjVrjgbHRRSSMRgjRdpdbGdlcdCvQfcCdlwQJfdf
+LNDnhtNtLNFFZDtFnhzvdldDflvvDCdlJfldpJ
+ZFLFZZmFtFtTNTSPRrVPWWMpRP
+qLBSBLRwmgzqCbzCffDlrfCV
+TFFFHNWFMFFMpHpGHMTHGNhrldWZCsdZsslZlZfrflDVss
+PTMcPGntTThHhTGctnMvSwjjvmmqLBmnjqqgCR
+nClJtMwwntqVVPJcgZqq
+mjpsDcrcSSFFPZqFBWWgVP
+vQcjsvhrvvrmhbmNHMNnlHbNMtCtNM
+bgvvhnTQtjrrrhsDDf
+pLSMltLzLLSjFrSSjrSJHD
+zNWRLBdZPllPQtCvttgCqb
+DRlDrrFTNDNlgzsGTBfcnqhhcnJfcrCSqc
+MMmmdWtdLmvtldHjMmQfPBqSJWnfCCCqcWSSPJ
+vjHMjLmjpLtHptQLmHvwTRgNVVpTzZFZgZRlsVTN
+rzpMpDCGFCFFjRFsRPFRNFPv
+fWclbHCHtSmfvjnmfsvZ
+wTcTlSwwtQtWclBQBLGMLMCLVzVLwJGqLd
+MQSjLNjPPLLSBPjfQhSPHjDVCjDtVVpDHwbwVpbD
+RcmWzsRrzZrmTszWRqWlmRJscbtHwCbndCtcDVddDpdnVnbt
+JTsrGGTqmwTlWmTzJzWmhhPLLGgPFgBffSSPhFFM
+qMMRNZMDDNWLPqfzCgDcGncVDCgG
+wwBFhwhhBgmcVzhghG
+tbJbjjtJvwtdtwjpFtlbvtdTLNSMqNqMMgqNHPlZRTNggL
+qmjMHsZmZSbjbZMjSLFFFFwgsgvFswpwww
+hRJBhmnhhvFFwhcv
+llfWDWzrzBNTRfNBrWzzTmZbGTMjPqMmZPjVbSZGSP
+CRRPLwwcclcGVppQ
+SHFjDjjHDTfSDNTTHfSHjQVGrpmllQQWltVVVZGp
+HFlqzDTfqlzwbgPJLwCP
+WRCNLphpLppSCWVHNfLRzVnQMnBnMddPMQDFQgrhPQFM
+jTjJqvqjvPVJFJFBJF
+qTsZbvGqqZlstsmZVljtwqwSHHNWczHSSRcWNSRHzzNfbW
+glgzDzHjSrVHcVgbrjmNsscNGmNWssGNNtst
+hHPQLHJpwdLpdHfQQtnZmNMwnZGZWwsFZM
+QpdhPJRTJfPphJfhCBlVqVvgvVDBbvVqDbHD
+VtHzjZpjVtHrprgGmjHsGHNdSJFQRcLJqCdQcSqJNpcq
+bBWfTPwhbfDlMnhffRwQJQNdqJcLFQLSdR
+bhBhvfMWTnlDnTBfPSmvmjsjmmGtzHtsHm
+pcRPRPWrSDcJGZSStmwZZS
+VnLfCfTlfVzfnMMBCqVNZJdtjNtJjhJdGNNbwT
+BLvqCCMVsnRQsPQgDcZH
+cQbqqQhDGhlQfQlhQrqGsTNgLgCpRgLTPPPLNbpg
+wtHVddVFwSHznZwwznCpRBdjppNBNTTdCjRR
+ZtWFwWtSmvVnwZDrCMGfQlDDJQmD
+PzPZGCZzrZrlhdjdCqfCsqQdRD
+cbvZLVVFvbbNSNFHSDnsDQdnfqNQDRngsR
+FJHSLSFSScJJbWHFmFVFSZmrrzBmhtBwmzBMPMPzPh
+nlpFcLBgcVcLbssGVBGGrlpGPhJJJJJqPBZPDNMQMJJhJQZZ
+SSTjHzfHwtZSPVQVQMRQ
+TzVHwWfTtzwdVzsbFnGgsbdcGrLc
+FppVBRVZDdLmrDGmmfrQ
+NtNMPNshJCzznLGJSrqRrRrr
+tRssthhPlCWhPzsWtzhzCbVVjwTpVwdZZTpwjbdBbwBc
+TTWblHWScvPCCHTWFzSrqqsNNSmdmqrrpz
+RLRwjjnjZNprzmmZcq
+QQgtQnccQDGjgLDRRcLthQhFBvCbMtMHTWlBFllBbFCMTW
+WnBVNvDnVsNvZWdrWDLVDMbsHpTjpHCSSClsbSCCMH
+GPFtmztzgPhRFtJTdbTwjppSCjpgSl
+hJcfPtQhdtWNVZqNnqNQ
+GLcqZPPsnqQcFsmBBrqRvrddNqrC
+MtHthJwLllwvjRvvtrvBRS
+VHMfDLbpfznszZQG
+WBSdPlQPRfBtGQPfBGPBJgzgjwsJzsszJwCrdwCT
+ZpppVpMVpnVHMVVbZRJrCgwRzTJrwNJw
+MvhmnpLqLmhVmBlftRQBFSlR
+hhQlSJqhtCSnqZJnqShSlNDwRzpvdwRlMBMMdcjRjMpMRc
+frrGmLmWbfFrsmFHmBzBvBcwdJbvpjzbMM
+mmgFrVGLWJLFGsgfhSVtVPqntqnnSStN
+SFJTJTSqswwFQbwf
+cDtcWPclrtPwVsfssQmN
+HDtwWCgWdggdzSGJMSzGMq
+JpqJtWRJMhCMJpMQCWtFrjgHdgdlgllwNjlQjldH
+fBzPZcZvnBmDnZvZBZDmPvglVVVdgHHSwrNRgVgwNPRH
+GbZnZccfvcsZmccsmnnZTRbCCMWFTWJqFCCMJFRT
+vrrFqrFTBTmLmNrLMqMTHddJbHpWnhdWdWbHhJGM
+wBzfwzcQSzWSSshpdWGp
+gwjPPPDQtzQlzQDPqTgLBRmRqZBvqFNR
+bWVptFFsbPcZsGLhsZGmLB
+qnWrnrHdMCDCNqfWmvRRZSSRLdRGZGRG
+nNqqNDfMrMWHDQNHzWfHNDnwzblpzFlbwtFbVVlwVcPJpP
+BHJhlHdJQggvddglJBBhglhQzZHPZpFFPDMzFDDRDFZZDFZD
+rSTfqnCffMfCVfCLNqbzbjWNDbbWDPFpPFbP
+nfnnrSfCTVSwrqSLCGfTGlgQhlvsGMJQJBhhssJhGc
+tBjjDjjqfDjLfJlrLgglvmrlmrcc
+TwNNTVhwwpgvGSNNSssS
+TbwhnvvChhbVRTPPRJBJQQfJttMQQJCQfW
+mWSvSQVgmWQsQvspQJlrlLnJLLpCClhhlp
+bFHRjZdNjjBZzFzhtnCllCcJLrCBll
+HFFNHbdZZLZjfPFjHVQmWDDVsvsmTqVqDf
+JJPllQQClqgBCgdHwHbpjVTwHd
+tmGZtjGjHZpVbfMT
+ShGjNGWmDSNcNRtGmshDRzzCvzQJJRBLrvlrBPJv
+cTpqsTWqVVpsNLfvCDFlMFDVFL
+JnndJPddQgzHlvMJFDhLCG
+BjtntgdRnQgzjdBRQBlpNWrTTlNTSwNpWS
+qHmqLVLjmVqsDBLtmjmbtPwCTwwPzGWRgGwGwMwW
+ZhcCNCSprRTWTwSnWW
+hflhZvvQhppZfcNpvrhpQHjVjLmbVmmVHVCFDvqVFb
+nnNrwDnZrspwDNnZsNSDsNbCmpjvMTPQjLMmPmmQPGBTQP
+FdVtRdRfctBQPmTtTLQB
+qhzWVWJqVHwbhlLSsS
+htWmhDhFztnztDhtBmBtghPRSrpfjVwPdfPwpwnRSVrr
+cbCHvgJGcTqbqcbqqqcqsMsRVrSCwffdRPPpVpwCRSwfjj
+GlgGQqTqbgQzttmBNNFz
+NWQNQgdTgjQNddTZfrCQWRDnnnbqnLqnRcjJlqqvDj
+FtSSmSmJhpllcclDvpln
+JBVVSsSFBVBttShFGSPQfCGNdrMfZZTQTZNNdC
+HgHthMhphcbfbMMfHhsGGDCRRVlcVSScsCRz
+nWvPFqLqPNdjnNLnjdJnPdWjGlssDPSsllVCRzlTCTGlSDzS
+RvddJRJQHwQwpZZb
+gdZwgpjZZQtHTdrWrwdpWRnlhNBRlLbFthNhflhBnL
+CVzDCPGMVqVmGsGGbJCmCDvMcRcqnBFFFnRBBNRBBNqhnFfF
+DsmSGsGPzvMGJvdbgTSTbjbSSdgH
+jBGmbNBQGdBNNDJNQRLLVDsHtDRzHHZZcH
+wCWPFWPCrPhPrplvprhwpCHHtszttqZslRVHLtzVlJZL
+vprMMvMnJCwnnPShNGSTfGSfNmmgdNff
+bPtLbvVWWztbLSVVnbszpzQsrcDDBdpRcDrs
+llZmgCZqgCFgmdRdJcscBdJsmQ
+FZlgfqCFfgZHlqCMCglwCFGWntLLSMRSPGPVttWRtVGL
+vtnDsDtrnrSvrMVmbrrJgPCmBm
+FpQHzFclLVzWHhwHLQLlHLzPmMBQCJTdTmCTmBTJTTmgQg
+pllcVWqlffZqZtZD
+TSSZWpsQmZWcTZSvsTTTppNPzrBPrNBrzQNVFrBBNPqP
+CgjmCbtGgftMmLtLmffzBzJJJNVVMNzNBqJrFN
+gjgjLgtLwgbGjHdhhGdvmlnllnpWnplZvcvwTl
+htLrRFRtbbhlGSLRtbJBJsjBmgMMgJgtmBzz
+pZQWddQQfpZZffcDQZwddQwDMqDDsPgGJJzzjqzgJMBJgmms
+QdcQTdwpGNwfrCRlRVlNLSbb
+wrdvpVBVpMGPPjWjGZJJZT
+tChCSlNfCCHtvHHWPHPZ
+RbRRNvmcqcblfMwwdVBQQqqdpL
+qcctqRcqmcHWzHBdDMZhfwthBnwt
+JFsSNMSgNSNJJMGJBBdjhFDfhwhBrwnZ
+TbgbsSgJMTJllblLCSPlsTCVQmRVVWpQzzqpqzVzHLQzcc
+CVcWbjjSSCSSnpjWpCpprhHZlHtHGzHrZrHGclrl
+gqZqdddLgmgNqvTGGHvvmrrGHT
+FFDgZfZNLMgNfdDqDRnsnjBpbSbnMBBWpQpB
+qwpQFwRnqFFfSBSfFt
+LJJLGLWWtZlbgWHgGshhSdSVzmhHmfVzzC
+lrbrbrNNJgDMLLbblGctvvvDqPcqctTTTcqP
+vnblvbfHvlcHMlHlZbSPLTPLwCMBRRPRRFFR
+tszzBqtzDsWVPRSmzLVmVL
+tsNsDDNgGsqBrgBpgdHQbfhflcHdpZvdbh
+cCpLtpGGLsgsppcpmGGHMtjfHRVhvvVVFRfhjV
+NWnnnNNndQnQZdCdzzRVMHzvhhHWWWjj
+CPJJrnSZpGDJLGTL
+cnJzpcnmnQVFbzTlvTHBlb
+tWCDPjfsDGfZhddhjjdTvFTgFgvbnFHvdHqT
+hjfCjwDDGjPthsfhsnGNrJcQcRmJMLVJrJNMLw
+CPPRrSlRccPcwTHwfdwTHdfl
+mLQLLjhQhhQLZvpzssHDhdTswzzTJD
+gmjbBvQLWmgbQZBCSRnnnSMVCBHnBS
+sWrBJbsVqschzhQzHh
+gtFmztnSlSfdlmnZSdSwcwGRTjcTcwwTcHccRg
+FzFDzMZCdDZtCSrJVBMqWVrqNBqN
+TvWlhhfhZJVgtSSl
+ddBdGGdFmmBbdzqqPDDGGmdDZSgttHtZppSgzZHSgMhtMgtz
+PGqdrbbbdPnrcjjhTRWLLc
+trrmJWcrVwVbcPScdcBdGPHH
+JTQnfjlJTpQFfMLlNJHHGDPdGsSdDjHGDPPH
+ffFfnCTTCfTlplTMvNVzqWvwVzrrhwmWhJbW
+hVtDtgcghzJpmmhlwp
+srsnrqqsPqsBPvnqRBRMPbnwlplpmCStJwmzJPtJzJfwSw
+bbrqjBbvGsjGGBWqMVFFVDNVNjZjgtgFgZ
+mnmhBDHhwWCHsTgRsH
+dcSlFvccMFMMFFggNsTzzvvzWnVW
+llQdllZScFplJPpdcZSqBqjhmtnrwrDGnQGhrq
+ZffVNgfTdmPVltsnnGwgQDnB
+rMCFLMHpzCMFzHpzbrcHFLzBwsDsDDnlDBJrDDBBSJSnBn
+MLMjMzqpCzvwqTmwZdvq
+DDNlWPRqgPRPsRFjJQZbchJZbgQJ
+zzrLLznpLbHnjcBHvVvHvJcZ
+ndmrTzbMMTfzrTfnTLrzdpmsPPPqlqGDNNsPCRDRqRsD
+zzdqTNfTfdfhgQhgqMFSjRDtDRWHqtWlwtqDRS
+ssBCrcmpVGZvVRDdSDRwtmWdDb
+rvGPCZLCVCPVBZFdnfThgNgLJNhf
+bslcrssQwDPbQrrcsbsnQrjMLthPMMRhLRhLRgzmgPhRgM
+DffvDfHGfNFdpfTdMtghLBThzVmBhBtM
+SNvJNJdflDDbcDWJ
+HFlHNpWsTlGWbFsGFTGHFLLNzPPhLVPMzVzMNPhhzP
+jSvZtmrqqpcrCpPVzw
+dddQvqDgDmjdSQQdqZjStpffWGgBRWTGfGsRlWBlHF
+THnTbNrdBnLTHHnTnBrWRTndsccZsLZcDqmLDPcDlQDsmmsZ
+ptwzzhpvGSVdqQlmszqmqPqc
+wGVjSddCBggCHFWN
+LFFbdbhhhvwvfTNdRhhRRvMbHDGjcfcGfDjtDHHcHqGjDqqj
+WlQnVpWSSWWsPsgDqDzHDLHjJcttGP
+rrWsZrgVnWrWSlmSlmSBFFbvTThhBFvvZLBhRw
+BgBdcjThvjFcTggrqvVfzlnnPlrqLt
+JpwJGPsQwpwSssHpPLlzlnNlzLLNNLVtsN
+JPMmWGmWPmHbHpJbWGJmDmwbBTRZMBBdZCRTRjFjhCZCCBTT
+BjbcLFRfBRhnbGjCVVvPllpcPtcDmdlPpvPP
+WrMQqCNgsqWWsTNCMZMWWsWPvJDJDddvlpDtZDpDDDDwvP
+qNMzzSzSQsGLbFCSCnVR
+tTRpHJQpQBZcddhhMhvhJN
+zswljflgMFbwPqmNmSdvShLNfLhm
+qFbsMCVgsqMwRWHCWDDBDWpt
+VSTCCWsJvGpHHCNC
+GrqzZrrZjDljcDDlfjMqgRPfPvQPpBHNvHvBpvNQ
+rljncDcznjMqhlhZDnltrzhTsGWtbVLFTTWGsbdWJdFTmL
+mJPDSJJPZPJNrprSNrDmpZGrhFFhBqjGbGGVbFjhhfqBjBRV
+cgnTQHdMQdTHdhqfggBhVqVfVS
+nQdLLddssSJrmsNvZrPz
+jfjffQzZQQMzZZfZZQFgjDWBCRlCBdTTBGGGRpBCgdhdBG
+LrstWtNsbHLsprRBdlGpCwlh
+HLnntbnscqLvvPNNfMWSSmDMDPjzjDzS
+vhcGwWVvglltcfBn
+BBSLrzSJLzJNJrLfPfPRsmDRmflD
+jMjFZJNMqzrzZzFNFjNQqJzbCpBBvWdpvTCWhpVwdvHVCGbG
+HlrnFmRmtRBQPVBTQHHQ
+psSLJsLpTTdPdLTv
+fCGgTgfSSCtRtFFzql
+pfTpStppcDlWfbpDdzQRsQGJhfffQgJHzN
+ZFZFZmBFwVwBVmLmLsRLRhHNzRLRNNzJ
+FnnjwVPmnqqqjBjrTdblldCTpcPJtbTD
+bdZHdWlrjslMMwGG
+rDDTRBTqSqmJLBJRBTSJpmMsMMjhwvfMhjjfVGsLshhC
+BqQFRPFRQBJgzrcZNHFdZt
+wrDdLlDdPWZPTTrwlZpSsPsHVHsSCHnbzMHM
+JtNFttNCjFvpppnMpJgSVS
+NFFqFcCQCvfrZmGdZdmqrW
+GMNNfJnNddJFJWsv
+HSDwCmmghLmwmmHDpsvdFpMWpppptSbp
+zCzBCgzhwmhzLrPnVrMqZBNfGf
+DrHGtbltbCjjjffPrgsmzmcqsgDczdsmgJ
+VZLwQLZLLVwLBQZnLVphhLQQqsTNmzJdcNTzzmJNqlNBsszz
+wZLhVMplpQVRRlpVGPfjCjMGCrbHGWWb
+BHpFrHHbBNTWWTWNhCPwPLNPjCdjLV
+zJRRzJvZlcZsSMJdzSDjDtfDCtDtjDjjjj
+dcJcszQJJGRJzRllMpGHpFTWmrTmBTbWWB
+qnWWqhDhnjmjCMBlNRrfVfRNCB
+vvBLBtGHJTHBddrNVJrVSVdr
+BZLTHbgvHvTFBgTFFvhmWmmZDPmmZDsnqncs
+WBvmjDbSzTMmHHdpNHNF
+ttlflZRfGtfWVRltGtflCdHnJrNJHNHnJddNMNCnpF
+VVwssWQQfRGZcszBQzDbjSBvSBDP
+lSlQqQVqWWVWfqQWVJSTscdmPPwwTTmjjfpjPp
+FCbzHbvHvtgrtFCvbvbbwdTwmsrwnTTpmdswmwcc
+DtZbHdghztlLMQlWWhVQ
+pqzzFSmdFqbQvlpdDGGrGBWPPBVNQnVttZ
+cgcjwfBMhHCjjLMCrtcnPcsnsPGVnrVs
+JgCChjjjBHhRRLLjjhplzvzpSFJvzzlDbSqm
+mZzVQZMhmrffwfQhWhzmrmpBtRcdbnbcdcMpBbDbncdD
+jsLTSlTWRBSDpnDn
+GLTsGWGFsfmJGZVJZm
+BGWshBGnsFWSLWBLlSSLWRJHnrVPrPcNHCNHctnPPJ
+QmvQCqqMTZqvgmvTjpZCMgMtrVctPptHtrNVrptbJJbrRP
+CzjCZfCwDzShDWdF
+HmQlQHmJnpmptmzt
+MTqMjMPvTvVvhpdztZnSwzwZqS
+CcbLLPTMtCCsjHNHQFLRRFlRNN
+GDFwLLLLSrbdPlFBMFsslFHmZH
+TnJCgthHpVTfZMQZQmzWnZ
+hjvtjtghtqJvVjhTgNhJTvdvdDDRbbccrwPdcGwrHS
+MQQMBPzMGQBPBbDQPMhpnRwsGnRhNrFFpRnF
+vmgHcmCTTlvvvZvTmqcTfmCRdddFnwdRdnVwFpVfpRnwNw
+gvmqJTcHclCQJNzjMLWbLj
+DbqqDDbQFqfNtZSLSq
+RrdjPdmrpWBdmWRdccfLtNttSDMZBfftLMLf
+dCcgmgRrWcgcppjCVVVVFHFnDnbJnb
+fZMFfrtVdZSDVwTgjRMLhwTCLj
+cNzPBNpclllzHbmTNRhqCRTgjC
+nhhWJzhGPlQcGvsvfJtSfZfrtt
+PSzrBWQBBGzBlnSnWtDrqHfNfwVwHcLNjHjwcDNmFH
+hbRhtRCRpRvsRgVVVcNHNNNCwLwc
+ZtRTRvttWWzBPlGZ
+tcLnctNsJrWWNDTN
+pwPPSjHSHHfzvmSvvvFVVGqGVqGmFqrDWgDr
+pPSvfPQMzCQCSbhllLnQDhbtQZ
+DmLffDhpVhjjVwvbwNVFbbNSNH
+JRPBgMPRHBrMHMHqrBMqWJBSQQNbCvndNrdvCNCFwFrQnv
+WcqJcPGMGtWRRBtgZjjspGHTLHGHTppm
+ptJtWJpqRwDZZDVWpbDWqlvvflfMjlfCMjdCCdtslv
+rLwTBGBzBBQTzmwCCjvdvlLllddsMl
+NBwTmrGNgrTrcgPpWgWPDSVVPW
+CdglMnrlSSqDPpcsZb
+ccwmVJtvVvVtNhBpBFPDVpqbbD
+TRGQjJjGTmtrTCgHWLfrcn
+JNNhLwWwWQHNPDmmjHpc
+zMqZCvVCSMVqMSTVvZVGsBnlslpmsmzlPmsHPsPB
+qTVqrgdCCbhfHJQFtg
+wNwCBBCZsfQWfmLCGSmmFRGSSF
+zjnPHPVqMhhZLTcbpbSncp
+lVlhlgzlPZlwtgBddJdfvf
+JWRWRRLWJLnjtjnLzGzznflBvfPvPMqMDqdbzblCzC
+TTScTVbHmTsVFrmcsgcHFlPMMvlvrDPdlrDDqdldvl
+bVpcpchgsFZHbhSmSTsHFFjwtZjnjLttntNjLjNLWtjw
+rffjPJzWzrgPpGWHVNqTtmqFTVRH
+cswhvlLBvSLsCtbFccmqVFNTbb
+wwZSCZSnCLsSDGgDmpGnfmmr
+rTfJTNtjfNljlrWSlzRtNlTqsddwGnsnHHwwhssTsnqw
+VpbpZZbvPLbZbbBhwqMHhsGMnJdVwV
+mgQZJDLBJbbbcbgZClCSfWlrCjRjlDCR
+fSpwcVfzsztcSSWNNMbnMRqTvtTv
+mJFmGDDDhGhBJHCQddllqTvCllqTRRWNnMbT
+FdFDGdDDDhhHdZDjhDmpwSPVZszpwZsVgsPRZs