@@ -24,3 +24,9 @@ executable p1
 | 
			
		||||
  hs-source-dirs: src
 | 
			
		||||
  main-is:        P1.hs
 | 
			
		||||
  build-depends:  libaoc
 | 
			
		||||
 | 
			
		||||
executable p2
 | 
			
		||||
  import:         common
 | 
			
		||||
  hs-source-dirs: src
 | 
			
		||||
  main-is:        P2.hs
 | 
			
		||||
  build-depends:  libaoc
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										36
									
								
								src/P2.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								src/P2.hs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
			
		||||
module Main where
 | 
			
		||||
 | 
			
		||||
import qualified AoC as A (extract)
 | 
			
		||||
import Data.List (inits, tails)
 | 
			
		||||
import Text.Parsec (char, digit, many1, newline, parse, sepBy1, sepEndBy1)
 | 
			
		||||
import Text.Parsec.String (Parser)
 | 
			
		||||
 | 
			
		||||
parseReports :: Parser [[Int]]
 | 
			
		||||
parseReports =
 | 
			
		||||
  sepEndBy1
 | 
			
		||||
    (sepBy1 (read <$> many1 digit) (char ' '))
 | 
			
		||||
    newline
 | 
			
		||||
 | 
			
		||||
safe :: [Int] -> Bool
 | 
			
		||||
safe xs =
 | 
			
		||||
  let differences :: [Int]
 | 
			
		||||
      differences = zipWith (-) (tail xs) xs
 | 
			
		||||
   in all (\x -> (x >= 1) && (x <= 3)) differences || all (\x -> (x <= -1) && (x >= -3)) differences
 | 
			
		||||
 | 
			
		||||
part1 :: [[Int]] -> Int
 | 
			
		||||
part1 = length . filter safe
 | 
			
		||||
 | 
			
		||||
part2 :: [[Int]] -> Int
 | 
			
		||||
part2 = length . filter dampSafe
 | 
			
		||||
  where
 | 
			
		||||
    dampSafe :: [Int] -> Bool
 | 
			
		||||
    dampSafe xs = any safe (zipWith (++) (inits xs) (tail (tails xs)))
 | 
			
		||||
 | 
			
		||||
main :: IO ()
 | 
			
		||||
main =
 | 
			
		||||
  do
 | 
			
		||||
    raw <- readFile "./inputs/p2.in"
 | 
			
		||||
    -- parse the input
 | 
			
		||||
    let reports = A.extract $ parse parseReports "" raw
 | 
			
		||||
    putStr "Part 1: " >> print (part1 reports)
 | 
			
		||||
    putStr "Part 2: " >> print (part2 reports)
 | 
			
		||||
		Reference in New Issue
	
	Block a user