@ -0,0 +1,44 @@ | |||
{-# LANGUAGE OverloadedStrings, DeriveGeneric #-} | |||
module JSONDeser where | |||
import Data.Maybe | |||
import Data.ByteString.Lazy | |||
import Data.Aeson | |||
import GHC.Generics | |||
data Cell = Cell { x :: Int, y :: Int} | |||
deriving (Show, Generic) | |||
data Unit = Unit { members :: [Cell], pivot :: Cell} | |||
deriving (Show, Generic) | |||
data Input = Input { id :: Int, | |||
units :: [Unit], | |||
width :: Int, | |||
height :: Int, | |||
filled :: [Cell], | |||
sourceLength :: Int, | |||
sourceSeeds :: [Int] | |||
} | |||
deriving (Show, Generic) | |||
instance FromJSON Cell | |||
instance ToJSON Cell | |||
instance FromJSON Unit | |||
instance ToJSON Unit | |||
instance FromJSON Input | |||
instance ToJSON Input | |||
readInputInternal :: ByteString -> Input | |||
readInputInternal str = if isJust result | |||
then fromJust result | |||
else error "Error during JSON parsing" | |||
where | |||
result = (decode str :: Maybe Input) | |||
@ -0,0 +1,19 @@ | |||
module LCG where | |||
import Data.Bits | |||
modulus = 2^32 | |||
multiplier = 1103515245 | |||
increment = 12345 | |||
shiftval = 16 | |||
andmask = 0x7FFF | |||
lcg_pseudorandom_internal :: Integer -> [Integer] | |||
lcg_pseudorandom_internal n = pseudo_val:(lcg_pseudorandom_internal n_new) | |||
where n_new = (multiplier * n + increment) `mod` modulus | |||
pseudo_val = (shiftR n shiftval) .&. andmask | |||
--take a seed, a length of units vector and number of units and give a vector of orders | |||
lcg :: Int -> Int -> Int -> [Int] | |||
lcg seed len num = map (\x -> fromInteger (x `mod` toInteger len)) finite_vec | |||
where finite_vec = take num (lcg_pseudorandom_internal (toInteger seed)) |
@ -0,0 +1,54 @@ | |||
module Opt(parseArgs,Options(..)) where | |||
import System.Console.GetOpt | |||
import Data.Maybe | |||
-- import Vm | |||
data Flag = File String | |||
| Time Int | |||
| Mem Int | |||
| PowerPhrase String | |||
deriving Show | |||
data Options = Options { optFile :: [String] | |||
, optTime :: Maybe Int | |||
, optMem :: Maybe Int | |||
, optPowerPhrase :: Maybe String | |||
} | |||
deriving Show | |||
startOptions = Options { optFile = [] | |||
, optTime = Nothing | |||
, optMem = Nothing | |||
, optPowerPhrase = Nothing | |||
} | |||
options :: [ OptDescr (Options -> IO Options) ] | |||
options = [ Option "f" ["filename"] | |||
(ReqArg | |||
(\arg opt -> return opt { optFile = (arg:(optFile opt)) }) | |||
"FILE") | |||
"Input Filename" | |||
, Option "t" ["timelimit"] | |||
(ReqArg | |||
(\arg opt -> return opt { optTime = Just (read arg) }) | |||
"TIMELIMIT") | |||
"Time Limit in seconds" | |||
, Option "m" ["memlimit"] | |||
(ReqArg | |||
(\arg opt -> return opt { optMem = Just (read arg) }) | |||
"MEMLIMIT") | |||
"Memory Limit in MB" | |||
, Option "p" ["phrasepower"] | |||
(ReqArg | |||
(\arg opt -> return opt { optPowerPhrase = Just arg }) | |||
"POWERPHRASE") | |||
"Power Phrase" | |||
] | |||
parseArgs :: [String] -> IO Options | |||
parseArgs args = do | |||
let (actions, _, _) = getOpt RequireOrder options args | |||
opts <- foldl (>>=) (return startOptions) actions | |||
return opts |
@ -0,0 +1,55 @@ | |||
module PowerPhrases where | |||
import Data.Maybe | |||
import VM (Command(..)) | |||
charToCommand :: Char -> Maybe Command | |||
charToCommand 'p' = Just MoveW | |||
charToCommand '\'' = Just MoveW | |||
charToCommand '!' = Just MoveW | |||
charToCommand '.' = Just MoveW | |||
charToCommand '0' = Just MoveW | |||
charToCommand '3' = Just MoveW | |||
charToCommand 'b' = Just MoveE | |||
charToCommand 'c' = Just MoveE | |||
charToCommand 'e' = Just MoveE | |||
charToCommand 'f' = Just MoveE | |||
charToCommand 'y' = Just MoveE | |||
charToCommand '2' = Just MoveE | |||
charToCommand 'a' = Just MoveSW | |||
charToCommand 'g' = Just MoveSW | |||
charToCommand 'h' = Just MoveSW | |||
charToCommand 'i' = Just MoveSW | |||
charToCommand 'j' = Just MoveSW | |||
charToCommand '4' = Just MoveSW | |||
charToCommand 'l' = Just MoveSE | |||
charToCommand 'm' = Just MoveSE | |||
charToCommand 'n' = Just MoveSE | |||
charToCommand 'o' = Just MoveSE | |||
charToCommand ' ' = Just MoveSE | |||
charToCommand '5' = Just MoveSE | |||
charToCommand 'd' = Just RotateClockwise | |||
charToCommand 'q' = Just RotateClockwise | |||
charToCommand 'r' = Just RotateClockwise | |||
charToCommand 'v' = Just RotateClockwise | |||
charToCommand 'z' = Just RotateClockwise | |||
charToCommand '1' = Just RotateClockwise | |||
charToCommand 'k' = Just RotateCounterclockwise | |||
charToCommand 's' = Just RotateCounterclockwise | |||
charToCommand 't' = Just RotateCounterclockwise | |||
charToCommand 'u' = Just RotateCounterclockwise | |||
charToCommand 'w' = Just RotateCounterclockwise | |||
charToCommand 'x' = Just RotateCounterclockwise | |||
charToCommand '\t' = Nothing | |||
charToCommand '\n' = Nothing | |||
charToCommand '\r' = Nothing | |||
@ -0,0 +1,25 @@ | |||
module Strategy0 where | |||
import Datatypes | |||
import VM | |||
seswlist = cycle [MoveSE, MoveSW] | |||
strat0 :: Game -> [Command] | |||
strat0 game = take nsteps seswlist | |||
where | |||
nsteps = stepr game | |||
stepr :: Game -> Int | |||
stepr game = if notes == Ended | |||
then 1 | |||
else 1 + (stepl new_game) | |||
where | |||
(new_game,notes) = step game MoveSE | |||
stepl :: Game -> Int | |||
stepl game = if notes == Ended | |||
then 1 | |||
else 1 + (stepr new_game) | |||
where | |||
(new_game,notes) = step game MoveSW |