Skip to content
Snippets Groups Projects
Select Git revision
  • fd638c3c6fe7db6098db382ee4d7daefbb7ab07b
  • master default protected
2 results

Challenges.hs

Blame
  • Challenges.hs 19.38 KiB
    {-# LANGUAGE DeriveGeneric #-}
    -- comp2209 Functional Programming Challenges
    -- (c) University of Southampton 2020
    -- Skeleton code to be updated with your solutions
    -- The dummy functions here simply return an arbitrary value that is usually wrong 
    
    -- DO NOT MODIFY THE FOLLOWING LINES OF CODE
    module Challenges (WordSearchGrid,Placement,Posn,Orientation(..),solveWordSearch, createWordSearch,
        LamMacroExpr(..),LamExpr(..),prettyPrint, parseLamMacro,
        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
    import Data.Char
    import Parsing
    import Control.Monad
    import Data.List
    import GHC.Generics (Generic,Generic1)
    import Control.DeepSeq
    import System.IO
    import System.Random
    
    import Control.Applicative
    
    
    -- types for Part I
    type WordSearchGrid = [[ Char ]]
    type Placement = (Posn,Orientation)
    type Posn = (Int,Int)
    data Orientation = Forward | Back | Up | Down | UpForward | UpBack | DownForward | DownBack deriving (Eq,Ord,Show,Read)
    
    -- types for Parts II and III
    data LamMacroExpr = LamDef [ (String,LamExpr) ] LamExpr deriving (Eq,Show,Read)
    data LamExpr = LamMacro String | LamApp LamExpr LamExpr  |
                   LamAbs Int LamExpr  | LamVar Int deriving (Eq,Show,Read)
    
    -- END OF CODE YOU MUST NOT MODIFY
    
    -- ADD YOUR OWN CODE HERE
    
    -- Challenge 1 --
    
    
    solveWordSearch :: [ String ] -> WordSearchGrid -> [ (String,Maybe Placement) ]
    solveWordSearch ss css = map (findString css) ss
    
    
    findString :: WordSearchGrid -> String -> (String,Maybe Placement)
    findString css s = (s,findLocation css (0,0) s)
    
    
    --recursively searches grid for first char of word
    --returns Nothing or Placement
    findLocation :: WordSearchGrid -> Posn -> String -> Maybe Placement
    findLocation css (x,y) s@(l:ls) | x > limit && y > limit                     = Nothing
                                    | x > limit                                  = findLocation css (0,y+1) s
                                    | elemAt css (x,y) == l && result /= Nothing = result
                                    | otherwise                                  = findLocation css (x+1,y) s
        where
          result = findPlacement css (x,y) ls
          limit = length css - 1
    
    
    --checks for hidden word in possible directions
    findPlacement :: WordSearchGrid -> Posn -> String -> Maybe Placement
    findPlacement css (x,y) s | checkWordDir css (x,y) Forward s           = Just ((x,y),Forward)
                              | checkWordDir css (x,y) Back s              = Just ((x,y),Back)
                              | checkWordDir css (x,y) Up s                = Just ((x,y),Up)
                              | checkWordDir css (x,y) Down s              = Just ((x,y),Down)
                              | checkWordDir css (x,y) UpForward s         = Just ((x,y),UpForward)