git.haldean.org aoc-2018 / 2a49031
day 2 done! and committed late. Haldean Brown 3 years ago
2 changed file(s) with 287 addition(s) and 0 deletion(s). Raw diff Collapse all Expand all
0 import qualified Data.Map.Strict as M
1 import Control.Monad
2 import System.Environment
3
4 freqs :: String -> M.Map Char Integer
5 freqs = foldl (\m c -> M.alter inc c m) M.empty where
6 inc (Just v) = Just $ v + 1
7 inc Nothing = Just 1
8
9 counts :: String -> (Integer, Integer)
10 counts s = let f = M.elems $ freqs s in
11 (if elem 2 f then 1 else 0, if elem 3 f then 1 else 0)
12
13 checksum :: [String] -> Integer
14 checksum ss = let pairs = unzip $ map counts ss in (sum $ fst pairs) * (sum $ snd pairs)
15
16 allpairs :: [String] -> [(String, String)]
17 allpairs ss = concat $ map (\s1 -> map (\s2 -> (s1, s2)) ss) ss
18
19 match :: String -> String -> Maybe String
20 match s1 s2 =
21 let pairwise = map (\(a, b) -> a == b) (zip s1 s2)
22 in if (length $ filter not pairwise) == 1 then Just $ map snd $ filter fst $ zip pairwise s1 else Nothing
23
24 findmatch :: [String] -> Maybe String
25 -- msum here takes the first Just
26 findmatch ss = msum $ map (uncurry match) $ allpairs ss
27
28 main1 :: IO ()
29 main1 = fmap (checksum . lines) (readFile "input.txt") >>= print
30
31 main2 :: IO ()
32 main2 = fmap (findmatch . lines) (readFile "input.txt") >>= print
33
34 -- runs the first or second challenge depending on the command line argument
35 main :: IO ()
36 main = fmap head getArgs >>= \a -> if a == "1" then main1 else main2
0 cvfueihajytpmrdkgsxfqplbxn
1 cbzueihajytnmrdkgtxfqplbwn
2 cvzucihajytomrdkgstfqplqwn
3 cvzueilajytomrdkgsxfqwnbwn
4 cvzueihajytomrdkgsgwqphbwn
5 wuzuerhajytomrdkgsxfqplbwn
6 cyzueifajybomrdkgsxfqplbwn
7 cvzueihajxtomrdkgpxfqplmwn
8 ivzfevhajytomrdkgsxfqplbwn
9 cvzueihajytomrdlgsxfqphbbn
10 uvzueihajjtomrdkgsxfqpobwn
11 cvzupihajytomrdkgsxfqplpwe
12 cvzueihajyvomrdkgsxfqplbrl
13 cczueihajytomrdkgsnfqpxbwn
14 cvzueigajytdmrdkgsxyqplbwn
15 cvzujihljytomrdkgsxuqplbwn
16 cvzueisajytomrddgsxkqplbwn
17 cvzneihajytomrdkgsgaqplbwn
18 cvzueihajytomrdkgsinmplbwn
19 cveueihajyromrdkgsxfqplown
20 cypueihajytotrdkgzxfqplbwn
21 cvzuoihajytomvdqgsxfqplbwn
22 cvzuekhejytwmrdkgsxfqplbwn
23 cvzseihajytomrdkgsxfqgmbwn
24 cvfuhihajytomrdkgsxfqplbwi
25 cvzueihujxtomrdkgsufqplbwn
26 cvzueihdjytomrdogsxfqplbwh
27 cvzueihdjyfohrdkgsxfqplbwn
28 cvtudihajytolrdkgsxfqplbwn
29 cvzueihajytymrdkgshzqplbwn
30 cvzuebhajytomxdkgsxfqplbwt
31 cvzulihajyxomrdkgsbfqplbwn
32 cvzueihajywomrdkgsxfqplbts
33 cvzueihajytouodkdsxfqplbwn
34 cvzueihajytomgdkgqxfqklbwn
35 cvzubihajytomvdkgsxfqplmwn
36 cvhueihajyyocrdkgsxfqplbwn
37 zvzueihajytourdkgsxflplbwn
38 cvzbeihajytomadkgsxfoplbwn
39 cvzueihajytomrdkgnxfqplbsl
40 cvfueihajftkmrdkgsxfqplbwn
41 cvzuexhajytomryugsxfqplbwn
42 cvzueihajytomsckgsxfqalbwn
43 cvzuexhajytomrdkbsxfqpluwn
44 cvzueihajytbmrtkgsxwqplbwn
45 cvzueihajytomrdigsxfqqlbsn
46 cvzweihajytomydkgsxfmplbwn
47 bvzteihajytimrdkgsxfqplbwn
48 cvzueihajytpmrdkgsxfcpbbwn
49 cvzueigsjltomrdkgsxfqplbwn
50 cvzueihajytomrikgsxfopldwn
51 cvzueihajstomrdkgsxfqplgon
52 cvzueimajytomrnkxsxfqplbwn
53 cvzleihagatomrdkgsxfqplbwn
54 cvbueihajotomrdkgsxfqjlbwn
55 cvzueihajytomrdkgsxfqppnvn
56 hvzueihajytomrdkghxfkplbwn
57 cvzueigajytxmrdkgsxfqplbjn
58 cvzueihaaxtokrdkgsxfqplbwn
59 cvzueihajyeomrdkgujfqplbwn
60 cvzueiwajpoomrdkgsxfqplbwn
61 cvzieidtjytomrdkgsxfqplbwn
62 cvzueihalytomrakbsxfqplbwn
63 wtzueihajytomrdkgsxfqplbwq
64 cvzuelhaiytomrdkgsxfqplcwn
65 cvzueihajytomrdkgsxfqslswd
66 cvzueihajytomrykgssfqplbon
67 cvzueihfjytovrdegsxfqplbwn
68 cvzueihajytomldqgsxfqplbwy
69 cvzleihjjytomrtkgsxfqplbwn
70 cvzueihaldtomrdtgsxfqplbwn
71 cvzueihajytzmrdkgsxfeplqwn
72 cvzueihrjytomddkgsxfqpgbwn
73 cyzulihajytokrdkgsxfqplbwn
74 cvsueihajytoordfgsxfqplbwn
75 fvzueyhajytomrdkgaxfqplbwn
76 cczueihajytobrdkgsefqplbwn
77 cvzueihajytomcdrgscfqplbwn
78 cvzuexhajyvomrdkgssfqplbwn
79 cvzsmihajyiomrdkgsxfqplbwn
80 cvzzeihajttomrdkgsxzqplbwn
81 cvzseihajytomrdkgsxfqpebvn
82 cvzueihajgthmrdkgsbfqplbwn
83 ruzueihajytomrdkgsxfqphbwn
84 cvzueihajytofrdkgsnfrplbwn
85 cvzuetdajytojrdkgsxfqplbwn
86 fvzueihajytomrdkghxfqpobwn
87 cvzueihsjytomrdkgsxfqglbxn
88 cvzueihajytowrdkgsxfqpsbun
89 cvzteihaiytomrdkfsxfqplbwn
90 cvzueihajytkmrdkrsxfqplvwn
91 cvzueihajyoomrdkasxfqjlbwn
92 lvzurihajytkmrdkgsxfqplbwn
93 cvzueihajyyomrdagsxfqelbwn
94 cvfueihajytomrdkgsxfqplbbx
95 cvwueihajytommdkgkxfqplbwn
96 cvzucicajytomrdkgsxcqplbwn
97 dvzueihahytgmrdkgsxfqplbwn
98 cvzuechajytomrdkgsxfqelwwn
99 cvzuekhajytomrdkgsxknplbwn
100 cvtueihajytomphkgsxfqplbwn
101 cvzueihabytnzrdkgsxfqplbwn
102 cvzusihajytomrdkgfxfqplban
103 cvfueihajytomcdfgsxfqplbwn
104 mvzueihapytomrdkgsxfdplbwn
105 cvzueihajytomhdkgsxmqppbwn
106 jvsueihajytomrdkgsxfqplbln
107 cvzujihajybomrdkgsxtqplbwn
108 cvzuekhawytomrdkgsxfqplbwc
109 svzueihanytomrdogsxfqplbwn
110 cvzujihajytodrdkgslfqplbwn
111 cvgdeihajytorrdkgsxfqplbwn
112 cvzbeihajytoprdkgsxfqplbyn
113 cvzueihkyytomjdkgsxfqplbwn
114 cvzuelhojytomrdkgsxfqjlbwn
115 evzueihajytimrdkgsxfqpsbwn
116 cvzueihajydomrdkjsxfqplbjn
117 ovzteihajytosrdkgsxfqplbwn
118 cvzueihajyaomrdzgsxfqplbgn
119 cvzuewhajmtomrdkgsufqplbwn
120 cvzueihajqtomhukgsxfqplbwn
121 cvzueihajytomzqkgsxfqplbwk
122 cazuewhakytomrdkgsxfqplbwn
123 clzueihatytomrdkgzxfqplbwn
124 dvzueihajytomqdkgsxfqpnbwn
125 cvzueidajdtomrdkgsxtqplbwn
126 cvzueihabytowrdkgsxoqplbwn
127 cvzujihwjytomrdkgsxeqplbwn
128 cvtuedhajytomrdkgsxfqplbbn
129 cvzueihajcgomrdkgsxfqplswn
130 cvzuephajyiomrdngsxfqplbwn
131 cvzueihajythmqdkgsxfqplbwf
132 cvzueitajytomrdkgsxfepvbwn
133 cvzueihajytomydkgsxfqplvwb
134 dvzueshajytomrddgsxfqplbwn
135 cvzueihajytomrdkgvxfqpwben
136 cvzueihajytomrdkgvxfpplwwn
137 cvzuefhajftomrdkgsxfqrlbwn
138 cvzueihajytpmrvkgsxfqplbcn
139 cvzueihajytohrdkgsxfqxnbwn
140 cvzueihajytomrdposxfqulbwn
141 cozueihajytomrpkgsxfqrlbwn
142 cvzuuihaxytomrdkgsxfqplbtn
143 cvzueihajytomrbzgsxyqplbwn
144 cveueihajyxoqrdkgsxfqplbwn
145 cvzueihajytomrkkgsxfqptbrn
146 cvzuezhajatomrdkssxfqplbwn
147 cpzueihajytomrdkgsxfhplbwo
148 lviueihajytomrekgsxfqplbwn
149 cvzueihwjytomrdkusxfyplbwn
150 cvzgeihajytomwdkgsxfrplbwn
151 cvzsejhzjytomrdkgsxfqplbwn
152 cvzuuihajytomrdkgsxfqdlbwz
153 cvzjeihajytomrdugsxftplbwn
154 cvzueihaxytomrrkgsxfmplbwn
155 cvzueihajgtomrdhgsxfqplwwn
156 cvzulihajytomedkgsxfqplewn
157 cvzueivajytomrdkmsxfqplbwc
158 cvzuervajytomrdkgsxfwplbwn
159 cvzuemhcjytomrdkgslfqplbwn
160 cvzyerhauytomrdkgsxfqplbwn
161 cvzueihaoytomrdkgsyfqplewn
162 cvzueihanytomrdkgsafkplbwn
163 cvzueihajvtomrdugsxfqpcbwn
164 chzueihajytamrdxgsxfqplbwn
165 cvzueihalytomrdsgsxfqplbln
166 cvzueihajytoyaykgsxfqplbwn
167 tlzueihajyeomrdkgsxfqplbwn
168 cvpueihajytbmrdkgsxfxplbwn
169 cvzueihajytomjdkgsxuqplkwn
170 cvzueihajygomrdkgkxfqplbwg
171 cvzueihajhtomrdkgbxsqplbwn
172 cvzurihajytomrdkgsafqplbwx
173 cdzuezhajytomrdkgsxrqplbwn
174 cvbueihajytotrwkgsxfqplbwn
175 cwzkeihajytomrdkgsxfqplbwh
176 cvzheihajytolrikgsxfqplbwn
177 cozuevhajytomrdkgkxfqplbwn
178 chzueihajytomrjkgsxfqulbwn
179 cvzueihkjyromrdkgsxvqplbwn
180 cvzveihajytomrdkgsxpqplnwn
181 cvzueihajytoirdkgsxfqihbwn
182 cvoueihajytomrdkgsxfqpdawn
183 pvzueihajytomrdkgnxfqplbfn
184 cvzueihakytomxdkgssfqplbwn
185 cvzueivajytomrdbgsxaqplbwn
186 cvzueihajytokrdkgszrqplbwn
187 cvzuevhajytomrdkgsxgqplbwi
188 cvzueihajylomrdkgsxflplbpn
189 hvzueihajytomvdkgsxfqplgwn
190 cvzleihajytymrrkgsxfqplbwn
191 crzueieajytomrdkgsxfqplbon
192 cszueihajytomrdlgqxfqplbwn
193 cvzueihacytomrdkgsxfjblbwn
194 cvzreihajytomrdkgsxfqplzun
195 cvzurihajytomrdkgsxiqplawn
196 uvzueihajyhovrdkgsxfqplbwn
197 cvzueihajyqodrdkgssfqplbwn
198 cvzwiihrjytomrdkgsxfqplbwn
199 cqzueihajytomrdkgjxfqplban
200 cvmueihajytoordkgsxfqplbyn
201 cypueihajytomrdkgzxfqplbwn
202 cvzueihajykomrdkgsmfqplbtn
203 cvzueidajytimrdkgsxfqpdbwn
204 cvzheihajytomrdkgsxfqpfewn
205 dvzueihajytumrdzgsxfqplbwn
206 cvzueixajytomrdkgsvfqplgwn
207 cvzuevhzjyzomrdkgsxfqplbwn
208 cvyeeihajytomrdkgsxnqplbwn
209 cvzueihajytomrdkggtpqplbwn
210 cvzceiyajytomrdkgexfqplbwn
211 cvzuelhajyyomrdkzsxfqplbwn
212 cvzhzihajygomrdkgsxfqplbwn
213 cvzueihwjytomrdkgsgfqplbrn
214 cvzsevhajytomrdkgqxfqplbwn
215 cvzueiuajytomrdkgsxfppebwn
216 nvzueihajytemrdkgsxwqplbwn
217 cvzueihajytocgdkgsxfqvlbwn
218 cczusihajytomrdkgsxfqplbpn
219 cmzueihajytomrdkbsxwqplbwn
220 cvzumfdajytomrdkgsxfqplbwn
221 cvzueihcjytomrdkgsxfqplbkl
222 cvzueihajytomawknsxfqplbwn
223 kvzueihijytomrdkgsxdqplbwn
224 cdzutihajytomrdkgsxfkplbwn
225 cvzufihadylomrdkgsxfqplbwn
226 cvzueihajytomrgkxsxfqphbwn
227 cvzuewhajyzomrdkgsxfqelbwn
228 cvzueihajytomrdkgqxfqelbwc
229 cvzueshajyoomrdkgsxfqflbwn
230 cvzueihajyromrekgixfqplbwn
231 chzugihajytomrdkgsxfqplawn
232 cvzueihajytomrdkgsxfhpmbwy
233 cvzueihacytodxdkgsxfqplbwn
234 cvzurihajytourdkgsdfqplbwn
235 cvzzeihmjytomrddgsxfqplbwn
236 cvzucyhajygomrdkgsxfqplbwn
237 ckzueihzjytomrdkgsxwqplbwn
238 cvlueihajmtozrdkgsxfqplbwn
239 cvzkeihajytomrdkgsxfqclbwc
240 cvzueihajytomrdkgsxgdplbwa
241 cvzueihyjytoxrdkgcxfqplbwn
242 cvzueizavytomfdkgsxfqplbwn
243 cvzueihajwtosrdkgsxfqllbwn
244 cvzueihajytomrdaksxfqpllwn
245 cvzuuihojytombdkgsxfqplbwn
246 cvzuiibajytpmrdkgsxfqplbwn
247 cvzueihajyuomydkgsxfqplzwn
248 cvzueihajytimrmkgsxfqplfwn
249 cvzueihajytomrdkgzxfqpljwo