{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "{-# LANGUAGE NegativeLiterals #-}\n", "{-# LANGUAGE FlexibleContexts #-}" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, "outputs": [], "source": [ "import Text.Parsec \n", "import Text.ParserCombinators.Parsec.Number\n", "import Data.List (partition, intersect, sortBy, groupBy, sort, group, (\\\\))\n", "import qualified Data.Set as S\n", "import Data.Function (on)" ] }, { "cell_type": "code", "execution_count": 151, "metadata": {}, "outputs": [], "source": [ "import Debug.Trace" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "data Programx = Programx String Int [String]\n", " deriving (Show, Eq)\n", "\n", "name (Programx n _ _) = n \n", "weight (Programx _ w _) = w\n", "supports (Programx _ _ s) = s" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "data Treex = Treex Programx [Treex] Int deriving (Show, Eq)\n", "root (Treex p _ _) = p\n", "trees (Treex _ t _) = t\n", "tWeight (Treex _ _ w) = w" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "onlySpaces = many (oneOf \" \\t\")\n", "parens = between (string \"(\") (string \")\")\n", "sym = many lower\n", "commaSep sym = sym `sepBy` (onlySpaces *> string \",\" *> onlySpaces)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "mFile = mLine `sepBy` newline \n", "mLine = Programx <$> sym <*> (onlySpaces *> (parens int)) <*> supportsP\n", "supportsP = (onlySpaces *> (string \"->\") *> onlySpaces *> (commaSep sym)) <|> (pure [])" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "parseFile :: String -> Either ParseError [Programx]\n", "parseFile input = parse mFile \"(unknown)\" input\n", "\n", "parseLine :: String -> Either ParseError Programx\n", "parseLine input = parse mLine \"(unknown)\" input\n", "\n", "successfulParse :: Either ParseError [a] -> [a]\n", "successfulParse (Left _) = []\n", "successfulParse (Right a) = a" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Right (Programx \"kuvqhnm\" 77 [])" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "parseLine \"kuvqhnm (77)\"" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Right (Programx \"dihjv\" 2158 [\"gausx\",\"ncdmp\",\"hozgrub\"])" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "parseLine \"dihjv (2158) -> gausx, ncdmp, hozgrub\"" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "sample = \"pbga (66)\\nxhth (57)\\nebii (61)\\nhavc (66)\\nktlj (57)\\nfwft (72) -> ktlj, cntj, xhth\\nqoyq (66)\\npadx (45) -> pbga, havc, qoyq\\ntknk (41) -> ugml, padx, fwft\\njptl (61)\\nugml (68) -> gyxo, ebii, jptl\\ngyxo (61)\\ncntj (57)\"" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "-- sample = \"pbga (66)\\nxhth (57)\"" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"pbga (66)\\nxhth (57)\\nebii (61)\\nhavc (66)\\nktlj (57)\\nfwft (72) -> ktlj, cntj, xhth\\nqoyq (66)\\npadx (45) -> pbga, havc, qoyq\\ntknk (41) -> ugml, padx, fwft\\njptl (61)\\nugml (68) -> gyxo, ebii, jptl\\ngyxo (61)\\ncntj (57)\"" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "print sample" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[Programx \"pbga\" 66 [],Programx \"xhth\" 57 [],Programx \"ebii\" 61 [],Programx \"havc\" 66 [],Programx \"ktlj\" 57 [],Programx \"fwft\" 72 [\"ktlj\",\"cntj\",\"xhth\"],Programx \"qoyq\" 66 [],Programx \"padx\" 45 [\"pbga\",\"havc\",\"qoyq\"],Programx \"tknk\" 41 [\"ugml\",\"padx\",\"fwft\"],Programx \"jptl\" 61 [],Programx \"ugml\" 68 [\"gyxo\",\"ebii\",\"jptl\"],Programx \"gyxo\" 61 [],Programx \"cntj\" 57 []]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "successfulParse $ parseFile sample" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "programs :: [Programx] -> S.Set String\n", "programs = S.fromList . map name" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "fromList [\"cntj\",\"ebii\",\"fwft\",\"gyxo\",\"havc\",\"jptl\",\"ktlj\",\"padx\",\"pbga\",\"qoyq\",\"tknk\",\"ugml\",\"xhth\"]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "pr = programs $ successfulParse $ parseFile sample\n", "pr" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "supported :: [Programx] -> S.Set String\n", "supported = S.unions . map (S.fromList . supports)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "fromList [\"cntj\",\"ebii\",\"fwft\",\"gyxo\",\"havc\",\"jptl\",\"ktlj\",\"padx\",\"pbga\",\"qoyq\",\"ugml\",\"xhth\"]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "su = supported $ successfulParse $ parseFile sample\n", "su" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"tknk\"" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "print $ head $ S.elems $ S.difference pr su" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "part1 :: [Programx] -> String\n", "part1 progs = head $ S.elems $ S.difference pr su\n", " where su = supported progs\n", " pr = programs progs" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "main :: IO ()\n", "main = do \n", " text <- readFile \"../../data/advent07.txt\"\n", " let progs = successfulParse $ parseFile text\n", " print $ part1 progs" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"vtzay\"" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "main" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "makeSingletons :: [Programx] -> ([Treex], [Programx])\n", "makeSingletons programs = (trees, others)\n", " where (sPrograms, others) = partition isLeaf programs\n", " isLeaf pr = null $ supports pr\n", " trees = map makeSTree sPrograms\n", " makeSTree pr = Treex pr [] (weight pr)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "([Treex (Programx \"pbga\" 66 []) [] 66,Treex (Programx \"xhth\" 57 []) [] 57,Treex (Programx \"ebii\" 61 []) [] 61,Treex (Programx \"havc\" 66 []) [] 66,Treex (Programx \"ktlj\" 57 []) [] 57,Treex (Programx \"qoyq\" 66 []) [] 66,Treex (Programx \"jptl\" 61 []) [] 61,Treex (Programx \"gyxo\" 61 []) [] 61,Treex (Programx \"cntj\" 57 []) [] 57],[Programx \"fwft\" 72 [\"ktlj\",\"cntj\",\"xhth\"],Programx \"padx\" 45 [\"pbga\",\"havc\",\"qoyq\"],Programx \"tknk\" 41 [\"ugml\",\"padx\",\"fwft\"],Programx \"ugml\" 68 [\"gyxo\",\"ebii\",\"jptl\"]])" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "makeSingletons $ successfulParse $ parseFile sample" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [], "source": [ "makeTree :: [Treex] -> Programx -> Treex\n", "makeTree trees program = Treex program subtrees (w + (weight program))\n", " where subtrees = filter (\\t -> (name $ root t) `elem` (supports program)) trees\n", " w = sum $ map tWeight subtrees" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "addTreeLayer :: [Treex] -> [Programx] -> ([Treex], [Programx])\n", "addTreeLayer trees programs = (trees', programs')\n", " where (sPrograms, others) = partition isSupporter programs\n", " isSupporter pr = not $ null $ (supports pr) `intersect` roots\n", " roots = map (name . root) trees\n", " trees' = map (makeTree trees) sPrograms\n", " newRoots = map root trees'\n", " programs' = programs \\\\ newRoots\n" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "([Treex (Programx \"pbga\" 66 []) [] 66,Treex (Programx \"xhth\" 57 []) [] 57,Treex (Programx \"ebii\" 61 []) [] 61,Treex (Programx \"havc\" 66 []) [] 66,Treex (Programx \"ktlj\" 57 []) [] 57,Treex (Programx \"qoyq\" 66 []) [] 66,Treex (Programx \"jptl\" 61 []) [] 61,Treex (Programx \"gyxo\" 61 []) [] 61,Treex (Programx \"cntj\" 57 []) [] 57],[Programx \"fwft\" 72 [\"ktlj\",\"cntj\",\"xhth\"],Programx \"padx\" 45 [\"pbga\",\"havc\",\"qoyq\"],Programx \"tknk\" 41 [\"ugml\",\"padx\",\"fwft\"],Programx \"ugml\" 68 [\"gyxo\",\"ebii\",\"jptl\"]])" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "(leaves, others) = makeSingletons $ successfulParse $ parseFile sample\n", "(leaves, others)" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "([Treex (Programx \"fwft\" 72 [\"ktlj\",\"cntj\",\"xhth\"]) [Treex (Programx \"xhth\" 57 []) [] 57,Treex (Programx \"ktlj\" 57 []) [] 57,Treex (Programx \"cntj\" 57 []) [] 57] 243,Treex (Programx \"padx\" 45 [\"pbga\",\"havc\",\"qoyq\"]) [Treex (Programx \"pbga\" 66 []) [] 66,Treex (Programx \"havc\" 66 []) [] 66,Treex (Programx \"qoyq\" 66 []) [] 66] 243,Treex (Programx \"ugml\" 68 [\"gyxo\",\"ebii\",\"jptl\"]) [Treex (Programx \"ebii\" 61 []) [] 61,Treex (Programx \"jptl\" 61 []) [] 61,Treex (Programx \"gyxo\" 61 []) [] 61] 251],[Programx \"tknk\" 41 [\"ugml\",\"padx\",\"fwft\"]])" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "(trs, oths) = addTreeLayer leaves others\n", "(trs, oths)" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "length trs" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "length oths" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "([Treex (Programx \"tknk\" 41 [\"ugml\",\"padx\",\"fwft\"]) [Treex (Programx \"fwft\" 72 [\"ktlj\",\"cntj\",\"xhth\"]) [Treex (Programx \"xhth\" 57 []) [] 57,Treex (Programx \"ktlj\" 57 []) [] 57,Treex (Programx \"cntj\" 57 []) [] 57] 243,Treex (Programx \"padx\" 45 [\"pbga\",\"havc\",\"qoyq\"]) [Treex (Programx \"pbga\" 66 []) [] 66,Treex (Programx \"havc\" 66 []) [] 66,Treex (Programx \"qoyq\" 66 []) [] 66] 243,Treex (Programx \"ugml\" 68 [\"gyxo\",\"ebii\",\"jptl\"]) [Treex (Programx \"ebii\" 61 []) [] 61,Treex (Programx \"jptl\" 61 []) [] 61,Treex (Programx \"gyxo\" 61 []) [] 61] 251] 778],[])" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "(trs', oths') = addTreeLayer trs oths\n", "(trs', oths')" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[243,243,251]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "map tWeight trs" ] }, { "cell_type": "code", "execution_count": 173, "metadata": {}, "outputs": [], "source": [ "balancedTree :: Treex -> Bool\n", "balancedTree tr \n", " | null $ trees tr = True\n", " | otherwise = (1==) $ S.size $ S.fromList $ map tWeight $ trees tr" ] }, { "cell_type": "code", "execution_count": 174, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[True,True,True,True,True,True,True,True,True]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "map balancedTree leaves" ] }, { "cell_type": "code", "execution_count": 175, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[True,True,True]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "map balancedTree trs" ] }, { "cell_type": "code", "execution_count": 176, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[False]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "map balancedTree trs'" ] }, { "cell_type": "code", "execution_count": 177, "metadata": {}, "outputs": [], "source": [ "treesByWeight :: Treex -> [Treex]\n", "treesByWeight = sortBy (compare `on` tWeight) . trees" ] }, { "cell_type": "code", "execution_count": 178, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[243,243,251]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "map tWeight $ treesByWeight $ head trs'" ] }, { "cell_type": "code", "execution_count": 179, "metadata": {}, "outputs": [], "source": [ "oddWeight :: Treex -> Int\n", "oddWeight = tWeight . head . head .filter (\\g -> length g == 1) . groupBy ((==) `on` tWeight) . trees" ] }, { "cell_type": "code", "execution_count": 180, "metadata": {}, "outputs": [], "source": [ "oddWeight :: Treex -> Int\n", "oddWeight = head . head .filter (\\g -> length g == 1) . group . sort . map tWeight . trees" ] }, { "cell_type": "code", "execution_count": 181, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "251" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "oddWeight $ head trs'" ] }, { "cell_type": "code", "execution_count": 182, "metadata": {}, "outputs": [], "source": [ "-- oddMajorityWeight :: Treex -> (Int, Int)\n", "oddMajorityWeight = extractWeights . oddMajority . groups\n", " where groups = group . sort . map tWeight . trees\n", " oddMajority = partition (\\g -> length g == 1)\n", " extractWeights (o, m) = (head $ head o, head $ head m)" ] }, { "cell_type": "code", "execution_count": 183, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(251,243)" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "oddMajorityWeight $ head trs'" ] }, { "cell_type": "code", "execution_count": 184, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "68" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "weight $ root $ head $ filter (\\t -> tWeight t == 251) $ trees $ head trs' " ] }, { "cell_type": "code", "execution_count": 185, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "60" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "68 - 251 + 243" ] }, { "cell_type": "code", "execution_count": 202, "metadata": {}, "outputs": [], "source": [ "checkTrees :: ([Treex], [Programx]) -> Int\n", "checkTrees (partTrees, programs) =\n", " if all balancedTree partTrees\n", " then trace (show $ length partTrees) checkTrees $ addTreeLayer partTrees programs\n", " else \n", " oddTreeWeight - oddWeight + majorityWeight\n", " where \n", " unbalancedTree = head $ filter (not . balancedTree) partTrees\n", " (oddWeight, majorityWeight) = oddMajorityWeight unbalancedTree\n", " unbalancedSubtrees = trees unbalancedTree\n", " oddTreeWeight = weight $ root $ head $ filter (\\t -> tWeight t == oddWeight) $ trees unbalancedTree" ] }, { "cell_type": "code", "execution_count": 188, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Treex (Programx \"tknk\" 41 [\"ugml\",\"padx\",\"fwft\"]) [Treex (Programx \"fwft\" 72 [\"ktlj\",\"cntj\",\"xhth\"]) [Treex (Programx \"xhth\" 57 []) [] 57,Treex (Programx \"ktlj\" 57 []) [] 57,Treex (Programx \"cntj\" 57 []) [] 57] 243,Treex (Programx \"padx\" 45 [\"pbga\",\"havc\",\"qoyq\"]) [Treex (Programx \"pbga\" 66 []) [] 66,Treex (Programx \"havc\" 66 []) [] 66,Treex (Programx \"qoyq\" 66 []) [] 66] 243,Treex (Programx \"ugml\" 68 [\"gyxo\",\"ebii\",\"jptl\"]) [Treex (Programx \"ebii\" 61 []) [] 61,Treex (Programx \"jptl\" 61 []) [] 61,Treex (Programx \"gyxo\" 61 []) [] 61] 251] 778" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ubt = head $ filter (not . balancedTree) trs'\n", "ubt" ] }, { "cell_type": "code", "execution_count": 189, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[Treex (Programx \"fwft\" 72 [\"ktlj\",\"cntj\",\"xhth\"]) [Treex (Programx \"xhth\" 57 []) [] 57,Treex (Programx \"ktlj\" 57 []) [] 57,Treex (Programx \"cntj\" 57 []) [] 57] 243,Treex (Programx \"padx\" 45 [\"pbga\",\"havc\",\"qoyq\"]) [Treex (Programx \"pbga\" 66 []) [] 66,Treex (Programx \"havc\" 66 []) [] 66,Treex (Programx \"qoyq\" 66 []) [] 66] 243,Treex (Programx \"ugml\" 68 [\"gyxo\",\"ebii\",\"jptl\"]) [Treex (Programx \"ebii\" 61 []) [] 61,Treex (Programx \"jptl\" 61 []) [] 61,Treex (Programx \"gyxo\" 61 []) [] 61] 251]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "trees ubt" ] }, { "cell_type": "code", "execution_count": 238, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "([Treex (Programx \"pbga\" 66 []) [] 66,Treex (Programx \"xhth\" 57 []) [] 57,Treex (Programx \"ebii\" 61 []) [] 61,Treex (Programx \"havc\" 66 []) [] 66,Treex (Programx \"ktlj\" 57 []) [] 57,Treex (Programx \"qoyq\" 66 []) [] 66,Treex (Programx \"jptl\" 61 []) [] 61,Treex (Programx \"gyxo\" 61 []) [] 61,Treex (Programx \"cntj\" 57 []) [] 57],[Programx \"fwft\" 72 [\"ktlj\",\"cntj\",\"xhth\"],Programx \"padx\" 45 [\"pbga\",\"havc\",\"qoyq\"],Programx \"tknk\" 41 [\"ugml\",\"padx\",\"fwft\"],Programx \"ugml\" 68 [\"gyxo\",\"ebii\",\"jptl\"]])" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sglPrs = makeSingletons $ successfulParse $ parseFile sample\n", "sglPrs" ] }, { "cell_type": "code", "execution_count": 239, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[Treex (Programx \"pbga\" 66 []) [] 66,Treex (Programx \"xhth\" 57 []) [] 57,Treex (Programx \"ebii\" 61 []) [] 61,Treex (Programx \"havc\" 66 []) [] 66,Treex (Programx \"ktlj\" 57 []) [] 57,Treex (Programx \"qoyq\" 66 []) [] 66,Treex (Programx \"jptl\" 61 []) [] 61,Treex (Programx \"gyxo\" 61 []) [] 61,Treex (Programx \"cntj\" 57 []) [] 57]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fst sglPrs" ] }, { "cell_type": "code", "execution_count": 240, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "60" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "checkTrees sglPrs" ] }, { "cell_type": "code", "execution_count": 242, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "all balancedTree leaves" ] }, { "cell_type": "code", "execution_count": 243, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[Treex (Programx \"pbga\" 66 []) [] 66,Treex (Programx \"xhth\" 57 []) [] 57,Treex (Programx \"ebii\" 61 []) [] 61,Treex (Programx \"havc\" 66 []) [] 66,Treex (Programx \"ktlj\" 57 []) [] 57,Treex (Programx \"qoyq\" 66 []) [] 66,Treex (Programx \"jptl\" 61 []) [] 61,Treex (Programx \"gyxo\" 61 []) [] 61,Treex (Programx \"cntj\" 57 []) [] 57]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "leaves" ] }, { "cell_type": "code", "execution_count": 244, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "balancedTree $ head leaves" ] }, { "cell_type": "code", "execution_count": 245, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Treex (Programx \"pbga\" 66 []) [] 66" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "head leaves" ] }, { "cell_type": "code", "execution_count": 246, "metadata": {}, "outputs": [], "source": [ "-- part2 :: [Programx] -> Int\n", "part2 = checkTrees . makeSingletons \n", "-- part2 prs = all balancedTree $ fst $ addTreeLayer ts os\n", "-- where (ts, os) = makeSingletons prs" ] }, { "cell_type": "code", "execution_count": 247, "metadata": {}, "outputs": [], "source": [ "main :: IO ()\n", "main = do \n", " text <- readFile \"../../data/advent07.txt\"\n", " let progs = successfulParse $ parseFile text\n", "-- print $ part1 progs\n", " print $ part2 progs" ] }, { "cell_type": "code", "execution_count": 248, "metadata": {}, "outputs": [ { "data": { "text/html": [ "Prelude.head: empty list" ], "text/plain": [ "Prelude.head: empty list" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "main" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Haskell", "language": "haskell", "name": "haskell" }, "language_info": { "codemirror_mode": "ihaskell", "file_extension": ".hs", "name": "haskell", "version": "8.0.2" } }, "nbformat": 4, "nbformat_minor": 2 }