day9
This commit is contained in:
		
							parent
							
								
									23e44f9515
								
							
						
					
					
						commit
						643296c382
					
				
							
								
								
									
										40
									
								
								day9.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								day9.hs
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,40 @@
 | 
			
		|||
main :: IO ()
 | 
			
		||||
main = do
 | 
			
		||||
  raw <- readFile "day9.txt"
 | 
			
		||||
  let nums = (map read $ lines raw) :: [Int]
 | 
			
		||||
      ansA = solveA nums
 | 
			
		||||
      ansB = solveB ansA nums
 | 
			
		||||
   in do
 | 
			
		||||
     putStrLn $ "day9a: " ++ (show ansA)
 | 
			
		||||
     putStrLn $ "day9b: " ++ (show ansB)
 | 
			
		||||
 | 
			
		||||
solveA :: [Int] -> Int
 | 
			
		||||
solveA nums = runWindow' (take 25 nums) (drop 25 nums)
 | 
			
		||||
 | 
			
		||||
solveB :: Int -> [Int] -> Int
 | 
			
		||||
solveB t nums = (maximum ans) + (minimum ans)
 | 
			
		||||
  where
 | 
			
		||||
    ans = testRuns t nums
 | 
			
		||||
 | 
			
		||||
runWindow' :: [Int] -> [Int] -> Int
 | 
			
		||||
runWindow' _ [] = error "reached end of stream"
 | 
			
		||||
runWindow' win (n:ns) =
 | 
			
		||||
  if n `elem` ws
 | 
			
		||||
  then runWindow' ((tail win) ++ [n]) ns
 | 
			
		||||
  else n
 | 
			
		||||
  where
 | 
			
		||||
    ws = [ x+y | x <- ls, y <- ls, x /= y ]
 | 
			
		||||
    ls = filter (<= (n - (minimum win))) win
 | 
			
		||||
 | 
			
		||||
findRun :: Int -> [Int] -> Int -> [Int] -> Maybe [Int]
 | 
			
		||||
findRun _ _ _ [] = Nothing
 | 
			
		||||
findRun t a r (l:ls)
 | 
			
		||||
  | r + l == t = Just (l:a)
 | 
			
		||||
  | r + l > t = Nothing
 | 
			
		||||
  | otherwise = findRun t (l:a) (r + l) ls
 | 
			
		||||
 | 
			
		||||
testRuns :: Int -> [Int] -> [Int]
 | 
			
		||||
testRuns _ [] = error "no answer"
 | 
			
		||||
testRuns t ls = case (findRun t [] 0 ls) of
 | 
			
		||||
                  Nothing -> testRuns t (tail ls)
 | 
			
		||||
                  Just x -> x
 | 
			
		||||
		Loading…
	
		Reference in a new issue