In progress
This commit is contained in:
parent
0ffb151a7c
commit
40858ab68e
1 changed files with 57 additions and 1 deletions
58
day3/main.hs
58
day3/main.hs
|
@ -5,6 +5,8 @@
|
|||
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
|
||||
import Data.List (intersperse)
|
||||
|
||||
testData :: [String]
|
||||
testData = [ "..##......."
|
||||
, "#...#...#.."
|
||||
|
@ -19,7 +21,61 @@ testData = [ "..##......."
|
|||
, ".#..#...#.#"
|
||||
]
|
||||
|
||||
data Position = Position { x_::Int, y_::Int }
|
||||
|
||||
instance Show (Position)
|
||||
where
|
||||
show p = "("<>show (x_ p)<>","<>show (y_ p)<>")"
|
||||
|
||||
-- Returns a half-line starting on (0,0) and following the (x*a,x*b) eq:
|
||||
line :: Int -> Int -> [Position]
|
||||
line a b = Position 0 0 : [ Position (x*a) (x*b) | x <- [1..] ]
|
||||
|
||||
-- Starting at the top-left corner of your map and following a slope of right 3
|
||||
-- and down 1, how many trees would you encounter?
|
||||
|
||||
-- Requirements for this first task:
|
||||
-- - datastructure supporting random-access (or similar) interface (lists would work)
|
||||
-- - function generating a list of (x,y) coordinate to check
|
||||
-- - must have 2D datastructure, since it's infinite on 1D (x axis)
|
||||
-- - in this version at least, there's no need to modify the datastructure, so
|
||||
-- it can be read-only, or even just a function taking a position and returning
|
||||
-- SquareSortEmpty or SquareSortTree
|
||||
|
||||
data SquareSort = SquareSortTree | SquareSortEmpty
|
||||
|
||||
instance Show SquareSort
|
||||
where
|
||||
show SquareSortTree = "#"
|
||||
show SquareSortEmpty = "."
|
||||
|
||||
char2ss :: Char -> Maybe SquareSort
|
||||
char2ss '#' = Just SquareSortTree
|
||||
char2ss '.' = Just SquareSortEmpty
|
||||
char2ss _ = Nothing
|
||||
|
||||
str2sss :: String -> Maybe [SquareSort]
|
||||
str2sss = sequence . (map char2ss)
|
||||
|
||||
newtype Grid = Grid [[SquareSort]]
|
||||
|
||||
instance Show (Grid)
|
||||
where
|
||||
show (Grid x) = intersperse '\n' $ map show x
|
||||
|
||||
parseInput :: [String] -> Maybe Grid
|
||||
parseInput x = Grid <$> sequence ( (map str2sss) x )
|
||||
|
||||
getSquareSortAtPosition :: Grid -> Position -> SquareSort
|
||||
getSquareSortAtPosition (Grid grid) (Position x y) =
|
||||
grid !! y !! (x `mod` n)
|
||||
where
|
||||
n = length (grid !! 0)
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
putStrLn "Day 3 - Part 1"
|
||||
print testData
|
||||
print $ take 5 $ line 3 1
|
||||
let (Just parsedTestData) = parseInput testData
|
||||
print parsedTestData
|
||||
print $ getSquareSortAtPosition parsedTestData (Position 3 0)
|
||||
|
|
Loading…
Reference in a new issue