[SOLVED] CS {-

$25

File Name: CS_{-.zip
File Size: 47.1 KB

5/5 - (1 vote)

{-
Module: Cell

This file contains operations on cells.
-}
module Cell where

import Data.Char

import Types
import Constants

{-
Basic operations on columns.
-}

Convert column to integer (a -> 1, b -> 2, ).
columnToInt :: Column -> Int
columnToInt c = (ord c) (ord a) + 1

Convert integer to column (1 -> a, 2 -> b, ).
intToColumn :: Int -> Column
intToColumn i = chr ((ord a) + i 1)

Return column on the left (b -> a, c -> b, ).
columnLeft :: Column -> Column
columnLeft c = intToColumn ((columnToInt c) 1)

Return column on the right (a -> b, b -> c, ).
columnRight :: Column -> Column
columnRight c = intToColumn ((columnToInt c) + 1)

{-
Surrounding cells.
-}

Cell on the left.
cellLeft :: Cell -> Cell
cellLeft (i, j) = (columnLeft i, j)

Cell on the right.
cellRight :: Cell -> Cell
cellRight (i, j) = (columnRight i, j)

Cell on the top.
cellTop :: Cell -> Cell
cellTop (i, j) = (i, j + 1)

Cell on the bottom.
cellBottom :: Cell -> Cell
cellBottom (i, j) = (i, j 1)

All surrounding cells.
cellsAround :: Cell -> [Cell]
cellsAround c = [cellLeft c, cellRight c, cellTop c, cellBottom c]

{-
Cells in board.

Note that so far we havent checked if the cell is actually in the board, we do
so using the following functions.
-}

Checks if cell is within bounds using boardSize from Constants.hs.
cellInBoard :: Cell -> Bool
cellInBoard (i, j) =
(columnToInt i) >= 1 && (columnToInt i) <= boardSize && j >= 1 && j <= boardSize– List of cells around a cell that are contained in the board.cellsAroundInBoard :: Cell -> [Cell]
cellsAroundInBoard c = filter cellInBoard (cellsAround c)

{-
Distance between cells and adjacency.
-}

Taxicab distance between cells.
distance :: Cell -> Cell -> Int
distance (i, j) (i, j) = abs ((columnToInt i) (columnToInt i)) + abs (j j)

A quick way of computing: c `elem` (cellsAround c).
isAdjacent :: Cell -> Cell -> Bool
isAdjacent c c = distance c c == 1

Two cells are next to each other in the same row.
isHorizontallyAdjacent :: Cell -> Cell -> Bool
isHorizontallyAdjacent c c = (c == cellLeft c) || (c == cellRight c)

Two cells are next to each other in the same column.
isVerticallyAdjacent :: Cell -> Cell -> Bool
isVerticallyAdjacent c c = (c == cellBottom c) || (c == cellTop c)

{-
Going from cells to indices (nodes in a Graph) and backwards.
-}

Convert cell to index ((a, 1) -> 0, (a, 2) -> 1, ).
cellToIndex :: Cell -> Index
cellToIndex (i, j) = boardSize * ((columnToInt i) 1) + (j 1)

Convert index to cell (0 -> (a, 1), 1 -> (a, 2), ).
indexToCell :: Index -> Cell
indexToCell idx = (intToColumn (i + 1), j + 1)
where
(i, j) = divMod idx boardSize

Reviews

There are no reviews yet.

Only logged in customers who have purchased this product may leave a review.

Shopping Cart
[SOLVED] CS {-
$25