Jens Kadenbach 1 год назад
Родитель
Сommit
2023211beb
10 измененных файлов: 479 добавлений и 3 удалений
  1. 14
    0
      aoc2022.cabal
  2. 4
    0
      package.yaml
  3. 300
    0
      ressources/day03-input
  4. 1
    1
      src/Day2.hs
  5. 14
    0
      src/Day3.hs
  6. 30
    0
      src/Day3/Part1.hs
  7. 32
    0
      src/Day3/Part2.hs
  8. 31
    0
      src/Day3/Shared.hs
  9. 2
    2
      src/Lib.hs
  10. 51
    0
      test/Day3Spec.hs

+ 14
- 0
aoc2022.cabal Просмотреть файл

@@ -31,6 +31,10 @@ library
31 31
       Day2.Part1
32 32
       Day2.Part2
33 33
       Day2.Shared
34
+      Day3
35
+      Day3.Part1
36
+      Day3.Part2
37
+      Day3.Shared
34 38
       Lib
35 39
   other-modules:
36 40
       Paths_aoc2022
@@ -40,7 +44,10 @@ library
40 44
   build-depends:
41 45
       QuickCheck
42 46
     , base >=4.7 && <5
47
+    , containers
48
+    , heredoc
43 49
     , hspec
50
+    , lens
44 51
     , split
45 52
     , text
46 53
   default-language: Haskell2010
@@ -56,7 +63,10 @@ executable aoc2022-exe
56 63
       QuickCheck
57 64
     , aoc2022
58 65
     , base >=4.7 && <5
66
+    , containers
67
+    , heredoc
59 68
     , hspec
69
+    , lens
60 70
     , split
61 71
     , text
62 72
   default-language: Haskell2010
@@ -67,6 +77,7 @@ test-suite aoc2022-test
67 77
   other-modules:
68 78
       Day1Spec
69 79
       Day2Spec
80
+      Day3Spec
70 81
       Paths_aoc2022
71 82
   hs-source-dirs:
72 83
       test
@@ -75,7 +86,10 @@ test-suite aoc2022-test
75 86
       QuickCheck
76 87
     , aoc2022
77 88
     , base >=4.7 && <5
89
+    , containers
90
+    , heredoc
78 91
     , hspec
92
+    , lens
79 93
     , split
80 94
     , text
81 95
   default-language: Haskell2010

+ 4
- 0
package.yaml Просмотреть файл

@@ -25,6 +25,10 @@ dependencies:
25 25
 - QuickCheck
26 26
 - text
27 27
 - split
28
+- heredoc
29
+- containers
30
+- split
31
+- lens
28 32
 
29 33
 ghc-options:
30 34
 - -Wall

+ 300
- 0
ressources/day03-input Просмотреть файл

@@ -0,0 +1,300 @@
1
+GwrhJPDJCZFRcwfZWV
2
+LjnQlqNpjjmpmQlLlqNfZRvQcTWcTSTTZcSQcZ
3
+nNqjdspspngnmjmslqmjjjCDGrHPHMGddGCMCGPPPJWC
4
+GwmVZmPWWFFmBbVbZVwmbPsTCnlgQgnQfhlffffZnlQh
5
+DqVDSqqSMzLLDDNSHHLdqSdSllCQjsTlClhlflnTlhjgfgfM
6
+VHJztNLHGtcbvvPG
7
+bjrPrNCtNrjdcCPpptfpTVspDtfTtB
8
+JGQJMJQMmmmZMnnLpLBTpHCD
9
+WJJqWRgWlCJZhZRCQZwdPScdrPNbvzPzwvqz
10
+QNSQNBWQNLjZBNNhLhSNRsTcsrTTVzcwZZZsfrrbwb
11
+tCFtHpppppMldpvpqnMFmMVGrbPcrwbzswrzcccfvTfw
12
+pdmCpgqCdmHHdJVWgSRNJDRVVj
13
+sNrFnvNSzrjQtQjQTj
14
+lcPmcJDLdPDbJPVLljdGGBBThBQTGwTtBw
15
+PDLqmJmpJQfFqfqsCM
16
+BnhctqdnqnRcBnslCJJCMrJrsG
17
+wNDMZpbQwMpCvCGVjlss
18
+WfzNwZFbwZzZmFZbLzNwzzzzcdqgRMTTPdHPTTPMRdcWgRPt
19
+grsrVSFSSdFSDFVFjZZWwpWpZWZplgZZ
20
+mcBPPPBLBfNdLlvvWljWJC
21
+dMcmcRdbRzdVhFthSsTShM
22
+bzvJZMTzTZSHLCCdDzmDcc
23
+hqBqWPFssvshWvvssNqtsHftmfpHfdcdDGHmcpfctL
24
+WvBQgNNNhghTJbJQlJTZlT
25
+chcdwNwdbCbQctCjnnQGHsQspMHMjG
26
+nSSSJqJZzJgWWRfZDJSnqvTTsVvvHVPpHVfpjHMTjP
27
+BZRDRmmrDWSrZWWzWSRNhdnCFwChclFtwbNdtr
28
+lNgmssCtqLwqCCtfsCLHPFhhhmMhVzBDbVzMDMVz
29
+ZnRlQTlJzFQFQFVV
30
+npZJvRRGZSnWvSvrSLglsClfpfcLgNgpHf
31
+tVtqcVqFVtZhcfFtqlgSpmpDSDNPzSzZmNpw
32
+LRGTHqbrHdnGHrTCSSwNDzMDwPMzNwbp
33
+TqWGJrGHCHnTWnhsWcFthFjtfQch
34
+qNnTbwtctvffFcqfrHjMrFjVHRjSjZDZ
35
+dLLzWWPmCmCzGdsLgBLGGBDRMVMHRlrrrZDDZsNMrNNS
36
+PJQWggCzWNWJzGWfchvfTbJvfnnwtf
37
+ghzdgzzdQsdqzzhMNqQzvhgQnRRBWTjWWGTRGWwGTZhwGnBT
38
+fsrfJHbFfDFLVLVFHrWCWrBRZZTGCCjwWZ
39
+HLLllcDPbLPQdPspMNgvMt
40
+fNDJqdPNbtHpCbwpCCCp
41
+RTMRLrzGrMRMRPWnnvSmgCHFCCFmmT
42
+WQsWQjzGWMsGQzWclQtVBJfBftNdtqVPfP
43
+gbTCVVmDVFdsgmgrrcfwlwfTfPlcRR
44
+qhQZqQvnQhLQhJnvfPcSwSwlfjGcqjqj
45
+tLNZLZZJJZthpzhMZDCdFmFsmWWmtDDgsw
46
+bqCvLvLppzPzPPvPbFztFtttBNGdGsRggSgGSHDdggHSzNgH
47
+rMQpWfMfrcTjWJhwWHHsSBsRBdSTTNBgSR
48
+VwfmWjwMWwccrWcWpQQFnFtlCqmltFnFLbbZmn
49
+cWqsMWJMzqJJMHsJcqsJqTqjSbLBdfdSbtzLbbLfbSfShfhd
50
+gplGvQmRrCrgZSZtSGZZjhbj
51
+CQmmmmNQRPvjgRClCvmmcVHPqMFMFsWJVqFFcnTJ
52
+QHHqvGwjjWNqvGTQGvTFcGwJRJbszcPtDbJVbtPzVbDptp
53
+MLdrgmSgZZdhdfbLVRpszlRDstRL
54
+gdSgMCSfdMnrghCWGRQvHwvNHjnjvv
55
+RDBZwvZBrMlsvnlb
56
+WdFQqdjWWcHHPrwSPnnSWnSS
57
+mLdqgqHmcjHHjqLHjLppmhfBfgtDtBJZJfVtBZwGZB
58
+CCWRJQnZlHtHtNZRFDcBhrcvhDrJVVDv
59
+dPPSqLzfsqGLSTzfLzLGdLMVVgvBcmgMVwmmDFrVgmBBBr
60
+SFjdTGzqpjdRbNRNnjtnQR
61
+hjNcwBDDwDFcjdFfjtFhtcRsGGgTsGRRRTsGGqZGRq
62
+gbmrLnbzLmvQJnQVVpqZTqzWSCRpqRTsSR
63
+MQMvVMbPQQHrQMnMPldtwNNfgHtlwBhdwj
64
+zwzwpzMfzrBMWfCCZrwzrMJDGGGnNmGNZvgNZsDDsGsG
65
+FbFqSbcSbSHqTjmgGFnJglllsDJm
66
+TbhVdVjqdtqTjVHqjPdthPBBWpCnRfwRPRCfBCCnWR
67
+hlpmbfJJpCSChmJMmrSjTjcSdjTtQQTtTtjF
68
+gqrgsqLzgnBgZGzHBnnsQNNQtjjcNNjjtNFQNcNH
69
+LVRzgGGzzzPCVrJMbPJb
70
+VHrmqFnVdvlzzNrr
71
+PMtwBJPBcPwfbwBJndplLvLdLlgMMzLL
72
+bBZnTwbtnScfQJPJwPTjqGZFsVFjDHHGhhHhVj
73
+cftqScHJrfVfrrRZ
74
+DTTsDvvlBbTGrWBwwsWDBbWdVpZjjZjpVPPGhRRVjVZNRPNN
75
+lsWdWDbrTLBsbdrmdwbMJtmHMQJccFHFnJFqFt
76
+SWNPTPVSWChCSmQQhpppJdFJLpDpgLJmLd
77
+NGGtNtGfHtDpdJdqLB
78
+NcsNGNjHZsZGnzZfnGhQnhPClrVlQPhTVVhl
79
+QDdgMBsNhhMgcWbZdzmWLzFzWH
80
+fRqRJJqGCvrJGjCRRrSJlfPtHzzPmfFbtPtLZZLnmt
81
+VjvwwjlwVGGqJSSqJFccshpgNhQNQTsVgBgT
82
+wvDLDwCbFgSTfTSJJgfB
83
+qsRhmhqchmVhPdfTHJSzpCtJpfPf
84
+hmdhrWrddmhlqCRcwQjDLMQnMFDZnlLl
85
+trMWtlwwMplMZMCZWltDpzBLBnflVLBbHzbBSGlVlL
86
+ghhqJTfmjQjfqqznznnHnBRzBLmn
87
+sQhPQsjjQcQcTsPqZWwwZcFfWrWcrZww
88
+MRVpVCZZTHWVMCHvgNvVvbQSqgQSlg
89
+NFmnrNDDfnjFnndfssmcStvjvQQlvzvllqvwQllj
90
+GGPNmBrFNdcfcGrsGcdmDFhJHMMhHLZJMhpLHCMMMMPJ
91
+DSvDGdGFlGGnDZFdVSZvfPqwnfhpnrqpPNpLPrrh
92
+sWcTjtHCsTmsCNfgMPjpfPhqhP
93
+BtHzBzChzBBvFSDJvVzFJJ
94
+sfsNrsFFBTfjwwtNNWHPVCVWtSCDDCDmmS
95
+zMdhMMZnSccMmmWVWmCPlC
96
+cLSScJZQbcvLhZvnzBwfTjrpNwNrBFffpb
97
+TBrCBgrTngVQBVbhrCtgJJrGssGsMGRGcjMcNjfN
98
+LZdSLvHMFdzFRWsLjcGRWWNJ
99
+pHpzlqPqFPvdBthgMbVPDhgh
100
+SZlnZZvBvvMrcBnllBMZSvhGMtQwFMGztthfwQtMwwPf
101
+HLqsDgNsDLDDDjggHDHszthzFbQGTghPGQPbTfFT
102
+dmLqDqCmFNjJsjHdssFNHDVWZccnRllnVZvRSBZrZlCc
103
+SccnnSGGftShfHSHHhnvbMjvVlCjzbVzzbMMTbCB
104
+gRpppNNQLWqZgPZwNWwwBMBbDlZCTzVTjHMMbBjV
105
+dqNQPQRqrqpPcGtchhdfhHSF
106
+mfDzgnNMMszBtJCpHlrjnFppCdHj
107
+LLRThGGZcbClBQpdWFGl
108
+bSqVTbBbMVMsNmNM
109
+BTTbbLVpfchmjbsj
110
+JSQJHDMHqdNZTZlhFFhCFFrNhNcsrr
111
+tMwJQlwMMlQwDDJtWGLGPpWLLGnTPn
112
+LcVQQCPPLqTzqQTcllTzhnHHfFJRcGHcFfwRGHwJjJ
113
+stdWDDBtVgbpWgZbsNgDNdWFGMnnwHfjHFpfwwMGMMGRjJ
114
+ZWSDtgNdWNBdgsdsNDDsdbDlTzCVSTCqQmSqTQSvhqLVQq
115
+dZbgdZbNtmqttFJtHHzcczMcFszHnsvH
116
+wwpQplQQwqVVjqwPjCGCSMCMcHSHvvzHMzvcsrMc
117
+pfjlQRpPRRLQWtmLNdWdmqqJ
118
+CPTPPmbjmVjVGCvzbjjPrGsnnMpttdtGdncdMccDRd
119
+lhlHzQSHwzhJLwgWgpMDMMsDdcDQMDMMns
120
+BHZghLWwSFBJJBFvzmbfjNZvZmCvmb
121
+PBGcvvcRwpwNcZcNPpPNcTHGdMtrCWrCCtCLWMtWgbVdMV
122
+fmsJjnqmmfsjQJnjFzSFSqsqgWrtMttZgMWVMbbVMdbSrLtr
123
+qQjjZFmfjZhZmwcvPhNpTNBTwN
124
+HHlVVmmsbbqMsJmVzGSBMSrQQrRrGvvnDn
125
+PZcphZPPZPhjcpdWgPZhRPfcDSrtDBSGNvtggrQtnvQNGNDn
126
+dcWwFjpcPhRcCpjwdCPLzHblJbLbzmsmbTwzqH
127
+hRfzTTfRrTGzhGWTrRrbfcQZQSttWtwddJtvdJJvWSHq
128
+npjnDjFlpDnFFNMjljCnFMQtHHtqNHNQJwwZZqstNwJJ
129
+DCjpLjjpVLDMDpVLDLQbbhzBhVrcVgVGQQcz
130
+LncLBLjCSNrNrNpCLQBBBGwqQwzlzmggvqRqgllmzwtv
131
+fMZPHhhHfthMdbRgHJzmVqlvwlwg
132
+hfsPbZFPPDsfGLcBtSFNBSjL
133
+MlZmszBMJBHrMBMbShwSFpbZSZfwwb
134
+TCLCcPNGTgTPNGWtCtcWtPcSsRfRjRwjFbfpNFDjwsFspw
135
+nVtqqsWsdHzJHqmM
136
+RCrhSmWrmrvmrvhMvRNrRCzCJcQQbPtsMZVGJJtsZssPcQcZ
137
+jLFBGqLFpqBLgZVbPbsLJQcbsV
138
+HjDljGFwrRHRRTrS
139
+GZZhnrwZBwNjRPRCbCbn
140
+fJtJJpsVfpgNTbVNFTRP
141
+JJcpLJfLdcWLdplwRdQMBvSqwRhvrG
142
+wmZDPlRlCDwglgsHtsBvdBHLFLSddr
143
+VbVMnMftfVjQWFFHdMBdBFMFHr
144
+zfjtnGqqnjGqfjPcDPlZPlRDzccw
145
+BRjhfhvRgnTMlFDDJfZzZFFQDZ
146
+qLdqcNttwwcwwSPSpqLNmrwmrZsGzzDFZGZFzVssrzJGnsQG
147
+wSNdHScScdmwHSpdNcmmtLMvChRHbvBMTBnCBBvhvlCh
148
+JgWTPfFPgCPPlCntQSGghHvQnSdQ
149
+BzvMZvLVQpdQpSZh
150
+RwVVjRDVcRDNDTlJPqTv
151
+SGHSrBBRPhPPHQcTccQTRRQjTN
152
+vvWvspCbzWVWVrWdjj
153
+wZpDzCDgDbCZJZzJGlrlqPqnqPllmH
154
+FCncCrDWMLCbjMCcFpLdzZfmZzwwWzdzNRZdWB
155
+sqsgTqHSqllNldMwlZzJ
156
+MtHPTgQhvhhqcrDrrDpjLCQc
157
+pPPvmPWSClqqPvqCmSwqmgGBWDjhGLHfjhDLJGjBBhNj
158
+zrbdcdMndcRdTrsMcbTRdzRFVHjLjDjNLNHsfDhNGjhJNhDj
159
+RdFFcnTdZcTrRRdFFbZtwQCPQglvPlwJwQPZSqqP
160
+wlmbvwmvQvWQsvmbsSsQbswlRCNPfCTcTRVCffPtTSCPNRVP
161
+FhJJJFgFqJGBtDpJhTTcVcVhdcCdCdTV
162
+GDFtgLFnqqDGqGZsQvsllrjbLjbrvw
163
+lnFSnJvmgvLlfnJpgnsjnjgfDQWqCJqZdDtDCtCtCdDrtDDQ
164
+VTBBMPFcNNtMZDMW
165
+VTGbzGGhTbTGHwVPvvFnfpvjgHnfjppp
166
+JJwHqvlvDjljDwJFlZjZDwHNNsMqhNpphNpmNVzpsnsnRV
167
+mTLgrLLcLSTTTdmPPfrrrnssNhRNWhgngzMWzgzVnM
168
+SmTfdSBbBJbtjJvljl
169
+bPNLwTCLLQQqtJsf
170
+zdnnZVlWWGGRWGWdgdSStQMqJSMRptftbsMf
171
+FWbvgvZZZZgnTmwrrhrFPCrP
172
+HcGzzszFGllHWHbZspHbHGsHTwwrTrLLCNjSZwNjNjjCCNLj
173
+PBJMJQJDDDnDggRhMdRSLmjTmTwwVjVQSvvwvC
174
+RqfdhgDPDJDqJJnBdfzWWHcstslcbtStfHzl
175
+zvRRlCqrdNdZcZpjBpVwjsmjsm
176
+fgbTDqbhGfDnLDnLLqLhFmsHpTPHjHppppBwpwws
177
+nhnnnDDngDtDbfSbDnGhhgRlNvQdQqNvQvtcQQNJRNJN
178
+cZbCcbbScCbcmPGjPfSBQQSq
179
+lnMnnVsMVvmzzGMDzPDf
180
+LhrTsTTglrnsrrWWVvlwTnNtcpZRCmhtbCZFdttZbRCp
181
+NWrFPZVWNVrvvrhtnNdddtpldmjm
182
+DcBQBDsJbCwQnbtdzmjjjljbpjbz
183
+qCDcGsDJGCcBDBcswJnBJQDfWfqgvZSvgZPfrVSWvPvZZZ
184
+vcsdHdGtHtMHMFtVsddsWCcbppZwjScLpWhbjRWR
185
+NTwrnzJrgTPrDwnlphRpjSpWbJJLLZWj
186
+TlDPfPnzzlzTBzzvQFFBHMtVtqBqqw
187
+NHnqqfZvZBNHHvgfrSlJrJCSllJRVrCn
188
+TDTdhLMWjFcddMJPSSPJRmlCPz
189
+bljWFdLLTDLtdFtLlwZvqfbgwwHfwqHNvw
190
+BRRjhRQndRNVqBjRVhFLccjpwMmLmjHmgFHH
191
+fZJfJvzPPWtWWlltZzZPpcgFMsFFwwFdpHdgwtdw
192
+PCrdrzzfWCPdvSlqTqNSDnnQVVQQGT
193
+DjbfBMDSfBljBsLSjSZbzrGtPtMCPtVPvvqrzqzG
194
+mWdJWcppcNTdpppjzjRRVrPRpq
195
+QncmnHwmdTmwQcmjNTfgfhlBShshhsffnfbB
196
+WGDsMJsrjHCWtDMGDDVQqSvZqfSJzSnvnvvv
197
+LgLFLFBFLVVzfBzMqZ
198
+lgmFcwLhNcwdwwMLwhmcRDjNpCWRsWRspGGssHCp
199
+PnPzNccnjFfvCvhbSBVcWqdhSVhV
200
+psGMDQJDDDJgQNDHHJbwqwBsVqqZVWBBhBdd
201
+DlDJDQGptpgpGDfTRnrTrFPnNTlf
202
+MSSSMLLmFHcDScSq
203
+ppZnCsbjPZpnnJcbRDmzHJqRRD
204
+pmNmnGnQNnClZGMVMdBGrMgVWg
205
+lsTTGcQzBcljCcQzGcGjGptttpmvSJtmggtwwswwtS
206
+qZRnrhMbRVdhZRhhdnnVRPbmwSNwNNHtmJBvwpvtwNSvSb
207
+VnMrqrrdqhZrnrBLLlzzlQjQjLfTcGfFDF
208
+dJJTlHvhZqZlQTJnSgQDzgsSbScsSBzc
209
+RRNtGjCCpRPPpRtjfrttRzmbscLsLZLgcsbmLzSGLB
210
+wfNttfNrtWwPNNFfRtpfrdJMTTTZTMZTTVTlVwTlvM
211
+PQTGLmdNTgPmGgNNdCPLQlrMqBrDzMCMFqDqFqjVCBCD
212
+hhRwwvpSFmzDrmFh
213
+vwwZfSfsmvtSspnZLLLdLGWPTGTQtTWG
214
+pMcWzWFvWhFpPMWzvvhpdprHTZTQrHrQdZTJdfTgQTnJ
215
+CGbjBbNjjDmRHJDgrTVVZg
216
+NNttGlGqNLsbtlhMFMFcMLwMvvZz
217
+CGSCBNCQBtBCQttBwCGtGtQrqrLrJqZHLHbqHvLDHLrq
218
+nVVhPMfVdfVPbfqLLqgDDqPvgZsv
219
+cpVncbfnhFcBltTplpmTBC
220
+MrdcdStbMnddtRBdqMnFmbqGCwqCVHVsNHwPfGVPqsCsCs
221
+DBLllzWWQQzlZVVVCsGWHfsH
222
+JQphjTgBjlLgjjpTpLgvTjQnnnSJJRRFmdbRRSdMRtmdMc
223
+QbRZMSWMblwLsgpwZzqZ
224
+BFncBrfcdNrrnVrNjsFzFTJpJLGJsGqLTp
225
+VjhDDBdrfdhQMllzHmPQMh
226
+LdVVjFVFbpVGRQGllG
227
+cNMcJNHzJWJtCWHNJHcHczWpGmmhMQmBBqrlRhBmpGpGBQ
228
+JZzTTtCZtHCJnNnNwPfbFpnfdDdLdnvP
229
+TpMlrWTTddjmlmDmgQgRtw
230
+MNNVMSsVSNSnNVMFLDqwtGgRRtGbgFRwtR
231
+CCLSCPSCZZHVCfZscBJJhPphpdpprdhjJM
232
+gSMSHJHsMMpzRgHzsRMPPSzsPhtZtZdqdDqQDhdCdZmQldht
233
+FCcCnrGcNTfvvtqqfvlflQ
234
+TrTrWNWwrTJLMzJCzWLL
235
+TpTzwMrfbrpFpMbFrrrzbPSdZmtSZRTlTZRlmdCVlCtJ
236
+vqvWgqDJQJsQCVtZgdZdRRGd
237
+vsvLJLchWBcqnvczwjLfzPjfrjzPrz
238
+zqzbqCFZgmzzmNmf
239
+vpRWSbRVbVWddVpwvwdRSwnSNgLHsnfNgMmgMLMmnrns
240
+DwWVpJRlpdbpRDWdGJGcGlhFtPPCqCCBFqZPQttlqFBq
241
+wQRlwtBJBDwttJdGvLfBvHLLfTLz
242
+MMmNZcMrcMFnRHzfjjvvHfvc
243
+FggpbFnhrNNrrMrMbMbnhQVJVhstJwqWCVCRsQJQ
244
+DQbCGblQlpQFQlHjCbjwDQQMggNmJmgnnpRBngfZmNgJMf
245
+zvhWccWVdWBchdssPrrWZZZfmsmmmgsnZZJRsRTf
246
+zBdtqPccWPHFCqCCqljq
247
+ttrbRMmgtHgfmHSfBpLfnBBZBppB
248
+CVTJDCCNPwCPDwcqzmddQZdTQdnLBQThWp
249
+zwFDjwDJJPzjzVNcVJwCcbRHGmbbMrFHgHvrsgbblG
250
+gZjjwHqHCzrMZVVR
251
+hhzcdTzPrVhVCGMb
252
+fPcmLPNffsccJDdNDjBnpwzmHqgWjHwwvg
253
+SJQFSvQBlzbSCgdPPddPPPSN
254
+pcrjcWLwwcHcgPNgTPLMNTCB
255
+pRsjsWRnrpHRmrBrHrjlbJFvvzQFnzQblQDDbJ
256
+VjQVMQPVMfVPPbGPHHbGJD
257
+pcqSttltsbDGddsCJG
258
+TSchqLtTLFhgQbMMQMrr
259
+trqzMRwNTtDzLPJQgWmjmjrf
260
+lbBQdpZbsmhGmZhmmG
261
+llVbpCplvvHBBHpnRDcDRRqnRRQnFRzT
262
+SLSSFFmzLShsVSSHnLnrJdbnRdZZbrRw
263
+qCfWBftpNWNNlqvTpwrRbGGCnwGmgRJGZn
264
+NcTBNpvWvBWpMftNffpqWlTpmzPDQPSzFVMsFQVhHsjHszss
265
+VtJtNBRBGDpdpNbC
266
+QgLncnttvFcwwhLvFjSGsSbmmQCSDdpCmpdG
267
+vLgjLhhrctMvLFFjLtMTLMgfPZqBZPZzJBBfWZZPRZZTRV
268
+mJzDJJpJBvfsGMQnBM
269
+CwPWCLRRWwRqwPqhPsrZrnrlhhQrMTrvZl
270
+dCdLLSPRLSqWqVSLqLjgJDzDmtbngFVtJtzz
271
+mtgWtMWrqjzQTTjghwwfczlNJdlcJnlc
272
+FvRsDPPFGRBFvvslwDnTlcTTdwndlh
273
+SGBZRBTsFGBRvLpvSCmgQWQjgggMrQjmmSmW
274
+GcsRrQhrVVjhRcWlnDFGGmvntDWZ
275
+TPbSgJJgBSCbCTbLHMCMTTZdFHvtZlWZDZFzmzZHZmmF
276
+gBCMCSpbPMMPjcjqQQpqQprv
277
+nZJcnZwvwzvTTTVtpDFnHH
278
+DQPBqGGGdMdTRHRBpNgFNR
279
+dCGPfhPWQdWWWCWShWPqrChWLLwLswjcvSJbvbLjJLbzJbJD
280
+QrBQtdtrQBrdtFHPrdQBDvGhLGnPnCWnmpDmLpmD
281
+NjlRJRlNzJJVbSSRVZwwJcmpWDGCWnbchnLCCmnWCG
282
+llSJzsZzMMlsSZjSjZwJNQqtHHdBFsqdfTHhqFftQB
283
+zdTJFHTdDBzrNdMnhNnNdM
284
+ZlLZZcLtVtcWtGjtzLjLZjCrnVNrnRbrQQbQSRVrRnSNqS
285
+lZtGtCvjZPCGCctPpsDDBzTHFmPmFszD
286
+mQSMvdMQtQdZhQrPWCPqPQrN
287
+RwjwnZGzJFTZgzggzJDDwJnCPPhNNqPrLhrGNcWcWNPqCq
288
+ZTzDfnwFzTngTwJvfSlMtMMlmsHmHt
289
+lZlmFRVZWmgQWhRsRpJsCJpJct
290
+PTbPTGTGwwGrbdfjNNZJvcCsCZtvpTsh
291
+bGdBBqGrdBPjDMzzVFZgqQzFFL
292
+szvsmLvppPPtzGLGWpVdTSHTNgjHQRmHTgSH
293
+FnBMBNZwZNcnDZMcnZlZgwgdQTTHjVJjHHVRQHJj
294
+DnZrFCMZMNffrLPbLsfW
295
+rJvmnBgnrCrGRSGNQR
296
+hthjNfhwctwpjTLtVLjTGSpldSCGSPdlPSRzSqSz
297
+TVcTfHNFcwtjMhTvgbHZsBbWmmZbnH
298
+WsQgstQmvQJnssWsWPzhRzhBjZBSBRZSnj
299
+qwCNqFwDrrlDrFPvRhTSPPzLRz
300
+bppqwppCddlvfbDNVgmMmtMfVVmfmVWW

+ 1
- 1
src/Day2.hs Просмотреть файл

@@ -8,7 +8,7 @@ import Day2.Part2
8 8
 day2 :: IO ()
9 9
 day2 = do
10 10
    input <- readFile "ressources/day02-input"
11
-   putStrLn "Day1"
11
+   putStrLn "Day2"
12 12
    let score1 = day2_1 input
13 13
    putStrLn ("Score of all games: " ++ show score1)
14 14
    let score2 = day2_2 input

+ 14
- 0
src/Day3.hs Просмотреть файл

@@ -0,0 +1,14 @@
1
+module Day3 (day3) where
2
+
3
+import Day3.Part1 (rearrangementPriority)
4
+import Day3.Part2 (sumOfBadgePriorities)
5
+
6
+day3 :: IO ()
7
+day3 = do
8
+   input <- readFile "ressources/day03-input"
9
+   putStrLn "Day3"
10
+   let score1 = rearrangementPriority input
11
+   putStrLn ("Sum of rearrangement priorities " ++ show score1)
12
+   let score2 = sumOfBadgePriorities input
13
+   putStrLn ("Sum of badge priorities " ++ show score2)
14
+   return ()

+ 30
- 0
src/Day3/Part1.hs Просмотреть файл

@@ -0,0 +1,30 @@
1
+module Day3.Part1 (
2
+  splitContents,
3
+  itemsInBoth,
4
+  itemPriority,
5
+  priority,
6
+  rearrangementPriority,
7
+)
8
+where
9
+
10
+import qualified Data.Set as Set
11
+import Day3.Shared
12
+
13
+
14
+splitContents :: Contents -> (Contents, Contents)
15
+splitContents c = splitAt middle c
16
+  where
17
+    middle = length c `div` 2
18
+
19
+itemsInBoth :: Contents -> Contents
20
+itemsInBoth cs = Set.toList $ leftSet `Set.intersection` rightSet
21
+  where
22
+    (left, right) = splitContents cs
23
+    leftSet = Set.fromList left
24
+    rightSet = Set.fromList right
25
+
26
+rearrangementPriority :: String -> Int
27
+rearrangementPriority input = sum priorities
28
+  where
29
+    contents = lines input
30
+    priorities = map (priority . itemsInBoth) contents

+ 32
- 0
src/Day3/Part2.hs Просмотреть файл

@@ -0,0 +1,32 @@
1
+module Day3.Part2 (
2
+  splitIntoGroups,
3
+  badgeOfGroup,
4
+  sumOfBadgePriorities,
5
+)
6
+where
7
+
8
+import Day3.Shared
9
+import Data.List.Split
10
+import qualified Data.Set as Set
11
+import Control.Lens
12
+
13
+type Group = (Contents, Contents, Contents)
14
+type Badge = Char
15
+
16
+splitIntoGroups :: String -> [Group]
17
+splitIntoGroups =  map asTriple . chunksOf 3 . lines
18
+
19
+asTriple :: [Contents] -> Group
20
+asTriple ls = (head ls, ls !! 1, ls !! 2)
21
+
22
+badgeOfGroup :: Group -> Badge
23
+badgeOfGroup g = inAll
24
+  where
25
+    (a, b, c) = over each Set.fromList g
26
+    inAll = head . Set.elems $ a `Set.intersection` b `Set.intersection` c
27
+
28
+sumOfBadgePriorities :: String -> Int
29
+sumOfBadgePriorities input = maybeSum $ map itemPriority badges
30
+  where
31
+    badges = map badgeOfGroup $ splitIntoGroups input
32
+    

+ 31
- 0
src/Day3/Shared.hs Просмотреть файл

@@ -0,0 +1,31 @@
1
+module Day3.Shared (
2
+   Contents,
3
+   Item,
4
+   itemPriority,
5
+   priority,
6
+   maybeSum
7
+   )
8
+ where
9
+import qualified Data.Map as Map
10
+
11
+type Contents = String
12
+type Item = Char
13
+
14
+
15
+
16
+itemPriority :: Item -> Maybe Int
17
+itemPriority = flip Map.lookup itemMap
18
+  where
19
+  itemMap = Map.fromList $ (['a' .. 'z'] ++ ['A' .. 'Z']) `zip` [1 .. 52]
20
+
21
+addMaybe :: Int -> Maybe Int -> Int
22
+addMaybe acc Nothing = acc
23
+addMaybe acc (Just y) = acc + y
24
+
25
+maybeSum :: [Maybe Int] -> Int
26
+maybeSum = foldl addMaybe 0
27
+
28
+priority :: Contents -> Int
29
+priority cs = maybeSum prioList
30
+  where
31
+    prioList = map itemPriority cs

+ 2
- 2
src/Lib.hs Просмотреть файл

@@ -2,8 +2,8 @@ module Lib
2 2
     ( someFunc
3 3
     ) where
4 4
       
5
-import Day2      
5
+import Day3      
6 6
 
7 7
 someFunc :: IO ()
8
-someFunc = day2
8
+someFunc = day3
9 9
 

+ 51
- 0
test/Day3Spec.hs Просмотреть файл

@@ -0,0 +1,51 @@
1
+{-# LANGUAGE QuasiQuotes #-}
2
+module Day3Spec (spec) where
3
+
4
+import Test.Hspec
5
+import Text.Heredoc
6
+import Day3.Part1
7
+import Day3.Part2
8
+
9
+inputPart1 :: String
10
+inputPart1 = [str|vJrwpWtwJgWrhcsFMMfFFhFp
11
+                 |jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
12
+                 |PmmdzqPrVvPwwTWBwg
13
+                 |wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
14
+                 |ttgJtRGJQctTZtZT
15
+                 |CrZsJsPPZsGzwwsLwLmpwMDw
16
+                 |]
17
+
18
+inputPart2 :: String                 
19
+inputPart2 = [str|vJrwpWtwJgWrhcsFMMfFFhFp
20
+                 |jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
21
+                 |PmmdzqPrVvPwwTWBwg
22
+                 |wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
23
+                 |ttgJtRGJQctTZtZT
24
+                 |CrZsJsPPZsGzwwsLwLmpwMDw
25
+                 |]
26
+
27
+spec :: Spec
28
+spec =
29
+  describe "Day2" $ do
30
+    describe "Part1" $ do
31
+      it "can determine Rucksack compartment contents" $ do
32
+        splitContents simpleContents `shouldBe` ("abc", "dec")
33
+      it "can find items that are in both compartments" $ do
34
+        itemsInBoth simpleContents `shouldBe` "c"
35
+      it "determines item priority" $ do
36
+        itemPriority 'a' `shouldBe` Just 1
37
+      it "determines priority of contents" $ do
38
+        priority "abc" `shouldBe` 1 + 2 + 3
39
+      it "determines rearangement priority" $ do
40
+        rearrangementPriority inputPart1 `shouldBe` 157
41
+    describe "Part2" $ do
42
+      it "can split into groups" $ do
43
+        length groups `shouldBe` 2
44
+      it "can determine the badge of each group" $ do
45
+        map badgeOfGroup groups `shouldBe` "rZ"
46
+      it "determine the sum of badge priorities" $ do
47
+        sumOfBadgePriorities inputPart2 `shouldBe` 70
48
+  where
49
+    simpleContents = "abcdec"
50
+    groups = splitIntoGroups inputPart2
51
+    

Загрузка…
Отмена
Сохранить