day5
This commit is contained in:
		
							
								
								
									
										58
									
								
								day5/main.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								day5/main.hs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,58 @@
 | 
			
		||||
import System.IO
 | 
			
		||||
 | 
			
		||||
import Data.List
 | 
			
		||||
import Data.List.Split
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
parseStacks :: [String] -> [[Char]]
 | 
			
		||||
parseStacks = map (filter (/=' ') . init) . transpose . map (map (!!1) . chunksOf 4)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
parseMove :: String -> (Int,Int,Int)
 | 
			
		||||
parseMove s = (read (x!!1) :: Int, read (x!!3) :: Int, read (x!!5) :: Int)
 | 
			
		||||
    where x = splitOn " " s
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
applyStacks :: (Int,[Char]) -> (Int,[Char]) -> (Int,[Char]) -> [Char]
 | 
			
		||||
applyStacks (f,fs) (t,ts) (c,cs)
 | 
			
		||||
    | c == f = fs
 | 
			
		||||
    | c == t = ts
 | 
			
		||||
    | otherwise = cs
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
applyMove :: [[Char]] -> (Int,Int,Int) -> [[Char]]
 | 
			
		||||
applyMove acc (n,f,t) = map (applyStacks (f,fromstack) (t,newstack)) $ zip [1..] acc
 | 
			
		||||
    where oldstack = acc !! (f-1)
 | 
			
		||||
          c = take n oldstack
 | 
			
		||||
          fromstack = drop n oldstack
 | 
			
		||||
          tostack = acc !! (t-1)
 | 
			
		||||
          newstack = c ++ tostack
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
applyMoves :: [[Char]] -> (Int,Int,Int) -> [[Char]]
 | 
			
		||||
applyMoves acc (0,_,_)   = acc
 | 
			
		||||
applyMoves acc (n,f,l) = applyMoves (applyMove acc (1,f,l)) (n-1,f,l)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
applyMoves2 :: [[Char]] -> (Int,Int,Int) -> [[Char]]
 | 
			
		||||
applyMoves2 acc move = applyMove acc move
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
handler :: String -> String
 | 
			
		||||
handler s = (show $ map head $ foldl applyMoves stacks moves) ++ "\n" ++
 | 
			
		||||
            (show $ map head $ foldl applyMoves2 stacks moves) ++ "\n"
 | 
			
		||||
    where sections = splitOn [""] $ lines s
 | 
			
		||||
          stacks = parseStacks $ sections !! 0
 | 
			
		||||
          moves  = map parseMove $ sections !! 1
 | 
			
		||||
 | 
			
		||||
main :: IO ()
 | 
			
		||||
main = do
 | 
			
		||||
    interact handler
 | 
			
		||||
		Reference in New Issue
	
	Block a user