Add 2024 Days 01/02 in Haskell
This commit is contained in:
		
							parent
							
								
									f7e6dd05df
								
							
						
					
					
						commit
						3933ed1e60
					
				
							
								
								
									
										18
									
								
								2024/day01/day01.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								2024/day01/day01.hs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,18 @@
 | 
			
		||||
import Data.List ( sort, group )
 | 
			
		||||
import Data.Maybe ( fromMaybe )
 | 
			
		||||
import Aoc ( aocMain )
 | 
			
		||||
 | 
			
		||||
parseFile :: [String] -> ([Int], [Int])
 | 
			
		||||
parseFile lines = unzip [(a, b) | line <- lines, let [a, b] = map read $ words line]
 | 
			
		||||
 | 
			
		||||
part1 :: ([Int], [Int]) -> Int
 | 
			
		||||
part1 (list1, list2) = sum $ zipWith (curry (abs . uncurry (-))) (sort list1) (sort list2)
 | 
			
		||||
 | 
			
		||||
part2 :: ([Int], [Int]) -> Int
 | 
			
		||||
part2 (list1, list2) = sum $ map score list1
 | 
			
		||||
    where
 | 
			
		||||
        score n = n * fromMaybe 0 (lookup n count)
 | 
			
		||||
        count = map (\xs -> (head xs, length xs)) $ group $ sort list2
 | 
			
		||||
 | 
			
		||||
main :: IO ()
 | 
			
		||||
main = aocMain parseFile part1 part2
 | 
			
		||||
							
								
								
									
										23
									
								
								2024/day02/day02.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								2024/day02/day02.hs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,23 @@
 | 
			
		||||
import Aoc ( aocMain )
 | 
			
		||||
 | 
			
		||||
parseFile :: [String] -> [[Int]]
 | 
			
		||||
parseFile = map (map read . words)
 | 
			
		||||
 | 
			
		||||
part1 :: [[Int]] -> Int
 | 
			
		||||
part1 reports =
 | 
			
		||||
    length $ filter isSafe $ map differences reports
 | 
			
		||||
    where
 | 
			
		||||
        differences xs = zipWith (-) xs (tail xs)
 | 
			
		||||
        isGradual dx = 1 <= abs dx && abs dx <= 3
 | 
			
		||||
        isSafe dxs = all isGradual dxs && (all (<0) dxs || all (>0) dxs)
 | 
			
		||||
 | 
			
		||||
part2 :: [[Int]] -> Int
 | 
			
		||||
part2 reports = 
 | 
			
		||||
    length $ filter isSafe $ map remove1 reports
 | 
			
		||||
    where
 | 
			
		||||
        remove n xs = let (front, back) = splitAt n xs in front ++ tail back
 | 
			
		||||
        remove1 report = map (`remove` report) [0..length report-1]
 | 
			
		||||
        isSafe = (>0) . part1
 | 
			
		||||
 | 
			
		||||
main :: IO ()
 | 
			
		||||
main = aocMain parseFile part1 part2
 | 
			
		||||
							
								
								
									
										12
									
								
								aoc.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								aoc.hs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,12 @@
 | 
			
		||||
module Aoc where
 | 
			
		||||
 | 
			
		||||
aocMain :: Show p => ([String] -> p) -> (p -> Int) -> (p -> Int) -> IO ()
 | 
			
		||||
aocMain parseFile part1 part2 = do
 | 
			
		||||
    contents <- readFile "input.txt"
 | 
			
		||||
    let input = parseFile $ lines contents
 | 
			
		||||
    -- print $ "Input: " ++ show input
 | 
			
		||||
    print $ "Part 1: " ++ show (part1 input)
 | 
			
		||||
    print $ "Part 2: " ++ show (part2 input)
 | 
			
		||||
 | 
			
		||||
enumerate :: [a] -> [(Int, a)]
 | 
			
		||||
enumerate xs = zip [0..length xs] xs
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user