Skip to content

Commit b679a18

Browse files
committed
Solve day 14
1 parent bb89db6 commit b679a18

File tree

3 files changed

+160
-0
lines changed

3 files changed

+160
-0
lines changed

2021/14/input.txt

+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
CKFFSCFSCBCKBPBCSPKP
2+
3+
NS -> P
4+
KV -> B
5+
FV -> S
6+
BB -> V
7+
CF -> O
8+
CK -> N
9+
BC -> B
10+
PV -> N
11+
KO -> C
12+
CO -> O
13+
HP -> P
14+
HO -> P
15+
OV -> O
16+
VO -> C
17+
SP -> P
18+
BV -> H
19+
CB -> F
20+
SF -> H
21+
ON -> O
22+
KK -> V
23+
HC -> N
24+
FH -> P
25+
OO -> P
26+
VC -> F
27+
VP -> N
28+
FO -> F
29+
CP -> C
30+
SV -> S
31+
PF -> O
32+
OF -> H
33+
BN -> V
34+
SC -> V
35+
SB -> O
36+
NC -> P
37+
CN -> K
38+
BP -> O
39+
PC -> H
40+
PS -> C
41+
NB -> K
42+
VB -> P
43+
HS -> V
44+
BO -> K
45+
NV -> B
46+
PK -> K
47+
SN -> H
48+
OB -> C
49+
BK -> S
50+
KH -> P
51+
BS -> S
52+
HV -> O
53+
FN -> F
54+
FS -> N
55+
FP -> F
56+
PO -> B
57+
NP -> O
58+
FF -> H
59+
PN -> K
60+
HF -> H
61+
VK -> K
62+
NF -> K
63+
PP -> H
64+
PH -> B
65+
SK -> P
66+
HN -> B
67+
VS -> V
68+
VN -> N
69+
KB -> O
70+
KC -> O
71+
KP -> C
72+
OS -> O
73+
SO -> O
74+
VH -> C
75+
OK -> B
76+
HH -> B
77+
OC -> P
78+
CV -> N
79+
SH -> O
80+
HK -> N
81+
NO -> F
82+
VF -> S
83+
NN -> O
84+
FK -> V
85+
HB -> O
86+
SS -> O
87+
FB -> B
88+
KS -> O
89+
CC -> S
90+
KF -> V
91+
VV -> S
92+
OP -> H
93+
KN -> F
94+
CS -> H
95+
CH -> P
96+
BF -> F
97+
NH -> O
98+
NK -> C
99+
OH -> C
100+
BH -> O
101+
FC -> V
102+
PB -> B

2021/14/main.hs

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import qualified Data.Map.Strict as Map
2+
import Data.List (sort, group)
3+
import Control.Arrow ((&&&))
4+
5+
type Template = Map.Map String Char
6+
type FreqMap = Map.Map String Int
7+
type CountMap = Map.Map Char Int
8+
9+
parseInput :: String -> (String, Template)
10+
parseInput l = (start, Map.fromList $ map f patterns)
11+
where (start:_:patterns) = lines l
12+
f p = let [l, _, r] = words p in (l, head r)
13+
14+
freqMap :: String -> Template -> FreqMap
15+
freqMap [_] m = Map.empty
16+
freqMap (l:s@(r:_)) m = add [l, r] 1 $ freqMap s m
17+
18+
step :: [(String, Int)] -> Template -> FreqMap -> CountMap -> (FreqMap, CountMap)
19+
step [] templ freq count = (freq, count)
20+
step ((p@[l,r],i):ss) templ freq count = step ss templ freq' count'
21+
where x = templ Map.! p
22+
p'l = [l, x]
23+
p'r = [x, r]
24+
freq' = add p'r i $ add p'l i $ sub p i freq
25+
count' = add x i count
26+
27+
get k = maybe 0 id . Map.lookup k
28+
add k n m = Map.insert k (get k m + n) m
29+
sub k n m = Map.insert k (get k m - n) m
30+
31+
main = parseInput <$> readFile "input.txt"
32+
>>= \i -> mapM_ print [f 10 i, f 40 i]
33+
where
34+
f n (s, templ) = diff $ snd $ foldl (const . g) (freq, count) [1..n]
35+
where
36+
freq = freqMap s templ
37+
count = Map.fromList $ map (head &&& length) $ group $ sort s
38+
g (s, x) = step (Map.toList s) templ s x
39+
diff m = maximum l - minimum l
40+
where l = Map.elems m

2021/14/test.txt

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
NNCB
2+
3+
CH -> B
4+
HH -> N
5+
CB -> H
6+
NH -> C
7+
HB -> C
8+
HC -> B
9+
HN -> C
10+
NN -> C
11+
BH -> H
12+
NC -> B
13+
NB -> B
14+
BN -> B
15+
BB -> N
16+
BC -> B
17+
CC -> N
18+
CN -> C

0 commit comments

Comments
 (0)