Day 8 - haskell
This commit is contained in:
parent
76358d0ed2
commit
5a68f700ec
@ -16,7 +16,8 @@
|
|||||||
- [x] Elixir
|
- [x] Elixir
|
||||||
- [Day 5](./day-05)
|
- [Day 5](./day-05)
|
||||||
- [] Emacs Lisp
|
- [] Emacs Lisp
|
||||||
- [] Haskell
|
- [x] Haskell
|
||||||
|
- [Day 7](./day-07)
|
||||||
- [] Java
|
- [] Java
|
||||||
- [x] JavaScript
|
- [x] JavaScript
|
||||||
- [Day 6](./day-06)
|
- [Day 6](./day-06)
|
||||||
|
117
day-07/sol.hs
Normal file
117
day-07/sol.hs
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
import Data.List (find, transpose)
|
||||||
|
import qualified Data.Set as Set
|
||||||
|
import qualified Data.Text as Text
|
||||||
|
import qualified Data.Text.IO as Text
|
||||||
|
|
||||||
|
countVisibleTrees ::
|
||||||
|
[[Int]] -> [Int] -> Int -> (Set.Set (Int, Int)) -> (Set.Set (Int, Int))
|
||||||
|
countVisibleTrees [] _ _ seen = seen
|
||||||
|
countVisibleTrees (row:rows) maxTrees depth seen =
|
||||||
|
countVisibleTrees
|
||||||
|
rows
|
||||||
|
(zipWith (\x y -> max x y) row maxTrees)
|
||||||
|
(depth + 1)
|
||||||
|
(foldl
|
||||||
|
(\acc x -> Set.insert x acc)
|
||||||
|
seen
|
||||||
|
(zipWith
|
||||||
|
(\i x ->
|
||||||
|
if x == 1
|
||||||
|
then (depth, i)
|
||||||
|
else (0, 0))
|
||||||
|
[0 ..]
|
||||||
|
(zipWith
|
||||||
|
(\x y ->
|
||||||
|
if x > y
|
||||||
|
then 1
|
||||||
|
else 0)
|
||||||
|
row
|
||||||
|
maxTrees)))
|
||||||
|
|
||||||
|
treeScore :: [[Int]] -> (Int, Int) -> Int -> Int -> [Int]
|
||||||
|
treeScore digits (x, y) width height =
|
||||||
|
let currentHeight = ((digits !! y) !! x)
|
||||||
|
in [ (case (find
|
||||||
|
(\x -> (digits !! y) !! x >= currentHeight)
|
||||||
|
[(x + 1) .. (width - 1)]) of
|
||||||
|
Just value -> (value - x)
|
||||||
|
Nothing -> (width - x - 1))
|
||||||
|
, (case (find
|
||||||
|
(\x -> (digits !! y) !! x >= currentHeight)
|
||||||
|
(reverse [0 .. (x - 1)])) of
|
||||||
|
Just value -> (x - value)
|
||||||
|
Nothing -> x)
|
||||||
|
, (case (find
|
||||||
|
(\y -> (digits !! y) !! x >= currentHeight)
|
||||||
|
(reverse [0 .. (y - 1)])) of
|
||||||
|
Just value -> (y - value)
|
||||||
|
Nothing -> y)
|
||||||
|
, (case (find
|
||||||
|
(\y -> (digits !! y) !! x >= currentHeight)
|
||||||
|
[(y + 1) .. (height - 1)]) of
|
||||||
|
Just value -> (value - y)
|
||||||
|
Nothing -> (height - y - 1))
|
||||||
|
]
|
||||||
|
|
||||||
|
getDigitsFromString :: String -> [Int]
|
||||||
|
getDigitsFromString = map (read . (: ""))
|
||||||
|
|
||||||
|
rotl :: [[Int]] -> [[Int]]
|
||||||
|
rotl = reverse . transpose
|
||||||
|
|
||||||
|
rotr :: [[Int]] -> [[Int]]
|
||||||
|
rotr = transpose . reverse
|
||||||
|
|
||||||
|
mmult :: [[Int]] -> [[Int]] -> [[Int]]
|
||||||
|
mmult a b = [[sum $ zipWith (*) ar bc | bc <- (transpose b)] | ar <- a]
|
||||||
|
|
||||||
|
main = do
|
||||||
|
ls <- fmap Text.lines (Text.readFile "input")
|
||||||
|
let digits = map (getDigitsFromString . Text.unpack) ls
|
||||||
|
let height = length digits
|
||||||
|
let width = length (head digits)
|
||||||
|
let topDownSeen =
|
||||||
|
countVisibleTrees digits (take width (repeat (-1))) 0 Set.empty
|
||||||
|
let rightLeftSeen =
|
||||||
|
Set.map
|
||||||
|
(\x -> ((snd x), width - (fst x) - 1))
|
||||||
|
(countVisibleTrees
|
||||||
|
(rotl digits)
|
||||||
|
(take height (repeat (-1)))
|
||||||
|
0
|
||||||
|
Set.empty)
|
||||||
|
let downTopSeen =
|
||||||
|
Set.map
|
||||||
|
(\x -> (height - (fst x) - 1, (snd x)))
|
||||||
|
(countVisibleTrees
|
||||||
|
(reverse digits)
|
||||||
|
(take width (repeat (-1)))
|
||||||
|
0
|
||||||
|
Set.empty)
|
||||||
|
let leftRightSeen =
|
||||||
|
Set.map
|
||||||
|
(\x -> (height - (snd x) - 1, (fst x)))
|
||||||
|
(countVisibleTrees
|
||||||
|
(rotr digits)
|
||||||
|
(take height (repeat (-1)))
|
||||||
|
0
|
||||||
|
Set.empty)
|
||||||
|
let allSeen =
|
||||||
|
(foldl
|
||||||
|
(\acc x -> Set.union acc x)
|
||||||
|
Set.empty
|
||||||
|
[topDownSeen, rightLeftSeen, downTopSeen, leftRightSeen])
|
||||||
|
print (Set.size allSeen)
|
||||||
|
print
|
||||||
|
(maximum
|
||||||
|
(map
|
||||||
|
(\y ->
|
||||||
|
maximum
|
||||||
|
(map
|
||||||
|
(\x ->
|
||||||
|
(foldl
|
||||||
|
(\acc x -> acc * x)
|
||||||
|
1
|
||||||
|
(treeScore digits (x, y) width height)))
|
||||||
|
[0 .. (width - 1)]))
|
||||||
|
[0 .. (height - 1)]))
|
Loading…
Reference in New Issue
Block a user