init d1-4
This commit is contained in:
commit
94f3e04fbd
|
@ -0,0 +1,26 @@
|
||||||
|
dist
|
||||||
|
dist-*
|
||||||
|
cabal-dev
|
||||||
|
*.o
|
||||||
|
*.hi
|
||||||
|
*.hie
|
||||||
|
*.chi
|
||||||
|
*.chs.h
|
||||||
|
*.dyn_o
|
||||||
|
*.dyn_hi
|
||||||
|
.hpc
|
||||||
|
.hsenv
|
||||||
|
.cabal-sandbox/
|
||||||
|
cabal.sandbox.config
|
||||||
|
*.prof
|
||||||
|
*.aux
|
||||||
|
*.hp
|
||||||
|
*.eventlog
|
||||||
|
.stack-work/
|
||||||
|
cabal.project.local
|
||||||
|
cabal.project.local~
|
||||||
|
.HTF/
|
||||||
|
.ghc.environment.*
|
||||||
|
|
||||||
|
# aoc
|
||||||
|
*_input
|
|
@ -0,0 +1,9 @@
|
||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
|
||||||
|
import qualified Data.Text as T
|
||||||
|
|
||||||
|
main = interact $
|
||||||
|
show
|
||||||
|
. maximum
|
||||||
|
. map (sum . map read . lines . T.unpack)
|
||||||
|
. T.splitOn "\n\n" . T.pack
|
|
@ -0,0 +1,12 @@
|
||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
|
||||||
|
import qualified Data.Text as T
|
||||||
|
import Data.List (sort)
|
||||||
|
|
||||||
|
main = interact $
|
||||||
|
show
|
||||||
|
. sum
|
||||||
|
. (\l -> [l!!0, l!!1, l!!2]) -- this is stupid :)
|
||||||
|
. reverse . sort
|
||||||
|
. map (sum . map read . lines . T.unpack)
|
||||||
|
. T.splitOn "\n\n" . T.pack
|
|
@ -0,0 +1,29 @@
|
||||||
|
{-# OPTIONS_GHC -Wno-incomplete-patterns #-}
|
||||||
|
|
||||||
|
scoreLose = 0
|
||||||
|
scoreDraw = 3
|
||||||
|
scoreWin = 6
|
||||||
|
|
||||||
|
resolveMatchScore 'A' 'Z' = scoreLose
|
||||||
|
resolveMatchScore 'B' 'X' = scoreLose
|
||||||
|
resolveMatchScore 'C' 'Y' = scoreLose
|
||||||
|
|
||||||
|
resolveMatchScore 'A' 'Y' = scoreWin
|
||||||
|
resolveMatchScore 'B' 'Z' = scoreWin
|
||||||
|
resolveMatchScore 'C' 'X' = scoreWin
|
||||||
|
|
||||||
|
resolveMatchScore 'A' 'X' = scoreDraw
|
||||||
|
resolveMatchScore 'B' 'Y' = scoreDraw
|
||||||
|
resolveMatchScore 'C' 'Z' = scoreDraw
|
||||||
|
|
||||||
|
resolveOptionScore 'X' = 1
|
||||||
|
resolveOptionScore 'Y' = 2
|
||||||
|
resolveOptionScore 'Z' = 3
|
||||||
|
|
||||||
|
getScore a b = resolveMatchScore a b + resolveOptionScore b
|
||||||
|
|
||||||
|
main = interact $
|
||||||
|
show
|
||||||
|
. sum
|
||||||
|
. map ((\l -> getScore (l !! 0 !! 0) (l !! 1 !! 0)) . words)
|
||||||
|
. lines
|
|
@ -0,0 +1,39 @@
|
||||||
|
{-# OPTIONS_GHC -Wno-incomplete-patterns #-}
|
||||||
|
|
||||||
|
scoreLose = 0
|
||||||
|
scoreDraw = 3
|
||||||
|
scoreWin = 6
|
||||||
|
|
||||||
|
getMatchScore 'X' = scoreLose
|
||||||
|
getMatchScore 'Y' = scoreDraw
|
||||||
|
getMatchScore 'Z' = scoreWin
|
||||||
|
|
||||||
|
resolveOptionScore 'X' = 1
|
||||||
|
resolveOptionScore 'Y' = 2
|
||||||
|
resolveOptionScore 'Z' = 3
|
||||||
|
|
||||||
|
getWinningChoice 'A' = 'Y'
|
||||||
|
getWinningChoice 'B' = 'Z'
|
||||||
|
getWinningChoice 'C' = 'X'
|
||||||
|
|
||||||
|
getLosingChoice 'A' = 'Z'
|
||||||
|
getLosingChoice 'B' = 'X'
|
||||||
|
getLosingChoice 'C' = 'Y'
|
||||||
|
|
||||||
|
getDrawChoice 'A' = 'X'
|
||||||
|
getDrawChoice 'B' = 'Y'
|
||||||
|
getDrawChoice 'C' = 'Z'
|
||||||
|
|
||||||
|
getCorrectChoice 'X' = getLosingChoice
|
||||||
|
getCorrectChoice 'Y' = getDrawChoice
|
||||||
|
getCorrectChoice 'Z' = getWinningChoice
|
||||||
|
|
||||||
|
getScore a b =
|
||||||
|
resolveOptionScore correctChoice + getMatchScore b
|
||||||
|
where correctChoice = getCorrectChoice b a
|
||||||
|
|
||||||
|
main = interact $
|
||||||
|
show
|
||||||
|
. sum
|
||||||
|
. map ((\l -> getScore (l !! 0 !! 0) (l !! 1 !! 0)) . words)
|
||||||
|
. lines
|
|
@ -0,0 +1,20 @@
|
||||||
|
-- i found out that intersect exists so i redid day 3
|
||||||
|
|
||||||
|
import Data.Char
|
||||||
|
import Data.List
|
||||||
|
import GHC.Utils.Misc
|
||||||
|
|
||||||
|
getCharPriority c
|
||||||
|
| isLower c = fromEnum c - 96
|
||||||
|
| isUpper c = fromEnum c - 64 + 26
|
||||||
|
| otherwise = undefined
|
||||||
|
|
||||||
|
findDuplicate s = only $ take half s `intersect` drop half s
|
||||||
|
where
|
||||||
|
halfFloat = fromIntegral (length s) / 2
|
||||||
|
half = round halfFloat
|
||||||
|
|
||||||
|
main = interact $
|
||||||
|
show . sum
|
||||||
|
. map (getCharPriority . findDuplicate)
|
||||||
|
. lines
|
|
@ -0,0 +1,20 @@
|
||||||
|
import Data.Char
|
||||||
|
|
||||||
|
getCharPriority c
|
||||||
|
| isLower c = fromEnum c - 96
|
||||||
|
| isUpper c = fromEnum c - 64 + 26
|
||||||
|
| otherwise = undefined
|
||||||
|
|
||||||
|
findDuplicate s = go s 0 0
|
||||||
|
where
|
||||||
|
halfFloat = fromIntegral (length s) / 2
|
||||||
|
half = round halfFloat
|
||||||
|
go s i1 i2
|
||||||
|
| i1 >= half = go s 0 (i2+1)
|
||||||
|
| s!!i1 == s!!(i2 + half) = s!!i1
|
||||||
|
| otherwise = go s (i1+1) i2
|
||||||
|
|
||||||
|
main = interact $
|
||||||
|
show . sum
|
||||||
|
. map (getCharPriority . findDuplicate)
|
||||||
|
. lines
|
|
@ -0,0 +1,25 @@
|
||||||
|
-- i found out that intersect exists so i redid day 3
|
||||||
|
|
||||||
|
import Data.Char
|
||||||
|
import Data.List
|
||||||
|
import GHC.Utils.Misc
|
||||||
|
|
||||||
|
getCharPriority c
|
||||||
|
| isLower c = fromEnum c - 96
|
||||||
|
| isUpper c = fromEnum c - 64 + 26
|
||||||
|
| otherwise = undefined
|
||||||
|
|
||||||
|
findDuplicate :: [String] -> Char
|
||||||
|
findDuplicate [l1, l2, l3] = only $ l1 `intersect` l2 `intersect` l3
|
||||||
|
findDuplicate _ = undefined
|
||||||
|
|
||||||
|
extractIntoGroups :: Int -> [String] -> [[String]]
|
||||||
|
extractIntoGroups s l
|
||||||
|
| s > length l = []
|
||||||
|
| otherwise = take s l : extractIntoGroups s (drop s l)
|
||||||
|
|
||||||
|
main = interact $
|
||||||
|
show . sum
|
||||||
|
. map (getCharPriority . findDuplicate)
|
||||||
|
. extractIntoGroups 3
|
||||||
|
. lines
|
|
@ -0,0 +1,34 @@
|
||||||
|
{-# LANGUAGE DataKinds #-}
|
||||||
|
import Data.Char
|
||||||
|
import Data.Maybe
|
||||||
|
|
||||||
|
getCharPriority c
|
||||||
|
| isLower c = fromEnum c - 96
|
||||||
|
| isUpper c = fromEnum c - 64 + 26
|
||||||
|
| otherwise = undefined
|
||||||
|
|
||||||
|
allChars :: [Char]
|
||||||
|
allChars = map toEnum $ [65..90] ++ [96..122]
|
||||||
|
|
||||||
|
-- this is STUPID
|
||||||
|
unwrapJust (Just a) = a
|
||||||
|
unwrapJust Nothing = undefined
|
||||||
|
|
||||||
|
findFirstJust :: [Maybe a] -> a
|
||||||
|
findFirstJust a = unwrapJust $ head $ filter isJust a
|
||||||
|
|
||||||
|
findDuplicate :: [String] -> Char
|
||||||
|
findDuplicate [l1, l2, l3] = findFirstJust $ map (\c ->
|
||||||
|
if c`elem`l1 && c`elem`l2 && c`elem`l3 then Just c else Nothing) allChars
|
||||||
|
findDuplicate _ = undefined
|
||||||
|
|
||||||
|
extractIntoGroups :: Int -> [String] -> [[String]]
|
||||||
|
extractIntoGroups s l
|
||||||
|
| s > length l = []
|
||||||
|
| otherwise = take s l : extractIntoGroups s (drop s l)
|
||||||
|
|
||||||
|
main = interact $
|
||||||
|
show . sum
|
||||||
|
. map (getCharPriority . findDuplicate)
|
||||||
|
. extractIntoGroups 3
|
||||||
|
. lines
|
|
@ -0,0 +1,18 @@
|
||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
{-# OPTIONS_GHC -Wno-incomplete-patterns #-}
|
||||||
|
|
||||||
|
import qualified Data.Text as T
|
||||||
|
import Data.List
|
||||||
|
|
||||||
|
isContained :: [[Int]] -> Bool
|
||||||
|
isContained [a, b] = intersection == a || intersection == b
|
||||||
|
where intersection = a `intersect` b
|
||||||
|
|
||||||
|
toRange :: [Int] -> [Int]
|
||||||
|
toRange [a, b] = [a .. b]
|
||||||
|
|
||||||
|
main = interact $
|
||||||
|
show
|
||||||
|
. length . filter id
|
||||||
|
. map (isContained . map (toRange . map (read . T.unpack) . T.splitOn "-") . T.splitOn "," . T.pack)
|
||||||
|
. lines
|
|
@ -0,0 +1,18 @@
|
||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
{-# OPTIONS_GHC -Wno-incomplete-patterns #-}
|
||||||
|
|
||||||
|
import qualified Data.Text as T
|
||||||
|
import Data.List
|
||||||
|
import GHC.Utils.Misc (count)
|
||||||
|
|
||||||
|
listHasOverlap :: (Eq a) => [a] -> [a] -> Bool
|
||||||
|
listHasOverlap a = not . null . intersect a
|
||||||
|
|
||||||
|
toRange :: [Int] -> [Int]
|
||||||
|
toRange [a, b] = [a .. b]
|
||||||
|
|
||||||
|
main = interact $
|
||||||
|
show
|
||||||
|
. count ((\[a,b] -> listHasOverlap a b)
|
||||||
|
. map (toRange . map (read . T.unpack) . T.splitOn "-") . T.splitOn "," . T.pack)
|
||||||
|
. lines
|
|
@ -0,0 +1,13 @@
|
||||||
|
# aoc2022
|
||||||
|
|
||||||
|
entirely in haskell :)
|
||||||
|
|
||||||
|
## how do i run this
|
||||||
|
|
||||||
|
you shouldn't; but for documentation purposes it's
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ ghc 1-a.hs && cat 1_input | ./1-a
|
||||||
|
```
|
||||||
|
|
||||||
|
you'll need to retrieve `1_input` from your aoc
|
Loading…
Reference in New Issue