diff --git a/cw/src/Challenges.hs b/cw/src/Challenges.hs
index bfbae4312b491d1eb1ca31f5e78fa02b2fafae7c..dec25c52f3cb478227cbd9e1aef339df6edae03c 100644
--- a/cw/src/Challenges.hs
+++ b/cw/src/Challenges.hs
@@ -117,20 +117,20 @@ exWords1'2 = [ "BANANA", "ORANGE", "MELON", "RASPBERRY","APPLE","PLUM","GRAPE" ]
 -- Challenge 2 --
 
 --internal grid values are either a character or a placeholder for a random letter
-data GridVal  = Letter Char | Rand
+data GridVal  = Letter Char | Rand deriving Eq
 type RandGrid = [[GridVal]]
 
 createWordSearch :: [ String ] -> Double -> IO WordSearchGrid
-createWordSearch ss den = do gen <- getStdGen                                                  --initial generator
-                             return (createGrid ss dim gen)
+createWordSearch ss den = do gen <- newStdGen                                                  --initial generator
+                             return (createGrid dim gen ss)
     where
-      charInInput    = sum (map length ss)
-      longestWordLen = max (map length ss)
-      dim            = head [x | x <- [0..], x^2 > (charInInput / den), x >= longestWordLen]   --calculates needed dimension of grid according to the density
+      charInInput    = fromIntegral $ sum $ map length ss :: Double
+      longestWordLen = fromIntegral $ foldl1 max $ map length ss :: Double
+      dim            = floor $ head [x | x <- [0..], x^2 > (charInInput / den), x >= longestWordLen]   --calculates needed dimension of grid according to the density
 
 
 createGrid :: Int -> StdGen -> [String] -> WordSearchGrid
-createGrid dim gen ss = randToWord finalGrid (charsFromStrs ss) gen'
+createGrid dim gen ss = randToWord (charsFromStrs ss) gen' finalGrid
     where
       tempGrid         = replicate dim (replicate dim Rand)                                    --fills grid with random values
       (finalGrid,gen') = addStrsToGrid tempGrid gen ss                                         --final grid after all strings added
@@ -156,7 +156,7 @@ rmdups = map head . group . sort
 randToWord :: [Char] -> StdGen -> RandGrid -> WordSearchGrid
 randToWord cs gen []       = []
 randToWord cs gen (row:rs) = let (newRow,newGen) = rowConvert cs gen row
-                             in newRow : randToWord cs newGen
+                             in newRow : randToWord cs newGen rs
 
 rowConvert :: [Char] -> StdGen -> [GridVal] -> ([Char],StdGen)
 rowConvert cs gen []            = ([],gen)
@@ -171,7 +171,7 @@ rowConvert cs gen (Rand:xs)     = let (rows,gen') = rowConvert cs newGen xs
 
 --adds list of strings to given grid one by one
 addStrsToGrid :: RandGrid -> StdGen -> [String] -> (RandGrid,StdGen)
-addStrsToGrid rg gen (s:[]) = (newGrid,newGen)
+addStrsToGrid rg gen (s:[]) = insertString rg s gen
 addStrsToGrid rg gen (s:ss) = addStrsToGrid newGrid newGen ss
     where
      (newGrid,newGen) = insertString rg s gen
@@ -186,7 +186,7 @@ validDirs rg s (x,y) = map fst $ filter ( \(_,b) -> b == True ) (zip dirs (map (
 
 --checks whether an orientation for a string at a given position in a grid is valid
 checkDir :: RandGrid -> String -> Posn -> Orientation -> Bool
-checkDir rg s (x,y) dir | let (x',y') = posns !! length s - 1,
+checkDir rg s (x,y) dir | let (x',y') = posns !! (length s - 1),
                           x' < 0 || x' > length rg - 1 ||
                           y' < 0 || y' > length rg - 1                                                     = False
                         | foldl (&&) True (map (\(a,b) -> Letter a == b || b == Rand) $ zip s lettersGrid) = True
@@ -206,7 +206,8 @@ insertString rg s gen | elemAt rg (x,y) /= Rand &&
     where
       ( (x,y),newGen ) = generatePos gen (length rg)
       vDirs = validDirs rg s (x,y)
-      (randomDir,_) = vDirs !! randomR (0,length vDirs - 1) gen :: (Int,StdGen)
+      randomDir = let (index,_) = randomR (0,length vDirs - 1) gen
+                  in vDirs !! index
 
       addToGrid :: Orientation -> String -> RandGrid -> Posn -> RandGrid
       addToGrid dir (c:[]) rg (x',y') = insertAt2D (Letter c) (x',y') rg