AdventOfCode/2020/07_haskell.ipynb

103 lines
2.3 KiB
Text

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"puzzle <- readFile \"07.txt\"\n",
"plines = lines puzzle"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Day 07"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Puzzle 1"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"124"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import qualified Data.List as List\n",
"import qualified Data.Map as Map\n",
"import qualified Data.Set as Set\n",
"import Data.List.Split\n",
"import Data.Maybe\n",
"\n",
"parse (x:xs) = (x, [p++\" \"++q | a <- xs, let w = words a, 2 <= length w, let (q:p:_) = reverse w])\n",
"let m = Map.fromList $ map (parse . splitOn \" bag\") plines\n",
" g = Map.fromList [(key, [k | (k,v) <- Map.toList m, key `elem` v]) | key <- List.nub $ concat $ Map.elems m]\n",
" dfs p = foldl Set.union (Set.singleton p) [dfs q | q <- fromMaybe [] $ Map.lookup p g]\n",
" in (length.dfs) \"shiny gold\" - 1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Puzzle 2"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"34862"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"parse (x:xs) = (x, [(read s,p++\" \"++q) | a <- xs, let w = words a, 3 <= length w, let (q:p:s:_) = reverse w, p/=\"no\"])\n",
"let g = Map.fromList $ map (parse . splitOn \" bag\") plines\n",
" dfs p = 1 + sum [n * dfs q | (n,q) <- fromMaybe [] $ Map.lookup p g]\n",
" in dfs \"shiny gold\" - 1"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Haskell",
"language": "haskell",
"name": "haskell"
},
"language_info": {
"codemirror_mode": "Haskell",
"file_extension": ".hs",
"mimetype": "text/x-haskell",
"name": "haskell",
"pygments_lexer": "Haskell",
"version": "8.8.4"
}
},
"nbformat": 4,
"nbformat_minor": 4
}