Advent of Code 2022 fan bonus

As a quick bonus, user MBoffin on Reddit posted about a bonus puzzle their daughter made.

It seemed like a good fit for Haskell, so I decided to have a go.

Finding the duplicated characters slotted directly into Haskell's list- and stream-processing idioms, so I used Data.List's group function to split the string into a list of strings, then threw away all the groups that were only one character long.

After that, it was a filter to pull out just the characters I wanted.

I had to define my own isLetterIsh predicate to find letters and dashes, as needed for part 1.

main :: IO ()
main = 
  do  dataFileName <- getDataFileName
      text <- readFile dataFileName
      let duplicated = fmap head $ filter ((> 1) . length) $ group text
      putStrLn $ filter isLetterIsh duplicated
      putStrLn $ filter isDigit duplicated

isLetterIsh :: Char -> Bool
isLetterIsh c = (isLetter c) || (c == '-')

Code

You can get the code from my locally-hosted Git repo, or from Gitlab.