Improve code
This commit is contained in:
parent
a94312463b
commit
1b5a8ee458
@ -2,9 +2,9 @@ import Data.List (sort, inits, tails)
|
|||||||
|
|
||||||
isSafe :: [Int] -> Bool
|
isSafe :: [Int] -> Bool
|
||||||
isSafe xs = (isAscending xs || isDescending xs) && maximum distances <= 3 && minimum distances >= 1
|
isSafe xs = (isAscending xs || isDescending xs) && maximum distances <= 3 && minimum distances >= 1
|
||||||
where isAscending xs = xs == sort xs
|
where isAscending xs = xs == sort xs
|
||||||
isDescending xs = xs == reverse (sort xs)
|
isDescending xs = xs == reverse (sort xs)
|
||||||
distances = map abs $ zipWith (-) xs (tail xs)
|
distances = map abs $ zipWith (-) xs (tail xs)
|
||||||
|
|
||||||
removeLevel :: [Int] -> [[Int]]
|
removeLevel :: [Int] -> [[Int]]
|
||||||
removeLevel xs = zipWith (++) ys zs
|
removeLevel xs = zipWith (++) ys zs
|
||||||
|
@ -53,8 +53,8 @@ visitGrid :: Position -> Direction -> Grid -> Grid
|
|||||||
visitGrid (x, y) direction grid = let newGrid = markVisited (x, y) 'X' grid
|
visitGrid (x, y) direction grid = let newGrid = markVisited (x, y) 'X' grid
|
||||||
(nextPosition, newDirection) = getNextPosition (x, y) direction grid
|
(nextPosition, newDirection) = getNextPosition (x, y) direction grid
|
||||||
in if nextPosition `isInside` newGrid
|
in if nextPosition `isInside` newGrid
|
||||||
then visitGrid nextPosition newDirection newGrid
|
then visitGrid nextPosition newDirection newGrid
|
||||||
else newGrid
|
else newGrid
|
||||||
|
|
||||||
main = do
|
main = do
|
||||||
contents <- lines <$> readFile "day6.txt"
|
contents <- lines <$> readFile "day6.txt"
|
||||||
|
@ -62,18 +62,16 @@ visitGrid :: Position -> Direction -> Grid -> Grid
|
|||||||
visitGrid (x, y) direction grid = let newGrid = markVisited (x, y) 'X' grid
|
visitGrid (x, y) direction grid = let newGrid = markVisited (x, y) 'X' grid
|
||||||
(nextPosition, newDirection) = getNextPosition (x, y) direction grid
|
(nextPosition, newDirection) = getNextPosition (x, y) direction grid
|
||||||
in if nextPosition `isInside` newGrid
|
in if nextPosition `isInside` newGrid
|
||||||
then visitGrid nextPosition newDirection newGrid
|
then visitGrid nextPosition newDirection newGrid
|
||||||
else newGrid
|
else newGrid
|
||||||
|
|
||||||
checkGridLoop :: Position -> Direction -> Grid -> Bool
|
checkGridLoop :: Position -> Direction -> Grid -> Bool
|
||||||
checkGridLoop startPosition direction grid = let (nextPosition, newDirection) = getNextPosition startPosition direction grid
|
checkGridLoop startPosition direction grid = let (nextPosition, newDirection) = getNextPosition startPosition direction grid
|
||||||
newDirectionChar = printDirection newDirection
|
newDirectionChar = printDirection newDirection
|
||||||
newGrid = markVisited nextPosition newDirectionChar grid
|
newGrid = markVisited nextPosition newDirectionChar grid
|
||||||
in if not $ nextPosition `isInside` grid
|
in (nextPosition `isInside` grid)
|
||||||
then False
|
&& ((getGridVal nextPosition grid == newDirectionChar)
|
||||||
else if getGridVal nextPosition grid == newDirectionChar
|
|| checkGridLoop nextPosition newDirection newGrid)
|
||||||
then True
|
|
||||||
else checkGridLoop nextPosition newDirection newGrid
|
|
||||||
|
|
||||||
setGridObstacles :: Position -> Grid -> [Grid]
|
setGridObstacles :: Position -> Grid -> [Grid]
|
||||||
setGridObstacles startPosition grid = let positions = [ (x, y) | x <- [0..(length grid - 1)], y <- [0..(length (head grid) - 1)], (x, y) /= startPosition, getGridVal (x, y) grid == 'X' ]
|
setGridObstacles startPosition grid = let positions = [ (x, y) | x <- [0..(length grid - 1)], y <- [0..(length (head grid) - 1)], (x, y) /= startPosition, getGridVal (x, y) grid == 'X' ]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user