import Data.Bits (xor)
import qualified Data.Map.Strict as M
import qualified Data.Graph as G
-
+import Control.Parallel.Strategies (parMap, rpar)
type CellMap = M.Map (Int, Int) Bool
puzzleKey = "xlqgujun"
part1 :: String -> Int
part1 key = sum rowCounts
- where binHashes = map binHash $ rowSpecs key
- rowCounts = map countSetBits binHashes
+ where rowCounts = parMap rpar countSetBits $ binHashes key
part2 :: String -> Int
part2 key = length $ cellEdges cells
- where binHashes = map binHash $ rowSpecs key
- cells = presentCells binHashes
+ where cells = presentCells $ binHashes key
+
+binHashes :: String -> [String]
+binHashes key = parMap rpar binHash $ rowSpecs key
+
binHash :: String -> String
binHash = binify . knotHash
presentCells :: [String] -> CellMap
-presentCells binHashes = M.fromList [((r, c), True) | r <- [0..127], c <- [0..127], (binHashes!!r)!!c == '1']
+presentCells bhs = M.fromList [((r, c), True) | r <- [0..127], c <- [0..127], (bhs!!r)!!c == '1']
adjacentCells :: CellMap -> (Int, Int) -> [(Int, Int)]
adjacentCells cells (r, c) = filter (\k -> M.member k cells) possibles