103 lines
2.3 KiB
Text
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
|
|
}
|