summaryrefslogtreecommitdiff
path: root/2023/day04/Main2.hs
blob: 7b883e81d8e5d52b75be665745656fbdc4295315 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import Data.List.Split (splitOn)

getGame :: String -> String
getGame s = tail $ dropWhile (/= ':') s

splitGame :: String -> [[String]]
splitGame s = map (\x -> filter (/= "") (splitOn [' '] x)) (splitOn ['|'] s)

calcPoints :: [(Int, Int)] -> (Int, [(Int, Int)]) -> (Int, [(Int, Int)])
calcPoints dict (num_cards, []) = (num_cards, [])
calcPoints dict (num_cards, this) = 
  let new_wins = map (\(i, w) -> take w (drop i dict)) this 
  in calcPoints dict (num_cards + length new_wins, concat new_wins)



main :: IO ()
main = do
  inputLines <- lines <$> getContents
  let games = map (\x -> splitGame (getGame x)) inputLines
  let wins = zip [1..] (map (\[w, cards] -> length (filter (\card -> elem card w) cards)) games) :: [(Int, Int)]
  -- let points = map calcPoints wins

  print (calcPoints wins (0, wins))
  -- print (wins)