11 part1 = length $ filter inRange $ filter adjacentSame candidates
12 part2 = length $ filter inRange $ filter isolatedAdjacentSame candidates
14 inRange digits = n >= lowerLimit && n <= upperLimit
15 where n = numify digits
17 numify :: (Int, Int, Int, Int, Int, Int) -> Int
18 numify (d1, d2, d3, d4, d5, d6) =
19 d1 * 10^5 + d2 * 10^4 + d3 * 10^3 + d4 * 10^2 + d5 * 10 + d6
21 adjacentSame (d1, d2, d3, d4, d5, d6) =
22 d1 == d2 || d2 == d3 || d3 == d4 || d4 == d5 || d5 == d6
24 isolatedAdjacentSame (d1, d2, d3, d4, d5, d6) =
25 (d1 == d2 && d2 /= d3)
26 || (d1 /= d2 && d2 == d3 && d3 /= d4)
27 || (d2 /= d3 && d3 == d4 && d4 /= d5)
28 || (d3 /= d4 && d4 == d5 && d5 /= d6)
29 || (d4 /= d5 && d5 == d6)
32 candidates = [ (d1, d2, d3, d4, d5, d6)