49
									
								
								day04.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								day04.hs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,49 @@
 | 
				
			|||||||
 | 
					import Data.Either (rights)
 | 
				
			||||||
 | 
					import Data.List (intersect)
 | 
				
			||||||
 | 
					import Data.Text qualified as T
 | 
				
			||||||
 | 
					import Lib (readFile')
 | 
				
			||||||
 | 
					import Text.Parsec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					parser :: (Stream s m Char) => ParsecT s u m ([Int], [Int])
 | 
				
			||||||
 | 
					parser =
 | 
				
			||||||
 | 
					  do
 | 
				
			||||||
 | 
					    card <- string "Card" *> many1 space *> many1 digit <* char ':'
 | 
				
			||||||
 | 
					    many1 space
 | 
				
			||||||
 | 
					    winning <- many digit `sepBy` many1 space
 | 
				
			||||||
 | 
					    char '|'
 | 
				
			||||||
 | 
					    many1 space
 | 
				
			||||||
 | 
					    mine <- many digit `sepBy` many1 space
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return (read <$> init winning, read <$> mine)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main :: IO ()
 | 
				
			||||||
 | 
					main = do
 | 
				
			||||||
 | 
					  input <- T.lines <$> readFile' "day04.in"
 | 
				
			||||||
 | 
					  let parsed = rights . map (parse parser "") $ input
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  putStr "Q1: "
 | 
				
			||||||
 | 
					  print
 | 
				
			||||||
 | 
					    . sum
 | 
				
			||||||
 | 
					    . map
 | 
				
			||||||
 | 
					      ( (\x -> if x < 0 then 0 else 2 ^ x)
 | 
				
			||||||
 | 
					          . flip (-) 1
 | 
				
			||||||
 | 
					          . length
 | 
				
			||||||
 | 
					          . uncurry intersect
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
 | 
					    $ parsed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  putStr "Q2: "
 | 
				
			||||||
 | 
					  print
 | 
				
			||||||
 | 
					    . sum
 | 
				
			||||||
 | 
					    . consequence
 | 
				
			||||||
 | 
					    . map
 | 
				
			||||||
 | 
					      ( \(x, y) ->
 | 
				
			||||||
 | 
					          length $
 | 
				
			||||||
 | 
					            intersect x y
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
 | 
					    $ parsed
 | 
				
			||||||
 | 
					  where
 | 
				
			||||||
 | 
					    -- TODO: dont bruteforce (its slow)
 | 
				
			||||||
 | 
					    consequence :: [Int] -> [Int]
 | 
				
			||||||
 | 
					    consequence [] = []
 | 
				
			||||||
 | 
					    consequence (x : xs) = 1 + sum (take x $ consequence xs) : consequence xs
 | 
				
			||||||
		Reference in New Issue
	
	Block a user