fixing the remaining PChar issues pas2c ran into to this point, now it stops because of being unable to deal with "set of char"
module Test whereimport Control.Monadimport Data.Wordimport qualified Data.IntSet as ISdata OP = Sum | Mul | Sub deriving ShowgenOps :: Int -> [[OP]]genOps 1 = [[Sum], [Mul], [Sub]]genOps n = [a : as | a <- [Sum, Mul, Sub], as <- genOps (n - 1)]genPos :: Int -> Int -> [[Int]]genPos m 1 = map (:[]) [-m..m - 1]genPos m n = [a : as | a <- [-m..m - 1], as <- genPos m (n - 1)]hash :: [Int] -> [OP] -> [Int] -> Inthash poss op s = foldl applyOp s' (zip ss op) where applyOp v (n, Sum) = (v + n) `mod` 256 applyOp v (n, Mul) = (v * n) `mod` 256 applyOp v (n, Sub) = (v - n) `mod` 256 (s' : ss) = map (\p -> if p >= 0 then s !! p else s !! (l + p)) poss l = length stest = do a <- liftM lines getContents let w = minimum $ map length a let opsNum = 4 let opsList = genOps (opsNum - 1) let posList = genPos w opsNum let target = length a let wordsList = map (map fromEnum) a let hashedSize = IS.size . IS.fromList print $ length a putStrLn . unlines . map show $ filter (\l -> fst l == length a) $ [(hs, (p, o)) | p <- posList, o <- opsList, let hs = hashedSize . map (hash p o) $ wordsList]didIunderstand' = do a <- liftM lines getContents print $ length a print . IS.size . IS.fromList . map (testHash . map fromEnum) $ a where testHash s = let l = length s in ( (s !! (l - 2) * s !! 1) + s !! (l - 1) - s !! 0 ) `mod` 256