Racer: Fix weird water splashes after waypoint placement
Does not affect official racer, as only waypoint placement is touched.
The reason was that the air attack gear sometimes was not deleted fast enough so it might occassionally drop some air bombs (these are deleted now). Also, the airplane position was set to water level, which caused another water splash.
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