tools/hashTest.hs
author Wuzzy <almikes@aol.com>
Mon, 25 Sep 2017 15:34:07 +0200
changeset 12509 6dbdb6fab2f9
parent 9464 901e363d5837
permissions -rw-r--r--
Remove explicit (and redundant) SD message in ACF mission 6 The SD message is already handld properly by the engine, no need to repeat it in Lua.

module Test where

import Control.Monad
import Data.Word
import qualified Data.IntSet as IS

data OP = Sum
        | Mul
        | Sub
    deriving Show


genOps :: 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] -> Int
hash 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 s


test = 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