Day 24, Part 1
This commit is contained in:
parent
a3eab35785
commit
4854a77a63
@ -6,5 +6,5 @@ I started learning Haskell very recently, and I just learned this year that Adve
|
|||||||
|01 |★ ★ |06 |★ ★ |11 |★ ★ |16 |★ |21 | |
|
|01 |★ ★ |06 |★ ★ |11 |★ ★ |16 |★ |21 | |
|
||||||
|02 |★ ★ |07 |★ ★ |12 |★ |17 |★ ★ |22 |★ |
|
|02 |★ ★ |07 |★ ★ |12 |★ |17 |★ ★ |22 |★ |
|
||||||
|03 |★ ★ |08 |★ ★ |13 |★ ★ |18 |★ ★ |23 |★ |
|
|03 |★ ★ |08 |★ ★ |13 |★ ★ |18 |★ ★ |23 |★ |
|
||||||
|04 |★ ★ |09 |★ ★ |14 |★ ★ |19 |★ |24 | |
|
|04 |★ ★ |09 |★ ★ |14 |★ ★ |19 |★ |24 |★ |
|
||||||
|05 |★ ★ |10 |★ ★ |15 |★ |20 | |25 | |
|
|05 |★ ★ |10 |★ ★ |15 |★ |20 | |25 | |
|
||||||
|
@ -59,4 +59,5 @@ executable adventofcode2024
|
|||||||
Day19
|
Day19
|
||||||
Day22
|
Day22
|
||||||
Day23
|
Day23
|
||||||
|
Day24
|
||||||
Graph
|
Graph
|
||||||
|
34
src/Day24.hs
Normal file
34
src/Day24.hs
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}
|
||||||
|
|
||||||
|
module Day24 (day24_1) where
|
||||||
|
|
||||||
|
import Data.Bits
|
||||||
|
import qualified Data.HashMap.Strict as M
|
||||||
|
import Data.List (sort)
|
||||||
|
import Data.List.Split (splitOn)
|
||||||
|
|
||||||
|
getWireValue :: String -> M.HashMap String (Maybe Int) -> M.HashMap String String -> Int
|
||||||
|
getWireValue w wm cm =
|
||||||
|
case wm M.! w of
|
||||||
|
Just x -> x
|
||||||
|
Nothing ->
|
||||||
|
let (w1 : op : w2 : _) = words $ cm M.! w
|
||||||
|
in if op == "AND"
|
||||||
|
then getWireValue w1 wm cm .&. getWireValue w2 wm cm
|
||||||
|
else
|
||||||
|
if op == "OR"
|
||||||
|
then getWireValue w1 wm cm .|. getWireValue w2 wm cm
|
||||||
|
else getWireValue w1 wm cm `xor` getWireValue w2 wm cm
|
||||||
|
|
||||||
|
toDecimal :: [Int] -> Int
|
||||||
|
toDecimal n = sum $ zipWith (*) n (iterate (*2) 1)
|
||||||
|
|
||||||
|
day24_1 :: IO ()
|
||||||
|
day24_1 = do
|
||||||
|
[inputs, connections] <- splitOn [""] . lines <$> readFile "input/day24.txt"
|
||||||
|
let inputsList = [(i, Just ((read :: String -> Int) v)) | [i, v] <- map (splitOn ": ") inputs]
|
||||||
|
wireConnections = [(w, c) | [c, w] <- map (splitOn " -> ") connections]
|
||||||
|
connectionsMap = M.fromList wireConnections
|
||||||
|
wiresMap = M.fromList $ [(fst wc, Nothing) | wc <- wireConnections] ++ inputsList
|
||||||
|
outputs = map (\x -> getWireValue x wiresMap connectionsMap) (filter (\(x : _) -> x == 'z') . sort $ M.keys wiresMap)
|
||||||
|
print $ toDecimal outputs
|
@ -21,6 +21,7 @@ import Day18 (day18_1, day18_2)
|
|||||||
import Day19 (day19_1)
|
import Day19 (day19_1)
|
||||||
import Day22 (day22_1)
|
import Day22 (day22_1)
|
||||||
import Day23 (day23_1)
|
import Day23 (day23_1)
|
||||||
|
import Day24 (day24_1)
|
||||||
import System.Environment (getArgs)
|
import System.Environment (getArgs)
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
@ -108,6 +109,7 @@ main = do
|
|||||||
"19" : "1" : _ -> day19_1
|
"19" : "1" : _ -> day19_1
|
||||||
"22" : "1" : _ -> day22_1
|
"22" : "1" : _ -> day22_1
|
||||||
"23" : "1" : _ -> day23_1
|
"23" : "1" : _ -> day23_1
|
||||||
|
"24" : "1" : _ -> day24_1
|
||||||
"all" : _ -> do
|
"all" : _ -> do
|
||||||
day01_1
|
day01_1
|
||||||
day01_2
|
day01_2
|
||||||
@ -145,4 +147,5 @@ main = do
|
|||||||
day19_1
|
day19_1
|
||||||
day22_1
|
day22_1
|
||||||
day23_1
|
day23_1
|
||||||
|
day24_1
|
||||||
_ -> error "Not implemented"
|
_ -> error "Not implemented"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user