Finish Day 2 - Part 2
							parent
							
								
									29c5ea7841
								
							
						
					
					
						commit
						fac4b3aacc
					
				| 
						 | 
				
			
			@ -3,7 +3,7 @@
 | 
			
		|||
 | 
			
		||||
import           Data.Bifunctor (Bifunctor (bimap, second))
 | 
			
		||||
import           Data.Char      (isSpace)
 | 
			
		||||
import           Data.List      (foldl', sort, (!!))
 | 
			
		||||
import           Data.List      (foldl')
 | 
			
		||||
import           Data.Text      (Text)
 | 
			
		||||
import qualified Data.Text      as T
 | 
			
		||||
import qualified Data.Text.IO   as T
 | 
			
		||||
| 
						 | 
				
			
			@ -12,9 +12,9 @@ main :: IO ()
 | 
			
		|||
main = do
 | 
			
		||||
  entries <- T.lines <$> T.readFile "src/advent_of_code/2023/input2"
 | 
			
		||||
  putStrLn "Advent of Code 2023 - Day 2"
 | 
			
		||||
  -- print entries
 | 
			
		||||
 | 
			
		||||
  putStrLn ("Part 1: " <> show (solveP1 entries))
 | 
			
		||||
  -- putStrLn ("Part 2: " <> show (solveP2 entries))
 | 
			
		||||
  putStrLn ("Part 2: " <> show (solveP2 entries))
 | 
			
		||||
 | 
			
		||||
--
 | 
			
		||||
-- Part 1
 | 
			
		||||
| 
						 | 
				
			
			@ -48,7 +48,53 @@ solveP1 = sum . map fst . filter snd . map (second (all (== True) . concatMap (m
 | 
			
		|||
-- Part 2
 | 
			
		||||
--
 | 
			
		||||
 | 
			
		||||
solveP2 = id
 | 
			
		||||
solveP2 :: [Text] -> Int
 | 
			
		||||
solveP2 = sumOfPowerCubes . allMinCubes . parsedEntries
 | 
			
		||||
 | 
			
		||||
parsedEntries :: [Text] -> [[[Cube Colour Int]]]
 | 
			
		||||
parsedEntries = map (snd . parseInput)
 | 
			
		||||
 | 
			
		||||
allMinCubes :: [[[Cube Colour Int]]] -> [(Cube Colour Int, Cube Colour Int, Cube Colour Int)]
 | 
			
		||||
allMinCubes = map findMinimumCubes
 | 
			
		||||
  where
 | 
			
		||||
    findMinimumCubes :: [[Cube Colour Int]] -> (Cube Colour Int, Cube Colour Int, Cube Colour Int)
 | 
			
		||||
    findMinimumCubes = foldl' (compareRGBCubes (>)) cubeMempty . map (foldl' minimumCubesRequired cubeMempty)
 | 
			
		||||
 | 
			
		||||
sumOfPowerCubes :: [(Cube Colour Int, Cube Colour Int, Cube Colour Int)] -> Int
 | 
			
		||||
sumOfPowerCubes = sum . map powerCube
 | 
			
		||||
  where
 | 
			
		||||
    powerCube :: (Cube Colour Int, Cube Colour Int, Cube Colour Int) -> Int
 | 
			
		||||
    powerCube (r,g,b) = n
 | 
			
		||||
      where
 | 
			
		||||
        r' = cubeVal r
 | 
			
		||||
        g' = cubeVal g
 | 
			
		||||
        b' = cubeVal b
 | 
			
		||||
        n = r' * g' * b'
 | 
			
		||||
 | 
			
		||||
minimumCubesRequired
 | 
			
		||||
  :: (Cube Colour Int, Cube Colour Int, Cube Colour Int)
 | 
			
		||||
  -> Cube Colour Int
 | 
			
		||||
  -> (Cube Colour Int, Cube Colour Int, Cube Colour Int)
 | 
			
		||||
minimumCubesRequired (r,g,b) (Cube Red   n) = if n > cubeVal r then (Cube Red n,g,b  ) else (r,g,b)
 | 
			
		||||
minimumCubesRequired (r,g,b) (Cube Green n) = if n > cubeVal g then (r,Cube Green n,b) else (r,g,b)
 | 
			
		||||
minimumCubesRequired (r,g,b) (Cube Blue  n) = if n > cubeVal b then (r,g,Cube Blue n ) else (r,g,b)
 | 
			
		||||
 | 
			
		||||
compareRGBCubes
 | 
			
		||||
  :: (Int -> Int -> Bool)
 | 
			
		||||
  -> (Cube Colour Int, Cube Colour Int, Cube Colour Int)
 | 
			
		||||
  -> (Cube Colour Int, Cube Colour Int, Cube Colour Int)
 | 
			
		||||
  -> (Cube Colour Int, Cube Colour Int, Cube Colour Int)
 | 
			
		||||
compareRGBCubes f (h,i,j) (k,l,m) = (r,g,b)
 | 
			
		||||
  where
 | 
			
		||||
    r = if cubeVal h `f` cubeVal k then h else k
 | 
			
		||||
    g = if cubeVal i `f` cubeVal l then i else l
 | 
			
		||||
    b = if cubeVal j `f` cubeVal m then j else m
 | 
			
		||||
 | 
			
		||||
cubeMempty :: (Cube Colour Int, Cube Colour Int, Cube Colour Int)
 | 
			
		||||
cubeMempty =  (Cube Red      0, Cube Green    0, Cube   Blue   0)
 | 
			
		||||
 | 
			
		||||
cubeVal :: Cube Colour Int -> Int
 | 
			
		||||
cubeVal (Cube _ n) = n
 | 
			
		||||
 | 
			
		||||
--
 | 
			
		||||
-- Parsing
 | 
			
		||||
| 
						 | 
				
			
			@ -68,8 +114,8 @@ stringToCube str = read $ "Cube " <> colour' <> " " <> n'
 | 
			
		|||
-- Examples
 | 
			
		||||
--
 | 
			
		||||
 | 
			
		||||
example1 :: [Text]
 | 
			
		||||
example1 =
 | 
			
		||||
example :: [Text]
 | 
			
		||||
example =
 | 
			
		||||
  [ "Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green"
 | 
			
		||||
  , "Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue"
 | 
			
		||||
  , "Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue