66 lines
1.6 KiB
Haskell
66 lines
1.6 KiB
Haskell
|
|
{-# LANGUAGE QuasiQuotes #-}
|
||
|
|
module Day8Spec (spec) where
|
||
|
|
|
||
|
|
import Test.Hspec
|
||
|
|
import Text.Heredoc
|
||
|
|
import Control.Arrow ((>>>))
|
||
|
|
|
||
|
|
import qualified Data.Matrix as M
|
||
|
|
import qualified Data.Vector as V
|
||
|
|
import Day8
|
||
|
|
|
||
|
|
testInput :: String
|
||
|
|
testInput = [str|30373
|
||
|
|
|25512
|
||
|
|
|65332
|
||
|
|
|33549
|
||
|
|
|35390
|
||
|
|
|]
|
||
|
|
|
||
|
|
testVisibility :: Visibillity
|
||
|
|
testVisibility = M.fromList 5 5
|
||
|
|
[x,x,x,x,x,
|
||
|
|
x,x,x,o,x,
|
||
|
|
x,x,o,x,x,
|
||
|
|
x,o,x,o,x,
|
||
|
|
x,x,x,x,x
|
||
|
|
]
|
||
|
|
where
|
||
|
|
x = True
|
||
|
|
o = False
|
||
|
|
|
||
|
|
smallForest :: String
|
||
|
|
smallForest = [str|1234
|
||
|
|
|5678
|
||
|
|
|9012
|
||
|
|
|]
|
||
|
|
|
||
|
|
parsedSmallForest :: Forest
|
||
|
|
parsedSmallForest = M.fromList 3 4 $ [1..9] ++ [0,1,2]
|
||
|
|
|
||
|
|
spec :: Spec
|
||
|
|
spec =
|
||
|
|
describe "Day8" $ do
|
||
|
|
describe "Part1" $ do
|
||
|
|
it "parses a forest" $ do
|
||
|
|
parseForest smallForest `shouldBe` parsedSmallForest
|
||
|
|
it "checks visibility" $ do
|
||
|
|
let forest = parseForest testInput
|
||
|
|
checkVisibility forest `shouldBe` testVisibility
|
||
|
|
it "counts visible things" $ do
|
||
|
|
let v = parseForest >>>
|
||
|
|
checkVisibility >>>
|
||
|
|
countVisible $ testInput
|
||
|
|
v `shouldBe` 21
|
||
|
|
describe "Part2" $ do
|
||
|
|
it "calculates viewing distance from height" $ do
|
||
|
|
viewingDistance 5 (V.fromList [3]) `shouldBe` 1
|
||
|
|
viewingDistance 5 (V.fromList [5,2]) `shouldBe` 1
|
||
|
|
viewingDistance 5 (V.fromList [1,2]) `shouldBe` 2
|
||
|
|
viewingDistance 5 (V.fromList [3,5,3]) `shouldBe` 2
|
||
|
|
it "calculates the scenic score" $ do
|
||
|
|
let s = parseForest >>>
|
||
|
|
findMaxScenicScore $ testInput
|
||
|
|
s `shouldBe` 8
|
||
|
|
|