43 lines
1.3 KiB
Haskell
43 lines
1.3 KiB
Haskell
module Day13 where
|
|
import Data.List.Split (splitOn)
|
|
import Data.List (nub, sort)
|
|
import Debug.Trace (trace)
|
|
|
|
type Dot = (Int,Int)
|
|
data Fold = Vertical Int | Horizontal Int deriving Show
|
|
|
|
parse :: String -> Dot
|
|
parse s = (read x, read y) where [x,y] = splitOn "," s
|
|
|
|
parseFold :: String -> Fold
|
|
parseFold s = if axis == "x" then Horizontal (read line) else Vertical (read line) where [axis,line] = splitOn "=" $ last (words s)
|
|
|
|
fold :: Fold -> Dot -> Dot
|
|
fold fold@(Vertical f) (x,y) = (x, if y > f then f - (y-f) else y)
|
|
fold fold@(Horizontal f) (x,y) = (if x > f then f - (x-f) else x, y)
|
|
|
|
main :: IO ()
|
|
main = do
|
|
input <- lines <$> getContents
|
|
let [dots',folds'] = splitOn [""] input
|
|
let dots = nub $ map parse dots'
|
|
let folds = map parseFold folds'
|
|
|
|
putStr "part 1: "
|
|
let dots1 = nub $ sort $ map (fold (head folds)) dots
|
|
print $ length dots1
|
|
|
|
putStr "part 2: "
|
|
let dots2 = nub $ sort $ map (\d -> foldl (flip fold) d folds) dots
|
|
print dots2
|
|
let min_x = minimum $ map fst dots2
|
|
let max_x = maximum $ map fst dots2
|
|
let min_y = minimum $ map snd dots2
|
|
let max_y = maximum $ map snd dots2
|
|
mapM_ (\y -> do
|
|
mapM_ (\x -> putChar (if (x,y) `elem` dots2 then '#' else '.')) [0..max_x]
|
|
putStrLn ""
|
|
) [0..max_y]
|
|
-- print dots2
|
|
-- print $ length dots2
|