day 2
This commit is contained in:
		
							parent
							
								
									e4f146f68f
								
							
						
					
					
						commit
						eaf8b1c594
					
				
							
								
								
									
										63
									
								
								day2.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								day2.hs
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,63 @@
 | 
			
		|||
data Password = Password Int Int Char String
 | 
			
		||||
  deriving Show
 | 
			
		||||
 | 
			
		||||
main :: IO ()
 | 
			
		||||
main = do
 | 
			
		||||
  raw <- readFile "day2.txt"
 | 
			
		||||
  let ls = map parse $ lines raw
 | 
			
		||||
      fs = case (sequence ls) of
 | 
			
		||||
             Nothing -> error "invalid input"
 | 
			
		||||
             (Just ps) -> ps
 | 
			
		||||
      ansA = length $ filter (== True) $ map validA fs
 | 
			
		||||
      ansB = length $ filter (== True) $ map validB fs
 | 
			
		||||
   in do 
 | 
			
		||||
     putStrLn $ "day2a: " ++ (show ansA)
 | 
			
		||||
     putStrLn $ "day2b: " ++ (show ansB)
 | 
			
		||||
 | 
			
		||||
validA :: Password -> Bool
 | 
			
		||||
validA (Password l u t p) =
 | 
			
		||||
  let len = length $ filter (== t) p
 | 
			
		||||
   in (len >= l)
 | 
			
		||||
   && (len <= u)
 | 
			
		||||
 | 
			
		||||
validB :: Password -> Bool
 | 
			
		||||
validB (Password a' b' t p) =
 | 
			
		||||
  case (inBounds a b p) of
 | 
			
		||||
    (False,False) -> False
 | 
			
		||||
    (True,False) -> (p !! a) == t
 | 
			
		||||
    (False,True) -> (p !! b) == t
 | 
			
		||||
    _ -> xor ((p !! a) == t) ((p !! b) == t)
 | 
			
		||||
  where
 | 
			
		||||
    a = (pred a')
 | 
			
		||||
    b = (pred b')
 | 
			
		||||
 | 
			
		||||
parse :: String -> Maybe Password
 | 
			
		||||
parse [] = error "empty password"
 | 
			
		||||
parse s =
 | 
			
		||||
  do (l,s') <- parseInt s
 | 
			
		||||
     (u,s'') <- parseInt $ dropChar s'
 | 
			
		||||
     (t,s''') <- parseChar $ dropChar s''
 | 
			
		||||
     let p = (dropChar . dropChar) s'''
 | 
			
		||||
      in (Just $ Password l u t p)
 | 
			
		||||
 | 
			
		||||
parseInt :: String -> Maybe (Int,String)
 | 
			
		||||
parseInt s = case (reads s) of
 | 
			
		||||
               [] -> Nothing
 | 
			
		||||
               [a] -> Just a
 | 
			
		||||
 | 
			
		||||
parseChar :: String -> Maybe (Char,String)
 | 
			
		||||
parseChar [] = Nothing
 | 
			
		||||
parseChar (t:s) = Just (t,s)
 | 
			
		||||
 | 
			
		||||
dropChar :: String -> String
 | 
			
		||||
dropChar [] = []
 | 
			
		||||
dropChar (_:ls) = ls
 | 
			
		||||
 | 
			
		||||
xor :: Bool -> Bool -> Bool
 | 
			
		||||
xor True False = True
 | 
			
		||||
xor False True = True
 | 
			
		||||
xor _ _ = False
 | 
			
		||||
 | 
			
		||||
inBounds :: Int -> Int -> String -> (Bool, Bool)
 | 
			
		||||
inBounds a b s = ( len >= a, len >= b )
 | 
			
		||||
  where len = length s
 | 
			
		||||
		Loading…
	
		Reference in a new issue