day 3: rewrite
use Data.Text Signed-off-by: Amneesh Singh <natto@weirdnatto.in>
This commit is contained in:
		
							
								
								
									
										18
									
								
								day3.hs
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								day3.hs
									
									
									
									
									
								
							@@ -1,24 +1,28 @@
 | 
				
			|||||||
import Data.Char (isAsciiLower, isAsciiUpper)
 | 
					import Data.Char (isAsciiLower, isAsciiUpper)
 | 
				
			||||||
import Data.List (intersect)
 | 
					import Data.List (intersect)
 | 
				
			||||||
 | 
					import Data.Text (Text)
 | 
				
			||||||
 | 
					import qualified Data.Text as T (foldl, lines, splitAt)
 | 
				
			||||||
 | 
					import Lib (readFile')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
main :: IO ()
 | 
					main :: IO ()
 | 
				
			||||||
main = do
 | 
					main = do
 | 
				
			||||||
  input <- lines <$> readFile "day3.in"
 | 
					  input <- map parse . T.lines <$> readFile' "day3.in"
 | 
				
			||||||
  putStr "Q1: "
 | 
					  putStr "Q1: "
 | 
				
			||||||
  print $ q1 input
 | 
					  print $ q1 input
 | 
				
			||||||
  putStr "Q2: "
 | 
					  putStr "Q2: "
 | 
				
			||||||
  print $ q2 input
 | 
					  print $ q2 input
 | 
				
			||||||
 | 
					
 | 
				
			||||||
q1 :: [String] -> Int
 | 
					q1 :: [[Int]] -> Int
 | 
				
			||||||
q1 =
 | 
					q1 = sum . map (\x -> head . uncurry intersect $ splitAt (div (length x) 2) x)
 | 
				
			||||||
  sum
 | 
					 | 
				
			||||||
    . map (\x -> val . head . uncurry intersect $ splitAt (div (length x) 2) x)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
q2 :: [String] -> Int
 | 
					q2 :: [[Int]] -> Int
 | 
				
			||||||
q2 [] = 0
 | 
					q2 [] = 0
 | 
				
			||||||
q2 input =
 | 
					q2 input =
 | 
				
			||||||
  let (cur, rest) = splitAt 3 input
 | 
					  let (cur, rest) = splitAt 3 input
 | 
				
			||||||
   in (val . head . foldr1 intersect) cur + q2 rest
 | 
					   in (head . foldr1 intersect) cur + q2 rest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					parse :: Text -> [Int]
 | 
				
			||||||
 | 
					parse = T.foldl (\xs x -> val x : xs) []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
val :: Char -> Int
 | 
					val :: Char -> Int
 | 
				
			||||||
val c
 | 
					val c
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user