tools/hashTest.hs
author Wuzzy <Wuzzy2@mail.ru>
Wed, 04 Apr 2018 21:34:09 +0200
changeset 13315 af229e3d274a
parent 9464 901e363d5837
permissions -rw-r--r--
Remove “mission accomplished” victory message, might be confusing For example, if this appears in an actual mission when the player fails.

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