62
day07.hs
Normal file
62
day07.hs
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
import Data.Char (ord)
|
||||||
|
import Data.List (group, nub, sort, sortBy)
|
||||||
|
import Data.Ord (comparing)
|
||||||
|
import Data.Text qualified as T
|
||||||
|
import Lib (count)
|
||||||
|
|
||||||
|
-- yes, this is slow
|
||||||
|
-- i dont have time for a cuter (and faster) answer :<
|
||||||
|
-- Update: I found a solution on reddit that uses some cool default GHC extensions and is much faster, i am not going to use it, but feel free to look it up
|
||||||
|
main :: IO ()
|
||||||
|
main = do
|
||||||
|
input' <- map words . lines <$> readFile "day07.in"
|
||||||
|
let bids = map (\[x, y] -> (x, read y)) input'
|
||||||
|
|
||||||
|
putStr "Q1: "
|
||||||
|
print
|
||||||
|
. sum
|
||||||
|
. zipWith (*) [1 ..]
|
||||||
|
. map snd
|
||||||
|
. sortBy (comparing (handKind . fst) <> comparing (map strength . fst))
|
||||||
|
$ bids
|
||||||
|
|
||||||
|
putStr "Q2: "
|
||||||
|
|
||||||
|
print
|
||||||
|
. sum
|
||||||
|
. zipWith (*) [1 ..]
|
||||||
|
. map snd
|
||||||
|
. sortBy
|
||||||
|
( comparing
|
||||||
|
(\(hand, _) -> maximum [handKind (map repl hand) | x <- nub hand, let repl c = if c == 'J' then x else c])
|
||||||
|
<> comparing (map strength2 . fst)
|
||||||
|
)
|
||||||
|
$ bids
|
||||||
|
|
||||||
|
strength :: Char -> Int
|
||||||
|
strength c = case c of
|
||||||
|
'A' -> 13
|
||||||
|
'K' -> 12
|
||||||
|
'Q' -> 11
|
||||||
|
'J' -> 10
|
||||||
|
'T' -> 9
|
||||||
|
_ -> ord c - ord '1'
|
||||||
|
|
||||||
|
strength2 :: Char -> Int
|
||||||
|
strength2 c = case c of
|
||||||
|
'A' -> 13
|
||||||
|
'K' -> 12
|
||||||
|
'Q' -> 11
|
||||||
|
'J' -> 0
|
||||||
|
'T' -> 9
|
||||||
|
_ -> ord c - ord '1'
|
||||||
|
|
||||||
|
handKind :: String -> Int
|
||||||
|
handKind hand = case sort $ map length $ group $ sort hand of
|
||||||
|
[5] -> 6
|
||||||
|
[1, 4] -> 5
|
||||||
|
[2, 3] -> 4
|
||||||
|
[1, 1, 3] -> 3
|
||||||
|
[1, 2, 2] -> 2
|
||||||
|
[1, 1, 1, 2] -> 1
|
||||||
|
_ -> 0
|
Reference in New Issue
Block a user