Advertisement
Guest User

Untitled

a guest
Dec 15th, 2023
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import Aoc
  2. import qualified Data.Vector as V
  3. import qualified Data.Map.Strict as M
  4. import Data.Function.Memoize
  5. import Debug.Trace
  6.  
  7. type Rx = (String, [Int])
  8. type Memo = M.Map Rx Int
  9.  
  10. parse :: String -> [Rx]
  11. parse = map lineToRx . lines
  12.   where
  13.     lineToRx l = (head splits, (map read . splitOn "," . last) splits)
  14.       where
  15.         splits = splitOn " " l
  16.  
  17. noDots :: Int -> String -> Bool
  18. noDots i = (all (/='.')) . (take i)
  19.  
  20. noHashs :: String -> Bool
  21. noHashs = all (/='#')
  22.  
  23. noHashAtPos :: Int -> String -> Bool
  24. noHashAtPos i = noHashs . take 1 . drop i
  25.  
  26. countRecursive :: Rx -> Int
  27. countRecursive = memoize countCorrect
  28.  
  29. countCorrect :: Rx -> Int
  30. countCorrect (s,         [])      = fromEnum (noHashs s || length s == 0)
  31. countCorrect (s, xs)
  32.   | sum xs > length s || s == ""  = 0
  33. countCorrect (('#':s), (x:xs))    = if noDots (x-1) s && noHashAtPos (x-1) s then countRecursive (drop (x) s, xs) else 0
  34. countCorrect (('.':s),   xs)      =  countRecursive (s, xs)
  35. countCorrect (('?':s),   xs)      = (countRecursive (s, xs)) + (countRecursive (('#':s), xs))
  36.  
  37. solve :: [Rx] -> Int
  38. solve = sum . map countRecursive
  39.  
  40. solve2 :: [Rx] -> Int
  41. solve2 = solve . map mapRx
  42.   where
  43.     mapRx (s, seqs) = (intercalate "?" (replicate 5 s), concat (replicate 5 seqs))
  44.  
  45. main :: IO ()
  46. main = interact ((++"\n") . show . solve2 . parse)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement