day11
This commit is contained in:
54
src/Days/Day08.hs
Normal file
54
src/Days/Day08.hs
Normal file
@@ -0,0 +1,54 @@
|
||||
module Days.Day08 where
|
||||
|
||||
import AOCUtil
|
||||
import Data.Char
|
||||
import Data.List
|
||||
import GHC.Utils.Misc
|
||||
|
||||
runA :: IO ()
|
||||
runA = interactF "data/day08.txt" (solve)
|
||||
|
||||
runB :: IO ()
|
||||
runB = interactF "data/day08.txt" (solveB)
|
||||
|
||||
solve :: String -> String
|
||||
solve s = show . length . filter (isVisible for) $ [(x, y) | x <- [0 .. fwidth for - 1], y <- [0 .. fheight for - 1]]
|
||||
where
|
||||
for = map (map readChar) . lines $ s
|
||||
|
||||
solveB :: String -> String
|
||||
solveB s = show . maximum . map (scenicScore for) $ [(x, y) | x <- [0 .. fwidth for - 1], y <- [0 .. fheight for - 1]]
|
||||
where
|
||||
for = map (map readChar) . lines $ s
|
||||
|
||||
type Forrest = [[Int]]
|
||||
|
||||
isVisible :: Forrest -> (Int, Int) -> Bool
|
||||
isVisible f (x, y) = isLookt h left || isLookt h (tail right2) || isLookt h top || isLookt h (tail bot2)
|
||||
where
|
||||
row = f !! y
|
||||
col = transpose f !! x
|
||||
h = f !! y !! x
|
||||
(left, right2) = splitAt x row
|
||||
(top, bot2) = splitAt y col
|
||||
|
||||
scenicScore :: Forrest -> (Int, Int) -> Int
|
||||
scenicScore f (x, y) = viewDist h (reverse left) * viewDist h (tail right2) * viewDist h (reverse top) * viewDist h (tail bot2)
|
||||
where
|
||||
row = f !! y
|
||||
col = transpose f !! x
|
||||
h = f !! y !! x
|
||||
(left, right2) = splitAt x row
|
||||
(top, bot2) = splitAt y col
|
||||
|
||||
viewDist :: Int -> [Int] -> Int
|
||||
viewDist i ls = min (length ls) . (+ 1) . length . takeWhile (< i) $ ls
|
||||
|
||||
isLookt :: Int -> [Int] -> Bool
|
||||
isLookt m = all (< m)
|
||||
|
||||
fwidth :: Forrest -> Int
|
||||
fwidth = length . head
|
||||
|
||||
fheight :: Forrest -> Int
|
||||
fheight = length
|
||||
Reference in New Issue
Block a user