Day 18: Lavaduct Lagoon
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
Haskell
Wasn’t able to start on time today, but this was a fun one! Got to apply the two theorems I learned from somebody else’s solution to Day 10.
Solution
import Data.Char import Data.List readInput :: String -> (Char, Int, String) readInput s = let [d, n, c] = words s in (head d, read n, drop 2 $ init c) boundary :: [(Char, Int)] -> [(Int, Int)] boundary = scanl' step (0, 0) where step (x, y) (d, n) = let (dx, dy) = case d of 'U' -> (0, 1) 'D' -> (0, -1) 'L' -> (-1, 0) 'R' -> (1, 0) in (x + n * dx, y + n * dy) area :: [(Char, Int)] -> Int area steps = let a = -- shoelace formula (abs . (`quot` 2) . sum) . (zipWith (\(x, y) (x', y') -> x * y' - x' * y) <*> tail) $ boundary steps in a + 1 + sum (map snd steps) `quot` 2 -- Pick's theorem part1, part2 :: [(Char, Int, String)] -> Int part1 = area . map (\(d, n, _) -> (d, n)) part2 = area . map (\(_, _, c) -> decode c) where decode s = ("RDLU" !! digitToInt (last s), read $ "0x" ++ init s) main = do input <- map readInput . lines <$> readFile "input18" print $ part1 input print $ part2 input