parent
72f41838cb
commit
5185e14653
@ -0,0 +1,24 @@
|
||||
module Part1
|
||||
( parseFileString,
|
||||
quickSort,
|
||||
)
|
||||
where
|
||||
|
||||
split :: [Int] -> ([Int], [Int])
|
||||
split mylist = case mylist of
|
||||
[] -> ([], [])
|
||||
x : xs ->
|
||||
let (evens, odds) = split xs
|
||||
in (x : odds, evens)
|
||||
|
||||
parseFileString :: String -> ([Int], [Int])
|
||||
parseFileString file_string = split parsed_word_list
|
||||
where
|
||||
parsed_word_list = [read word :: Int | word <- words file_string]
|
||||
|
||||
quickSort :: [Int] -> [Int]
|
||||
quickSort [] = []
|
||||
quickSort (x : xs) = smallerSorted ++ [x] ++ biggerSorted
|
||||
where
|
||||
smallerSorted = quickSort [a | a <- xs, a <= x]
|
||||
biggerSorted = quickSort [a | a <- xs, a > x]
|
@ -0,0 +1,16 @@
|
||||
module Part2 where
|
||||
|
||||
import Data.Map qualified as Map
|
||||
|
||||
getValueCounts :: [Int] -> Map.Map Int Int
|
||||
getValueCounts [] = Map.empty
|
||||
getValueCounts (x : xs) =
|
||||
let xsMap = getValueCounts xs
|
||||
newCount = Map.findWithDefault 0 x xsMap + 1
|
||||
in Map.insert x newCount xsMap
|
||||
|
||||
getSimilarityScore :: [Int] -> Map.Map Int Int -> Int
|
||||
getSimilarityScore [] map = 0
|
||||
getSimilarityScore (x : xs) map = xScore + getSimilarityScore xs map
|
||||
where
|
||||
xScore = x * Map.findWithDefault 0 x map
|
@ -0,0 +1,21 @@
|
||||
# Day 1
|
||||
|
||||
## Instructions
|
||||
|
||||
From this directory open a terminal and execute:
|
||||
|
||||
```sh
|
||||
runhaskell day1.hs
|
||||
```
|
||||
|
||||
The solution for each section will be printed to the terminal output.
|
||||
|
||||
## Notes
|
||||
|
||||
This is my first attempt at writing Haskell code.
|
||||
I've always wanted to try a formal functional programming language, and I've heard of Haskell through using tools like XMonad and Pandoc.
|
||||
Since I use Pandoc regularly I thought Haskell would be a useful skill to have in case I ever need to contribute.
|
||||
I also am interested in the functional programming paradigm and want to adapt my thought processes to write cleaner code.
|
||||
I thought day 1 would be a good day to try Haskell, and something that would've taken me 10 minutes in any programming language I know really took me a long time.
|
||||
This is definitely not good, clean, idiomatic Haskell, but it is a start!
|
||||
|
@ -0,0 +1,21 @@
|
||||
import Part1
|
||||
import Part2 (getSimilarityScore, getValueCounts)
|
||||
import System.IO
|
||||
|
||||
main = do
|
||||
inputs <- readFile "inputs.txt"
|
||||
let (listA, listB) = parseFileString inputs
|
||||
|
||||
-- Solve part 1
|
||||
let sortedListA = quickSort listA
|
||||
let sortedListB = quickSort listB
|
||||
let distances = [abs (a - b) | (a, b) <- zip sortedListA sortedListB]
|
||||
let distance = sum distances
|
||||
putStrLn "The solution to part 1 is: "
|
||||
print distance
|
||||
|
||||
-- Solve part 2
|
||||
let bMap = getValueCounts sortedListB
|
||||
let score = getSimilarityScore sortedListA bMap
|
||||
putStrLn "The solution to part 2 is: "
|
||||
print score
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue