Skip to content
Snippets Groups Projects
Commit 5688b2c1 authored by ik1g19's avatar ik1g19
Browse files

progress on challenge 2, reordered nextPos params

parent 5a07d324
Branches
No related tags found
No related merge requests found
......@@ -7,7 +7,7 @@
-- DO NOT MODIFY THE FOLLOWING LINES OF CODE
module Challenges (WordSearchGrid,Placement,Posn,Orientation(..),solveWordSearch, createWordSearch,
LamMacroExpr(..),LamExpr(..),prettyPrint, parseLamMacro,
cpsTransform,innerRedn1,outerRedn1,compareInnerOuter,generatePos) where
cpsTransform,innerRedn1,outerRedn1,compareInnerOuter) where
-- Import standard library and parsing definitions from Hutton 2016, Chapter 13
-- We import System.Random - make sure that your installation has it installed - use stack ghci and stack ghc
......@@ -74,7 +74,7 @@ findPlacement css (x,y) s | checkWordDir css (x,y) Forward s = Just ((
checkWordDir :: WordSearchGrid -> (Int,Int) -> Orientation -> String -> Bool
checkWordDir css (x,y) dir (l:[]) | nextElem css (x,y) dir == Just l = True
| otherwise = False
checkWordDir css (x,y) dir (l:ls) | nextElem css (x,y) dir == Just l = checkWordDir css (nextPos (x,y) dir) dir ls
checkWordDir css (x,y) dir (l:ls) | nextElem css (x,y) dir == Just l = checkWordDir css (nextPos dir (x,y)) dir ls
| otherwise = False
......@@ -82,15 +82,15 @@ checkWordDir css (x,y) dir (l:ls) | nextElem css (x,y) dir == Just l = checkWo
--------------------pattern matching for traversing the grid--------------------
--returns position of movement in a given direction
nextPos :: (Int,Int) -> Orientation -> (Int,Int)
nextPos (x,y) Forward = (x+1,y)
nextPos (x,y) Back = (x-1,y)
nextPos (x,y) Up = (x,y-1)
nextPos (x,y) Down = (x,y+1)
nextPos (x,y) UpForward = (x+1,y-1)
nextPos (x,y) UpBack = (x-1,y-1)
nextPos (x,y) DownForward = (x+1,y+1)
nextPos (x,y) DownBack = (x-1,y+1)
nextPos :: Orientation -> (Int,Int) -> (Int,Int)
nextPos Forward (x,y) = (x+1,y)
nextPos Back (x,y) = (x-1,y)
nextPos Up (x,y) = (x,y-1)
nextPos Down (x,y) = (x,y+1)
nextPos UpForward (x,y) = (x+1,y-1)
nextPos UpBack (x,y) = (x-1,y-1)
nextPos DownForward (x,y) = (x+1,y+1)
nextPos DownBack (x,y) = (x-1,y+1)
elemAt :: [[a]] -> (Int,Int) -> a
......@@ -102,7 +102,7 @@ nextElem :: [[a]] -> (Int,Int) -> Orientation -> Maybe a
nextElem css (x,y) dir | x' < 0 || y' < 0 || x' > length css - 1 || y' > length css - 1 = Nothing
| otherwise = Just (elemAt css (x',y'))
where
(x',y') = nextPos (x,y) dir
(x',y') = nextPos dir (x,y)
-- Two examples for you to try out, the first of which is in the instructions
......@@ -126,8 +126,7 @@ createWordSearch ss den = do gen <- getStdGen
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
dim = head [x | x <- [0..], x^2 > (charInInput / den), x >= longestWordLen] --calculates needed dimension of grid according to the density
createGrid :: [String] -> Int -> StdGen -> WordSearchGrid
......@@ -159,13 +158,19 @@ checkDir rg s (x,y) dir =
--adds an individual string to a given grid
--returns new grid and new generator
insertString :: RandGrid -> String -> StdGen -> (RandGrid,StdGen)
insertString rg s gen |
| length vDirs == 0 = insertString rg s newGen
|
insertString rg s gen | elemAt rg (x,y) /= Rand &&
elemAt rg (x,y) /= Letter (head s) = insertString rg s newGen --guard:if position is invalid, generate new position
| length vDirs == 0 = insertString rg s newGen --guard:if no valid orientations exist, generate new position
| otherwise
where
((x,y),newGen) = generatePos gen (length rg)
vDirs = validDirs rg s (x,y)
addToGrid :: String -> Orientation -> RandGrid
addToGrid s dir = iterate
--iterate to get positions
--zip together with string
--map to add to grid
generatePos :: StdGen -> Int -> ((Int,Int),StdGen)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment