Advent of Code 2025

Day 2

Changed files
+42 -2
src
+42 -2
src/Day2.hs
···
module Day2 where
+
import Debug.Trace
+
+
split :: Char -> String -> [String]
+
split c s = case dropWhile (== c) s of
+
"" -> []
+
s' -> w : split c s''
+
where (w, s'') = break (== c) s'
+
+
isPartOneCandidate :: Int -> Bool
+
isPartOneCandidate n =
+
let s = show n
+
d = length s
+
in take (d `div` 2) s == drop (d `div` 2) s
+
+
isPartTwoCandidate :: Int -> Bool
+
isPartTwoCandidate n =
+
let s = show n
+
d = length s
+
cands = [concat $ replicate k $ take (d `div` k) s | k <- [2..d]]
+
in any (== s) cands
+
+
parseEntry :: [String] -> (Int, Int)
+
parseEntry (a : b : _) = (read a, read b)
+
parseEntry _ = error "Unreachable "
+
+
parse :: String -> [(Int, Int)]
+
parse s =
+
map (parseEntry . split '-') $
+
split ',' s
+
part1 :: String -> String
-
part1 _ = "Day 2 part 1"
+
part1 input = show $
+
sum $
+
filter isPartOneCandidate $
+
concat $
+
map (\(a,b) -> [a..b]) $
+
parse input
part2 :: String -> String
-
part2 _ = "Day 2 part 2"
+
part2 input = show $
+
sum $
+
filter isPartTwoCandidate $
+
concat $
+
map (\(a,b) -> [a..b]) $
+
parse input