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)