summaryrefslogtreecommitdiff
path: root/2021/3.hs
diff options
context:
space:
mode:
Diffstat (limited to '2021/3.hs')
-rw-r--r--2021/3.hs25
1 files changed, 25 insertions, 0 deletions
diff --git a/2021/3.hs b/2021/3.hs
new file mode 100644
index 0000000..98ca15c
--- /dev/null
+++ b/2021/3.hs
@@ -0,0 +1,25 @@
+module Main where
+
+import Data.Bits
+import Data.List
+
+import Input
+
+
+readBin :: [Bool] -> Int
+readBin = sum . zipWith (*) (iterate (*2) 1) . reverse . map fromEnum
+
+main :: IO ()
+main = do
+ inp <- map (map (== '1')) <$> getInput 3
+ let n = length (head inp)
+ let majority s = 2 * length (filter id s) > length s
+ let gamma = readBin $ map majority $ transpose inp
+ epsilon = complement gamma .&. (bit n - 1)
+ print (gamma * epsilon)
+ let filterstep _ _ [x] = [x]
+ filterstep target idx cands = filter ((== target) . (!! idx)) cands
+ perform targetrule = foldl' (\cs i -> filterstep (targetrule cs i) i cs) inp [0 .. n - 1]
+ oxygen = perform $ \cs i -> 2 * length (filter id (map (!! i) cs)) >= length cs
+ co2 = perform $ \cs i -> 2 * length (filter id (map (!! i) cs)) < length cs
+ print (readBin (head oxygen) * readBin (head co2))