Skip to content

Instantly share code, notes, and snippets.

@skatenerd
Created December 4, 2023 06:25
Show Gist options
  • Save skatenerd/b74a613aa87b5dd34163377bb2928211 to your computer and use it in GitHub Desktop.
Save skatenerd/b74a613aa87b5dd34163377bb2928211 to your computer and use it in GitHub Desktop.
AOC 2023 Day Four
{-# LANGUAGE OverloadedStrings #-}
module DayFour (module DayFour) where
import qualified Data.Text as T
import qualified Text.Read as TR
import qualified Data.Maybe as M
import qualified Data.Set as S
extractNumbers :: T.Text -> [Int]
extractNumbers text = M.catMaybes $ Prelude.map (TR.readMaybe . T.unpack) $ T.split (== ' ') text
targetNumbers card = extractNumbers firstHalf
where [firstHalf, _] = T.split (== '|') card
receivedNumbers card = extractNumbers secondHalf
where [_, secondHalf] = T.split (== '|') card
hitCount card = length intersections
where intersections = (S.fromList $ targetNumbers card) `S.intersection` (S.fromList $ receivedNumbers card)
scoreCard card
| (hitCount card) > 0 = 2 ^ ((hitCount card) - 1)
| otherwise = 0
partOne lines = sum $ map scoreCard lines
cardNumber card = head $ extractNumbers $ T.filter (/= ':') card
sampleInput :: [T.Text]
sampleInput = ["Card 1: 41 48 83 86 17 | 83 86 6 31 17 9 48 53",
"Card 2: 13 32 20 16 61 | 61 30 68 82 17 32 24 19",
"Card 3: 1 21 53 59 44 | 69 82 63 72 16 21 14 1",
"Card 4: 41 92 73 84 69 | 59 84 76 51 58 5 54 83",
"Card 5: 87 83 26 28 32 | 88 30 70 12 93 22 82 36",
"Card 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11"]
slowResolve _ [] = []
slowResolve world (current:rest) = current : (slowResolve world (rest ++ earned))
where earned = map cardAt neededCardIndices
score = hitCount current
currentCardNumber = cardNumber current
neededCardIndices = (currentCardNumber + 1) `enumFromTo` (currentCardNumber + score)
cardAt idx = world !! (idx - 1)
buildUpAnswer builtSoFar [] = builtSoFar
buildUpAnswer builtSoFar (current:rest) = buildUpAnswer newBuilt rest
where newBuilt = myScore:builtSoFar
myScore = 1 + (sum $ map (builtSoFar !!) neededCardIndices)
score = hitCount current
neededCardIndices = 0 `enumFromTo` (score - 1)
partTwo cards = sum $ buildUpAnswer [] $ reverse cards
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment