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))