init — add day2
This commit is contained in:
		
				commit
				
					
						00f7598bee
					
				
			
		
					 7 changed files with 960 additions and 0 deletions
				
			
		
							
								
								
									
										75
									
								
								day2/app/Main.hs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								day2/app/Main.hs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,75 @@
 | 
			
		|||
module Main where
 | 
			
		||||
 | 
			
		||||
import Data.List.Split (splitOn)
 | 
			
		||||
 | 
			
		||||
type Red = Int
 | 
			
		||||
 | 
			
		||||
type Green = Int
 | 
			
		||||
 | 
			
		||||
type Blue = Int
 | 
			
		||||
 | 
			
		||||
data Cube = RedQuantity Red | GreenQuantity Green | BlueQuantity Blue deriving (Show)
 | 
			
		||||
 | 
			
		||||
data CubeSum = CubeSum {red :: Red, green :: Green, blue :: Blue} deriving (Show)
 | 
			
		||||
 | 
			
		||||
partTwo :: [String] -> Int
 | 
			
		||||
partTwo = sum . map (powerCube . makeCubes)
 | 
			
		||||
 | 
			
		||||
powerCube :: [Cube] -> Int
 | 
			
		||||
powerCube = getCubePower . foldr minimumSetCube CubeSum {red = 0, green = 0, blue = 0}
 | 
			
		||||
 | 
			
		||||
getCubePower :: CubeSum -> Int
 | 
			
		||||
getCubePower CubeSum {red = _red, green = _green, blue = _blue} = _red * _green * _blue
 | 
			
		||||
 | 
			
		||||
minimumSetCube :: Cube -> CubeSum -> CubeSum
 | 
			
		||||
minimumSetCube (RedQuantity q) CubeSum {red = _red, green = _green, blue = _blue} = CubeSum {red = max _red q, green = _green, blue = _blue}
 | 
			
		||||
minimumSetCube (GreenQuantity q) CubeSum {red = _red, green = _green, blue = _blue} = CubeSum {red = _red, green = max _green q, blue = _blue}
 | 
			
		||||
minimumSetCube (BlueQuantity q) CubeSum {red = _red, green = _green, blue = _blue} = CubeSum {red = _red, green = _green, blue = max _blue q}
 | 
			
		||||
 | 
			
		||||
partOne :: [String] -> [Int]
 | 
			
		||||
partOne = map fst . filter (all validate . snd) . zip [1 ..] . map makeCubes
 | 
			
		||||
  where
 | 
			
		||||
    validate (RedQuantity n) = n <= 12
 | 
			
		||||
    validate (GreenQuantity n) = n <= 13
 | 
			
		||||
    validate (BlueQuantity n) = n <= 14
 | 
			
		||||
 | 
			
		||||
makeCubes :: String -> [Cube]
 | 
			
		||||
makeCubes = map createCube . splitOn "," . replaceSemiColon . last . splitOn ":"
 | 
			
		||||
 | 
			
		||||
replaceSemiColon :: String -> String
 | 
			
		||||
replaceSemiColon = map toComma
 | 
			
		||||
  where
 | 
			
		||||
    toComma ';' = ','
 | 
			
		||||
    toComma x = x
 | 
			
		||||
 | 
			
		||||
parseElem :: String -> (String, String)
 | 
			
		||||
parseElem (_ : s) = (cube, nb)
 | 
			
		||||
  where
 | 
			
		||||
    nb = head splited
 | 
			
		||||
    cube = last splited
 | 
			
		||||
    splited = splitOn " " s
 | 
			
		||||
parseElem _ = undefined
 | 
			
		||||
 | 
			
		||||
getElem :: (String, String) -> Cube
 | 
			
		||||
getElem ("red", nb) = RedQuantity (read nb :: Red)
 | 
			
		||||
getElem ("green", nb) = GreenQuantity (read nb :: Green)
 | 
			
		||||
getElem ("blue", nb) = BlueQuantity (read nb :: Blue)
 | 
			
		||||
getElem _ = undefined
 | 
			
		||||
 | 
			
		||||
createCube :: String -> Cube
 | 
			
		||||
createCube = getElem . parseElem
 | 
			
		||||
 | 
			
		||||
getCubeSum :: [Cube] -> CubeSum
 | 
			
		||||
getCubeSum = foldr cubeAddition CubeSum {red = 0, green = 0, blue = 0}
 | 
			
		||||
 | 
			
		||||
cubeAddition :: Cube -> CubeSum -> CubeSum
 | 
			
		||||
cubeAddition (RedQuantity q) CubeSum {red = _red, green = _green, blue = _blue} = CubeSum {red = _red + q, green = _green, blue = _blue}
 | 
			
		||||
cubeAddition (GreenQuantity q) CubeSum {red = _red, green = _green, blue = _blue} = CubeSum {red = _red, green = _green + q, blue = _blue}
 | 
			
		||||
cubeAddition (BlueQuantity q) CubeSum {red = _red, green = _green, blue = _blue} = CubeSum {red = _red, green = _green, blue = _blue + q}
 | 
			
		||||
 | 
			
		||||
main :: IO ()
 | 
			
		||||
main = do
 | 
			
		||||
  content <- readFile "input.txt"
 | 
			
		||||
  (print . sum . partOne . lines) content
 | 
			
		||||
  (print . partTwo . lines) content
 | 
			
		||||
  putStrLn "Yes, it works!"
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue