An slightly different way to approach it
[advent-of-code-19.git] / advent04 / src / advent04.hs
1
2 main :: IO ()
3 main = do
4 print part1
5 print part1a
6 print part2
7
8 lowerLimit = 134792
9 upperLimit = 675810
10
11
12 part1 = length $ filter inRange $ filter adjacentSame candidates
13 part1a = length $ filter (>= lowerLimit)
14 $ filter (<= upperLimit)
15 $ map numify
16 $ filter adjacentSame candidates
17 part2 = length $ filter inRange $ filter isolatedAdjacentSame candidates
18
19 inRange digits = n >= lowerLimit && n <= upperLimit
20 where n = numify digits
21
22 numify :: (Int, Int, Int, Int, Int, Int) -> Int
23 numify (d1, d2, d3, d4, d5, d6) =
24 d1 * 10^5 + d2 * 10^4 + d3 * 10^3 + d4 * 10^2 + d5 * 10 + d6
25
26 adjacentSame (d1, d2, d3, d4, d5, d6) =
27 d1 == d2 || d2 == d3 || d3 == d4 || d4 == d5 || d5 == d6
28
29 isolatedAdjacentSame (d1, d2, d3, d4, d5, d6) =
30 (d1 == d2 && d2 /= d3)
31 || (d1 /= d2 && d2 == d3 && d3 /= d4)
32 || (d2 /= d3 && d3 == d4 && d4 /= d5)
33 || (d3 /= d4 && d4 == d5 && d5 /= d6)
34 || (d4 /= d5 && d5 == d6)
35
36
37 candidates = [ (d1, d2, d3, d4, d5, d6)
38 | d1 <- [1..6]
39 , d2 <- [d1..9]
40 , d3 <- [d2..9]
41 , d4 <- [d3..9]
42 , d5 <- [d4..9]
43 , d6 <- [d5..9]
44 ]
45